Tin, marín, de dos pingüés

11

Introducción

La canción de la infancia Eeny, meeny, miny, moe se usaba a menudo para seleccionar quién era "eso" cuando jugaba al tag. Todos se pararían en círculo y señalarían a una persona seleccionada al azar. Ellos cantaban:

Eeny, meeny, miny, moe,
atrapa un tigre por la punta del pie.
Si él grita, déjalo ir,
Eeny, meeny, miny, moe.

Mientras cantaban cada palabra, señalaban a la siguiente persona en el círculo. La persona a la que se señaló cuando se cantó el "moe" final sería "eso". Los niños se levantarían inmediatamente y se dispersarían.

Objetivo

Implemente el programa más corto en bytes que toma una entrada, el número de hijos y enumera las palabras que se cantaron cuando se señalaban.

El ganador será seleccionado en una semana.

Entrada

De STDIN, un número entero positivo, el número de hijos. Esto puede ser más que el número de palabras en la canción.

Salida

Escribe en STDOUT una lista donde cada línea representa a un niño y contiene la palabra cantada mientras se señalaba. Si hay demasiados hijos, se pueden omitir líneas vacías.

Requisitos

  • Siempre comienza con el primer hijo.
  • Muestra las palabras sin puntuación.
  • El "moe" final debe enfatizarse como "MOE". incluyendo puntuación.

Ejemplo

Entrada

3

Salida

Eeny moe tiger toe hollers go miny
meeny Catch by If let Eeny MOE!
miny a the he him meeny

Entrada

7

Salida

Eeny by him
meeny the go
miny toe Eeny
moe If meeny
Catch he miny
a hollers MOE!
tiger let

Entrada

1

Salida

Eeny meeny miny moe Catch a tiger by the toe If he hollers let him go Eeny meeny miny MOE!

Entrada

21

Salida

Eeny
meeny
miny
moe
Catch
a
tiger
by
the
toe
If
he
hollers
let
him
go
Eeny
meeny
miny
MOE!
Hand-E-Food
fuente
1
¿La entrada será alguna vez mayor que la cantidad de palabras presentes?
Pomo de la puerta
77
¿Deberían "captar un" y "si él" y "por su" / "por el" deben tratarse como dos palabras o una? En la canción, solo cuentan como un "punto"
OldBunny2800
44
Siempre terminamos con "Mi ... madre ... dijo ... elegir ... el ... mejor ... mejor ... uno ... y ... tú ... eres ... ...¡ESO!" Eso sería un buen bono. Por supuesto, los tramposos siempre arrastrados a cabo el "tú" y el "son" por varias personas ...
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot NOOO (voz de Darth Vader)! Me robaste la línea. Literalmente, inicié sesión en PPCG solo para escribir eso, ya que lo he estado pensando durante los últimos dos días desde que vi esto.
Ashwin Gupta
1
Hecho no tan divertido: Tiger solía ser la palabra N.
DanTheMan

Respuestas:

5

TeaScript , 82 bytes

D`${a="Ey Ú9y ·ny "}¶e C® a g by e e If  Ò@s ¤t m go ${a}MOE!`q.KαtΣj═)j╝

Descomprimir, fragmentar, transponer, unir, salida.

Explicación

              // Implicit: x = input
D`...blah...` // Decompress "Eeny miny moe..."
q             // Split
Kα            // chunk into x-size blocks (α == x)
t             // Transpose
Σ             // Loop through lines
j═)             // Join with spaces
j╝            // Join with newline

Pruébalo en línea


81 bytes no competitivos

El αno estaba encadenado, .así que tuve que arreglar esto

D`${a="Ey Ú9y ·ny "}¶e C® a g by e e If  Ò@s ¤t m go ${a}MOE!`qKαtΣj═)j╝
Downgoat
fuente
6

Pyth, 103 89 84 caracteres

Se guardaron 18 bytes con compresión de cadena, gracias a @Dennis y @FryAmTheEggman. Se guardó
otro byte gracias a @isaacg.

Advertencia: hay muchos no imprimibles en el código; usa los enlaces a continuación para probarlo.

VQjd%Q>cs[J."@y)òÎ5O¹c×Ú"."@yæ\J}ÇZH66¥ÓÀD¸¶=ðÉ §J%ÔþÖúÅ="J"MOE!")\@N

Pruébalo en línea | Banco de pruebas

Probablemente podría jugar al golf. Sugerencias bienvenidas!

Cómo funciona

VQjd%Q>cs[J."..."."..."J"MOE!")\@N    Implicit: Q = eval(input)
VQ                                    For each item N in range 0...int(Q):
         [                    )        Create an array out of the following:
          J."..."                       Set J to this string, decompressed. ("Eeny@meeny@miny@")
                 ."..."                 This string, decompressed. ("moe@[email protected]@him@go@")
                       J                J.
                        "MOE!"          "MOE!".
        s                              Join the array with the empty string.
       c                       \@      Split the result on "@".
      >                          N     Cut off the first N items.
    %Q                                 Take every Qth item.
  jd                                   Join with spaces.
ETHproductions
fuente
Reutilizar de Eeny meeny minyalguna manera debería ahorrar algunos bytes. Además, Pyth tiene dos funciones integradas para (des) compresión ( .Zy .").
Dennis
@ Dennis Gracias, ¡ ."ahorra 14 bytes!
ETHproductions
¿Pyth usa UTF-8 o algo más? Esto es 89 caracteres pero 123 bytes
Downgoat
@ Doᴡɴɢᴏᴀᴛ Pyth usa ISO 8859-1 de forma predeterminada, por lo que cada carácter es exactamente un byte.
Dennis
FNQ== VQ, por cierto.
isaacg
5

Jalea, 84 bytes

“£Dṡ“Ṙ©“Ė“¡Ḳ⁵“=U“¡Ẹ⁵“¡Ṇm“ȯf“ŀQ“ÞṖċ¥“ṅ_“Ẉ1“¡æḷ“¡ƒmxĠ“¡ṇƭEỤr“¡Þ¦»ṫ-2;;“MOE!”W¤sƓZj€⁶j⁷

Pruébalo en línea!

Dennis
fuente
44
Comprimir la cuerda a mano fue ... entretenido. La puntuación sería mucho mejor si Jelly tuviera una división en la función de sucesos .
Dennis
5

JavaScript (ES6), 167 bytes

l=Array(n=+prompt()).fill``;`${s=`Eeny meeny miny `}moe Catch a tiger by the toe If he hollers let him go ${s}MOE!`.split` `.map((w,i)=>l[i%n]+=w+` `);alert(l.join`
`)

Explicación

l=Array(              // l = array of lines
  n=+prompt()         // n = input number
).fill``;             // initialise l as empty strings

`${s=`Eeny meeny miny `}moe Catch a tiger by the toe If he hollers let him go ${s}MOE!`

.split` `.map((w,i)=> // for each word w
  l[i%n]+=w+` `       // add it to the lines
);
alert(l.join`
`)                    // output the lines
usuario81655
fuente
¿ l=Array(n).fill`` No funciona por alguna razón?
ETHproductions
@ETHproductions Funciona. Olvidé acortarlo de alguna manera jaja! Gracias.
user81655
@ user81655 Me encantan las ventanas JS prompt (). Son muy divertidos. (Sé que suena loco, pero quiero decir en comparación con la consola de cualquier otro idioma. Expresión de tipo de impresión equivalente)
Ashwin Gupta
4

Haskell, 160 157 bytes

import Data.Lists
unlines.map unwords.transpose.(`chunksOf`(["moe Catch a tiger by the toe If he hollers let him go","MOE!"]>>=words.("Eeny meeny miny "++)))

Anteponga "Eeny meeny miny "a las otras partes ( "moe Catch ..."y "MOE!"), concatene ambas cadenas, divida en palabras, tome trozos del tamaño requerido, transponga y concatene nuevamente en una sola cadena.

@Mauris encontró 3 bytes factorizando la subcadena común "Eeny meeny miny" y haciendo que no ftenga ningún punto.

nimi
fuente
Quizás s="Eeny meeny miny "guarda algunos bytes.
Lynn
@Mauris: Lo intenté, pero fue más largo.
nimi
@Mauris: ... oh no, tiene la misma longitud.
nimi
¿Qué talf=unlines.map unwords.transpose.(`chunksOf`(["moe Catch a tiger by the toe If he hollers let him go","MOE!"]>>=words.("Eeny meeny miny "++)))
Lynn
@Mauris: Bien. Una vez que festé completamente libre de puntos, podemos omitir incluso el nombre.
nimi
4

Python 2, 154 147 bytes

EDITAR: ¡ Gracias Joe Willis!

i=input()
s='Eeny meeny miny '
for j in range(i):print' '.join((s+'moe Catch a tiger by the toe If he hollers let him go '+s+'MOE!').split()[j::i]) 

Esto utiliza el truco de que [0 :: n] imprime el enésimo elemento de la lista.

Pruébalo aquí

TanMath
fuente
Ay. Bueno, acabas de destruir totalmente mi respuesta. Jajaja Voy a probar su consejo más tarde hoy sobre la impresión ("\ n"). ¿Qué hace exactamente el ::operador? ¿Es eso como en bucle?
Ashwin Gupta
3

Ruby, 160 bytes

puts (a=[*%w[Eeny meeny miny moe Catch a tiger by the toe If he hollers let him go Eeny meeny miny MOE!].each_slice(gets.to_i)])[0].zip(*a[1..-1]).map{|x|x*' '}

Todos mis intentos de "comprimir" la cadena lo han hecho más largo. Sigo intentando...

puts                      # output to STDOUT...
(a=                       # assign this stuff to the variable a
 [*                       # convert to array...
  %w[blah blah]           # %w splits on spaces
  .each_slice(gets.to_i)  # split into slices of input number
 ]
)[0]                      # take the first element of a
.zip(*a[1..-1])           # zip it with the remaining elements
                          #   because transpose complains about ragged 2D arrays
.map{|x|x*' '}            # join all sub-arrays on space
                          #   puts automatically inserts newlines for us
Pomo de la puerta
fuente
3

JavaScript (ES6), 189 bytes:

a=prompt(),b=Array(a--).fill``,c=0;"Eeny meeny miny moe Catch a tiger by the toe If he hollers let him go Eeny meeny miny MOE!".split` `.map(v=>(b[c]+=v+' ',c+=c>a-1?-c:1));alert(b.join`\n`)

Explicación:

a=prompt(), //Get the STDIN
b=Array(a--).fill``, //Make an array based on how many kids there are
c=0; //Start the iteration variable
"Eeny meeny miny moe Catch a tiger by the toe If he hollers let him go Eeny meeny miny MOE!"
.split` `.map(
    v=>(
        b[c] += v + ' ',
        c += c > a - 1 ? -c : 1
    )
);alert(b.join`\n`)
Pluma
fuente
Su método de entrada es correcto, pero no se acepta el método de salida. Sin embargo, puede envolverlo todo en una función, recibiendo la entrada como argumento. Puede intentar lo siguiente: I=>(b=Array(I--).fill``,c=0,"Eeny meeny miny moe Catch a tiger by the toe If he hollers let him go Eeny meeny miny MOE!".split` `.forEach(v=>(b[c]+=v+' ',c+=c>I-1?-c:1)),b)que tiene 172 bytes de longitud. Devuelve cada línea como un elemento en la matriz. Creo que esto es aceptable.
Ismael Miguel
Por cierto, si usa en .map()lugar de .forEach(), puede guardar 3 bytes, reduciendo a 169 bytes. ¡Con un poco más de violín, esto en realidad podría ser tuiteable!
Ismael Miguel
@IsmaelMiguel La pregunta pide que la entrada y la salida se realicen específicamente STDINy, STDOUTpor lo tanto, creo que limita las respuestas de JavaScript prompty alertdesafortunadamente.
user81655
Oh ya veo. Actualizaré el código cuando tenga la oportunidad. Gracias por informarme :-)
Quill
@ user81655 Tienes razón. Debería tener un alert(b.join`<newline>`)al final. Pero el daño aún se puede reducir con .map(), en lugar de .forEach().
Ismael Miguel
3

Python 3, 279 278 272 173 bytes

(¡Gracias a Mathias Ettinger que literalmente me salvó más de 100 BYTES! )

s=" Eeny meeny miny moe Catch a tiger by the toe If he hollers let him go Eeny meeny miny moe!";w=s.split();i=input();i=int(i)
for z in range(i):W=w[z::i];print(" ".join(W))  

Si alguien tiene consejos o sugerencias, realmente los agradecería. ¡Gracias!

Ashwin Gupta
fuente
Creo que has entendido mal lo que representa la entrada. No es el número de línea para mostrar, es el número de niños entre los cuales se dividen las palabras. Cada línea debe mostrarse. En su código, int(i)debe tomar el lugar de 3, pero hay otros errores que corregir después de eso.
Hand-E-Food
@ Hand-E-Food está bien, ¡creo que funciona como lo especificó ahora!
Ashwin Gupta
Eso se ve mejor! :-) Y si quieres ayuda con el golf, investiga al operador del módulo, generalmente escrito como %. Es ideal para contadores cíclicos.
Hand-E-Food
@ Hand-E-Food ok gracias! Creo que sé a qué te refieres. Voy a arreglar esto mañana. Creo que puedo reducir al menos un par de bytes.
Ashwin Gupta
Algunos puntos que sirven tanto para las mejores prácticas como para acortar el código: 1) .split()se dividirá en espacios en blanco (espacio, líneas nuevas, pestañas) 2) range(0, x)se escribe mejor como range(x)3) eche un vistazo a la notación de corte: w[0::3]devolverá una lista de cada tres palabras w.
301_Moved_Permanently
2

Mathematica, 154 bytes

StringRiffle[Thread@Partition[StringSplit@"Eeny meeny miny moe Catch a tiger by the toe If he hollers let him go Eeny meeny miny MOE!",#,#,1,""],"
"," "]&

Utiliza el método split-chunk-transpose-join-output de la mayoría de las otras respuestas.

LegionMammal978
fuente
2

MATLAB, 167 bytes / caracteres:

n=input('');s='Eeny meeny miny ';s=strsplit([s 'moe Catch a tiger by the toe If he hollers let him go ' s 'MOE!']);f=@fprintf;for i=1:n f('%s ',s{i:n:end});f('\n');end

Explicación:

n=input('');             % Grab the input (number of children)
s='Eeny meeny miny ';    % Common string portion
% Build the full string and split into cell array at spaces
s=strsplit([s 'moe Catch a tiger by the toe If he hollers let him go ' s 'MOE!']);
f=@fprintf;              % Just a shorthand for later (only saves 1 char here)
for i=1:n                % Loop to the number of children
    f('%s ',s{i:n:end}); % Print each nth word, shifted by child
    f('\n');             % Start each child's words on a new line
end

No ganará ningún premio por la duración de este, pero fue divertido. :-)

Paul Gessler
fuente
2

Japt, 90 87 86 bytes

Uo mW{V=`EydÚ9yd·nyd` +`¶C®»dgdbydÈIfddÒ@sd¤tdmdgod{V}MOE!` qd f@Y%U¥W} m¸·

Un montón de no imprimibles. Pruébalo en línea!

Cómo funciona

              // Implicit: U = input
Uo mW{     }  // Create the range 0...U and map each item W to:
V=`...`       //  Set V to this string, decompressed. "Eenydmeenydmined"
+`...{V}MOE!` //  Concatenate it with this string, decompressed, with V inserted.
qd            //  Split at "d"s.
f@Y%U¥W       //  Filter to only the items where (index % U == W).
m¸            // Map each item by joining with spaces.
·             // Join the result with newlines.

Intenté comprimir la cadena con diferentes delimitadores. Lo único más eficiente que los espacios sería una letra minúscula, pero la mayoría de estos ya se usan y, por lo tanto, no se pueden usar para dividir la cadena. A continuación se indica cuánta compresión se logra con las restantes:

space -> 69 bytes
c -> 66 (including a null byte)
d -> 65
j -> 69
k -> 69
p -> 68
q -> 69
s -> 61 (but there's an s in "hollers")
u -> 65
w -> 67
x -> 69
y -> 69

Actualmente estoy usando d. Es posible guardar un byte con s, sustituyendo alguna otra letra en hollers.

ETHproductions
fuente