No mês passado, peguei emprestados muitos livros da biblioteca. Todos eram bons livros, cheios de emoções e reviravoltas na trama. Infelizmente, em alguns momentos fiquei muito zangado / triste / decepcionado, por isso rasguei algumas páginas.
Agora a biblioteca quer saber quantas páginas eu rasguei para cada livro.
Seu objetivo é escrever um programa, que use uma lista de números ordenada e delimitada por vírgulas como entrada e imprima a contagem mínima e máxima possível de páginas que eu poderia ter arrancado. Cada linha representa um livro, cada número representa uma página ausente do livro.
Exemplo de entrada:
7,8,100,101,222,223
2,3,88,89,90,103,177
2,3,6,7,10,11
1
1,2
Exemplo de saída:
4/5
5/6
3/6
1/1
1/2
4/5
significa que eu posso ter rasgado 4 ou 5 páginas, dependendo de qual lado a numeração das páginas do livro começa. Alguém poderia ter arrancado as páginas 6/7, 8/9, 100/101 e 222/223 (4 páginas). Como alternativa, alguém poderia ter arrancado as páginas 7/8, página 99/100, página 101/102, página 221/222 e página 223/224 (5 páginas).
Lembre-se de que uma página de livro sempre tem uma frente e um verso. Além disso, a numeração das páginas difere de livro para livro. Alguns livros têm números pares de páginas na página esquerda; alguns na página certa. Todos os livros são lidos da esquerda para a direita.
O código mais curto em bytes vence. Formato estrito de E / S não é necessário. Seus programas devem poder receber um ou mais livros como entrada. Diverta-se.
4/5
e5/4
) #min/max
ou totalmentemax/min
. (Embora, pessoalmente, eu prefiro que não seja parte da especificação!)programs must be able to take one or more books as input
governar? A maioria (se não todos) apenas quebra o código para verificar um único livro em um loop ou algo assim. IMHO, basta adicionar uma sobrecarga à resposta com pouco ou nenhum ganho para o desafio. Como essas perguntas já têm muitas respostas, é melhor manter isso como está, mas lembre-se disso para os desafios futuros.1,3,5,7,9,11,13,15,17,18
- para o benefício de idiomas cujosort
método embutido classifica lexicograficamente por padrão (assumindo que o requisito de saída consistentemente classificada seja adicionado à especificação).Respostas:
05AB1E , 13 bytes
Experimente online!
Obrigado a Emigna pelo aviso sobre alterações nas especificações.
Explicação
fonte
Python 2 ,
72566867 bytesExperimente online!
fonte
JavaScript,
104939285807974 bytesSeriam 57 bytes, se não fosse o requisito desnecessário (na minha opinião) de que cada par de números na saída seja classificado de maneira consistente, ou 47 bytes, se precisássemos usar apenas um livro como entrada.
Entrada e saída são uma matriz de matrizes.
Casos de teste
Os casos de teste são divididos em livros individuais para melhor legibilidade, com o último caso (que inclui o
[1,2]
caso extremo) servindo para ilustrar que esta solução suporta vários livros na entrada.História
Mostrar snippet de código
fonte
[1,3,5,7,9,11,13,15,17,18]
.[0,.5]
vez de usarg
quando vi seu comentário. Não sei por que tenho um bloqueio mental com operadores bit a bit! Eu esperava que a classificação da saída não se tornasse um requisito e que ninguém notasse a minha quebrasort()
nesse meio tempo;). Precisando fazer algum trabalho, voltaremos em breve para atualizar.y/2
? Qual é o motivo de dividir o número da página pela metade para esse algoritmo?Retina 0.8.2 , 60 bytes
Experimente online! Explicação:
Converta os números de página em unário.
Duplique a lista, interpondo a
/
.Incremente os números de página em uma cópia da lista.
Conte o número de páginas, mas os números pares e ímpares consecutivos contam apenas como uma página.
Classifique as contagens em ordem.
Converta as contagens novamente em decimal.
fonte
,(?=.*/)¶1,
ser algo como isso,.*/¶1$&
?Haskell , 62 bytes
Experimente online!
fonte
Your goal is to write a program, which takes a sorted, comma-delimmited list of numbers as input
)Java (OpenJDK 9) , 163 bytes
Experimente online!
Explicações
Nota: como não há requisitos, os números mínimo e máximo de páginas não são solicitados.
fonte
size
comadd
em Java para talvez economizar alguns bytes? por exemplos.add(p/2).size
,.APL (Dyalog Unicode) , 37 bytes
Experimente online!
Isso pode ser feito por menos da metade da contagem de bytes, se a ordem de saída das páginas não for importante:
Quão?
fonte
Perl 5 , 95 + 1 (
-a
) = 96 bytesExperimente online!
fonte
Wolfram Language (Mathematica) , 37 bytes
Obrigado @MartinEnder por 8 bytes!
Experimente online!
Explicação
Em:
{3, 4, 5}
Tome (entrada) e (entrada + 1).
{{3, 4, 5}, {4, 5, 6}}
Para cada número acima, pegue o maior número par menos.
{{2, 4, 4}, {4, 4, 6}}
Para cada lista acima, divida a lista pelos mesmos elementos
{{{2}, {4, 4}}, {{4, 4}, {6}}}
e tome o comprimento de cada um:
{2, 2}
Classifique a saída.
fonte
SplitBy
:Length@Split@⌊#/2⌋&/@{#,#+1}&
funciona. Mas então é ainda mais curto para fazer o piso antes do mapa:Length@*Split/@⌊{#,#+1}/2⌋&
. E se quiser, você pode obter a mesma contagem de bytes sem Unicode:Length@*Split/@{#,#+1}~Floor~2&
Limpo ,
222210204196 bytesExperimente online!
Os requisitos do programa completo assassinam absolutamente a capacidade de Clean de competir.
Para aqueles que prestaram atenção às minhas respostas no Clean, você notará
import qualified
que é um truque feio para se locomover usando módulos que não devem ser usados juntos, juntos - o que é necessário aqui apenas por causa de outro truque feio para fazer comGenLib
dependendo de emData.Maybe
vez deStdMaybe
, que é o resultado de mais um truque feio nas bibliotecas traduzidas do Haskell'sData
para obter funcionalidade antes que as próprias bibliotecas do Clean sejam igualmente concluídas.Recebe entrada por meio de argumentos da linha de comando.
fonte
Perl, 40 bytes
Inludes
+1
paraa
A saída não está ordenada.
Assume números de página positivos (especialmente nenhuma página
0
). Assume que as páginas ausentes são mencionadas apenas uma vez. Não se importa se a entrada está ordenada ou não.O processamento de apenas um livro por execução salva
3
bytes para37
:fonte