Usando uma linguagem de programação, escreva 5 programas de linha única, cada um com uma linha diferente do primeiro verso da música " Coconut ", de Harry Nilsson, em 1972, quando executada individualmente:
O irmão comprou um coco, ele comprou por um centavo
A irmã dele teve outro, ela pagou por um limão
Ela colocou o limão no coco, ela bebeu os dois
Ela colocou o limão no coco, ela bebeu os dois
Ela coloque o limão no coco, ela bebeu os dois
( letra completa )
As últimas 3 linhas têm a mesma letra, então seus últimos 3 programas também podem ser.
Existem 5 fatores ou 120 maneiras pelas quais esses 5 programas de linha única podem ser organizados um por linha em um único programa de 5 linhas. Você deve otimizar seus programas de linha única para que, para o maior número possível de 120 combinações, o programa de 5 linhas produza o verso inteiro na ordem correta , exatamente como aparece acima.
Exemplo
A resposta mais simples teria 5 declarações de impressão de linha única, as 3 últimas idênticas:
print('Brother bought a coconut, he bought it for a dime')
print('His sister had another one, she paid it for a lime')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
A saída para os programas de 5 linhas será o verso em sua ordem correta, desde que os dois primeiros liners individuais estejam em seus lugares corretos. Somente 6 dos 120 arranjos possíveis conseguem isso.
Pontuação
A finalização com os casos mais úteis de todas as 120 vitórias. O desempatador vai para o conjunto de programas com a menor contagem cumulativa de bytes (novas linhas não contadas). O exemplo tem 309 bytes.
Detalhes
Seus programas podem não ler seu próprio código-fonte. Nem devem ler outros arquivos externos ou exigir uma conexão de rede.
Saída para stdout ou alternativa mais próxima. Você também pode enviar para um arquivo com o nome de sua escolha.
"Programas de linha única" são cadeias que contêm caracteres, exceto terminadores de linha (você provavelmente precisará se preocupar com novas linhas).
Ao compor os liners únicos nos 5 liners, você deve adicionar exatamente 4 novas linhas, uma entre cada par adjacente. Opcionalmente, você pode adicionar uma nova linha à direita.
fonte
main
método? Então, qual deve ser executado, ao executar o programa?main
.Respostas:
CJam, 120 permutações válidas,
334 299290 bytesLógica bastante simples:
ATUALIZAÇÃO : Acontece que você não precisa do ciclo de empacotamento / desempacotamento após os três similares e que aparecem nas linhas finais da música. Eu posso explicar por que, se não é tão aparente :)
fonte
Prelúdio , 120 permutações,
20452035 bytesIsso finalmente me convenceu de que Prelude e CJam precisam de um filho. Se não fosse o conjunto de instruções muito limitado do Prelude, essa submissão seria realmente muito competitiva, se não vencesse o CJam.
A ideia básica é a seguinte
No prelúdio, cada linha é sua própria "voz" com sua própria pilha, e essas vozes são executadas em paralelo. Ou seja, no programa completo, cada linha construirá a string individualmente e a imprimirá no final. Porém, devido aos desvios das instruções de impressão, a ordem das linhas não importa de maneira alguma para a ordem da saída, pois a execução é da esquerda para a direita, não de cima para baixo.
Agora, por que as linhas são tão longas? O prelúdio armazena apenas números em sua pilha. Além disso, ele só pode pressionar um número de um dígito de cada vez; portanto, números maiores precisam ser construídos a partir de adição e subtração (não há multiplicação nem aritmética). Portanto, a maior parte do código é simplesmente calcular e enviar os códigos de caracteres certos. Para encurtar um pouco, eu os compenso
96
. No final, para imprimir, faço um loop até a pilha ficar vazia (ou seja, a0
é encontrada), adiciono 96 a cada número e imprimo.Observe que as strings são pressionadas ao contrário, pois são impressas do último ao primeiro caractere.
Isso pressupõe o interpretador Python com
NUMERIC_OUTPUT = False
(que é como a especificação define E / S).Eu usei o seguinte código CJam para gerar a construção da string:
Por fim, apenas por diversão, por que acho que isso seria muito curto se o Prelude tivesse um conceito de strings:
Agora, as instruções de impressão
!
já estão na ordem certa, então nem preciso compensá-las. Acho que vou começar a implementar isso algum tempo.fonte
Ruby, 120 permutações válidas, 430 bytes
Funciona em qualquer ordem ou individualmente. Cada linha modifica o estado global e define um gancho para ser executado no final do programa, a menos que o gancho já tenha sido definido.
fonte
> <> , 120 permutações, 703 bytes
A restrição de uma linha era bastante difícil para uma linguagem 2D, então eu tive que encontrar uma maneira de aproveitar ao máximo as
.
instruções de teleporte.A inicial
<
faz o programa fluir para a esquerda, contornando e executandoEsta é uma série de
p
instruções (colocadas) que coloca caracteres até que o quadro fique assim:O
#.!50
programa então vira o fluxo de volta para a direita novamente, antes de pular para a linha 5. O que se segue é o seguinte:/
espelho na linha 5, encontra a letra 5, que é empurrada para a pilha. Em seguida, teleportamos para a linha 6./
espelho na linha 6, encontra a letra 4, que é empurrada para a pilha. Em seguida, teleportamos para a linha 7./
espelho na linha 7 encontra a letra 3 ...Isso acontece até pressionarmos a letra 1, quando teletransportamos para a linha 10. Este é um loop para imprimir a pilha inteira até que ela esteja vazia.
Se apenas uma linha do programa estiver presente, os
\
espelhos farão o mesmo trabalho que os teleports em cada linha de letra.Se o programa for embaralhado, a explicação acima ainda se aplica, portanto o programa funciona para todas as permutações!
fonte