Ponga la línea en el código que está loco y sacúdalo todo

10

Usando un lenguaje de programación, escriba 5 programas de una sola línea, cada uno de los cuales genera una línea diferente del primer verso de la canción de 1972 de Harry Nilsson " Coconut " cuando se ejecuta individualmente:

Hermano compró un coco, lo compró por un centavo.
Su hermana tenía otro, ella lo pagó por una lima
. Puso la lima en el coco, se los bebió a los dos
. Puso la lima en el coco, se los bebió a los dos.
Ella puso la lima en el coco, ella los bebió a ambos

( letra completa )

Las últimas 3 líneas tienen la misma letra, por lo que sus últimos 3 programas también podrían serlo.

Hay 5 factores o 120 formas en que estos 5 programas de una sola línea se pueden organizar uno por línea en un solo programa de 5 líneas. Debe optimizar sus programas de una sola línea de modo que para la mayor cantidad posible de estas 120 combinaciones, el programa de 5 líneas muestre todo el verso en su orden correcto , exactamente como aparece arriba.

Ejemplo

La respuesta más simple tendría 5 declaraciones de impresión de una sola línea, las últimas 3 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')

La salida a los programas de 5 líneas será el verso en su orden correcto siempre que los dos primeros trazos estén en sus lugares correctos. Solo 6 de los 120 arreglos posibles logran esto.

Puntuación

La presentación con la mayoría de los casos de trabajo de todas las 120 victorias. El desempate se dirige al conjunto de programas con el recuento de bytes acumulativo más bajo (no se cuentan las nuevas líneas). El ejemplo tiene 309 bytes.

Detalles

  • Es posible que sus programas no lean su propio código fuente. Tampoco deberían leer otros archivos externos o requerir una conexión de red.

  • Salida a stdout o alternativa más cercana. También puede enviar a un archivo con el nombre que elija.

  • Los "programas de una sola línea" son cadenas que contienen caracteres, excepto los terminadores de línea (probablemente solo deba preocuparse por las nuevas líneas).

  • Al componer las líneas simples en las líneas 5, debe agregar exactamente 4 líneas nuevas, una entre cada par adyacente de líneas simples. Opcionalmente, puede agregar una nueva línea final.

Pasatiempos de Calvin
fuente
"Escribir 5 programas, cada uno con una línea diferente ..." ¿no es eso imposible?
feersum
@feersum Las líneas son diferentes. Tres de ellos tienen el mismo texto.
Calvin's Hobbies
¿Qué sucede si tengo un archivo Java que contiene 5 clases, cada una con un mainmétodo? Entonces, ¿cuál debe ejecutarse al ejecutar el programa?
fiesta
@feersum Bueno, ¿qué hace tu compilador? No estoy seguro de qué hace Java cuando varias clases en el mismo archivo tienen ambas main.
Aficiones de Calvin
2
La forma en que recuerdo este es ese anuncio de Coca-Cola donde "pusieron la lima en la Coca-Cola" ...
Joe Z.

Respuestas:

9

CJam, 120 permutaciones válidas, 334 299 290 bytes

"She put the lime in the coconut, she drank them both up"N+
"Brother bought a coconut, he bought it for a dime"N+]$~
"She put the lime in the coconut, she drank them both up"N+
"His sister had another one, she paid it for a lime"N+]$~
"She put the lime in the coconut, she drank them both up"N+

Lógica bastante simple:

  • Ponga cada línea de la canción en cada uno de los 5 programas.
  • Envuelva todo en la pila en una matriz
  • Ordenar la matriz
  • Desenvuelva la matriz para que el siguiente programa pueda usar la misma lógica
  • En cada paso, tenemos las letras parciales en una matriz. Afortunadamente, ordenar la matriz da el orden correcto de las letras.

ACTUALIZACIÓN : Resulta que no necesita el ciclo de envolver-ordenar-desenvolver después de los 3 similares y que aparecen en las líneas finales de la canción. Puedo explicar por qué si no es tan aparente :)

Optimizador
fuente
8

Preludio , 120 permutaciones, 2045 2035 bytes

9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                          (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+9409-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-5809-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-99+58992++96+99+09-9-9-3-                                             (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                 (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+993+09-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-49197+09-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-595+96+09-9-9-9-9-9-9-1-99+58992++96+95+109-9-9-9-9-9-9-1-41809-9-9-9-9-9-9-1-99+5992++991++9991++09-9-9-9-9-9-9-1-991++909-9-6-                                                           (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                                                   (9+9+9+9+9+9+9+9+9+9+6+!)

Esto finalmente me ha convencido de que Prelude y CJam necesitan un hijo. Si no fuera por el conjunto de instrucciones muy limitado de Prelude, esta presentación en realidad sería muy competitiva, si ni siquiera superara a CJam.

La idea básica es la siguiente.

"push line 4"               print
"push line 1"print
"push line 3"          print
"push line 2"     print
"push line 5"                    print

En Prelude, cada línea es su propia "voz" con su propia pila, y estas voces se ejecutan en paralelo. Es decir, en el programa completo, cada línea construirá individualmente la cadena y al imprimirla al final. Pero debido a los desplazamientos de las declaraciones de impresión, el orden de las líneas no importa en absoluto para el orden de la salida, ya que la ejecución es de izquierda a derecha, no de arriba a abajo.

Ahora, ¿por qué las líneas son tan largas? Prelude solo almacena números en su pila. Además, solo puede empujar un número de un solo dígito a la vez, por lo que se deben construir números más grandes a partir de la suma y la resta (tampoco hay multiplicación u otra aritmética). Entonces, la mayor parte del código es simplemente calcular y empujar los códigos de caracteres correctos. Para acortar esto un poco, los compensé 96. Al final, para imprimir, hago un bucle hasta que la pila esté vacía (es decir, 0se encuentra un a), agrego 96 a cada número e imprimo.

Tenga en cuenta que las cadenas se empujan hacia atrás, ya que se imprimen del último al primer carácter.

Esto supone el intérprete de Python con NUMERIC_OUTPUT = False(que es cómo la especificación define E / S).

Usé el siguiente código CJam para generar la construcción de la cadena:

"Brother bought a coconut, he bought it for a dime
"W%{i96-_0<{zLa*9/:,'-*'-+0\+}{La*9/:,_,'+*W<}?}%

Por último, solo por diversión, por qué creo que esto sería realmente corto si Prelude tuviera un concepto de cadenas:

"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emid a rof ti thguob eh ,tunococ a thguob rehtorB"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emil a rof ti diap ehs ,eno rehtona dah retsis siH"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!

Ahora las declaraciones de impresión !ya están en el orden correcto, por lo que ni siquiera necesitaría compensarlas. Creo que me pondré a implementar esto en algún momento.

Martin Ender
fuente
7

Ruby, 120 permutaciones válidas, 430 bytes

$*[1]='His sister had another one, she paid it for a lime';a||=at_exit{puts($*-[p])}
$*[0]='Brother bought a coconut, he bought it for a dime';a||=at_exit{puts($*)}
$*[2]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[3]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[4]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}

Funciona en cualquier orden, o individualmente. Cada línea modifica el estado global, luego establece un enlace que se ejecutará al final del programa a menos que el enlace ya se haya establecido.

histocrat
fuente
La pregunta dice "5 programas de línea única". ¿No significa esto que cada línea debe estar en un programa separado? No todo en uno?
bacchusbeale
1
Solo una cuestión de formateo. Cada línea funciona como su propio programa.
histocrat
6

> <> , 120 permutaciones, 703 bytes

<    /a"emid a rof ti thguob eh ,tunococ a thguob rehtorB"0a.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<   / a"emil a rof ti diap ehs ,eno rehtona dah retsis siH"09.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<  /  a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"08.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
< /   a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"07.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
</    a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"06.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"

La restricción de una línea fue bastante difícil para un lenguaje 2D, así que tuve que encontrar la manera de aprovechar al máximo la .instrucción de teletransporte.

La inicial <hace que el programa fluya hacia la izquierda, envolviendo y ejecutando

"o;?=0l>\\\\\\/////"15p26p37p48p59p75p76p77p78p79p7ap8ap9apaapbapcapdap

Esta es una serie de pinstrucciones (put) que colocan caracteres hasta que el tablero se ve así:

<    /<lyrics1>0a.#.!50<blah>
<   / <lyrics2>09.#.!50<blah>
<  /  <lyrics3>08.#.!50<blah>
< /   <lyrics4>07.#.!50<blah>
</    <lyrics5>06.#.!50<blah>
 /     \
  /    \
   /   \
    /  \
     / \
       >l0=?;o

El #.!50entonces se invierte de nuevo el flujo del programa a la derecha de nuevo, antes de saltar a la línea 5. Lo que sigue es el siguiente:

  • Siguiendo el /espejo en la línea 5 encuentra la letra 5, que se empuja a la pila. Luego nos teletransportamos a la línea 6.
  • Siguiendo el /espejo en la línea 6 encuentra la letra 4, que se empuja a la pila. Luego nos teletransportamos a la línea 7.
  • Siguiendo el /espejo en la línea 7 encuentra la letra 3 ...

Esto sucede hasta que empujamos la letra 1, en cuyo punto nos teletransportamos a la línea 10. Este es un ciclo para imprimir toda la pila hasta que esté vacía.

Si solo está presente una línea del programa, los \espejos hacen el mismo trabajo que los teletransportes en cada línea lírica.

Si el programa está codificado, entonces la explicación anterior aún se aplica, por lo que el programa funciona para todas las permutaciones.

Sp3000
fuente