Eeny, meeny, miny, moe

11

Introdução

A música infantil Eeny, meeny, miny, moe era frequentemente usada para selecionar quem era "ele" ao tocar tag. Todo mundo ficava em círculo e apontava para uma pessoa selecionada aleatoriamente. Eles cantariam:

Eeny, meeny, miny, moe,
pegue um tigre pelo dedo do pé.
Se ele gritar, deixe-o ir,
Eeny, meeny, miny, moe.

Ao cantarem cada palavra, apontaram para a próxima pessoa no círculo. A pessoa que está sendo apontada quando o último "moe" foi cantado seria "it". As crianças imediatamente se levantam e se dispersam.

Objetivo

Implemente o programa mais curto em bytes que recebe uma entrada, o número de filhos e lista as palavras que foram cantadas quando estavam sendo apontadas.

O vencedor será selecionado em uma semana.

Entrada

De STDIN, um único número inteiro positivo, o número de filhos. Isso pode ser mais do que o número de palavras na música.

Resultado

Grava em STDOUT uma lista em que cada linha representa um filho e contém a palavra cantada enquanto estavam sendo apontadas. Se houver muitos filhos, linhas vazias podem ser omitidas.

Exigências

  • Sempre comece com o primeiro filho.
  • Mostre as palavras sem pontuação.
  • O "moe" final deve ser enfatizado como "MOE!" incluindo pontuação.

Exemplo

Entrada

3

Resultado

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

Entrada

7

Resultado

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

Entrada

1

Resultado

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

Entrada

21

Resultado

Eeny
meeny
miny
moe
Catch
a
tiger
by
the
toe
If
he
hollers
let
him
go
Eeny
meeny
miny
MOE!
Mão-E-Comida
fonte
1
A entrada será maior que o número de palavras presentes?
Maçaneta
7
Deveria "pegar um" e "se ele" e "pelo seu" / "pelo" devem ser tratados como duas palavras ou uma? Na música, eles contam apenas como um "ponto"
OldBunny2800 20/01/16
4
Sempre terminávamos com "Minha ... mãe ... disse ... para ... escolher ... a ... muito ... melhor ... uma ... e ... você ... é ...ISTO!" Isso seria um bônus legal. É claro que os trapaceiros sempre arrastavam o "você" e o "são" sobre várias pessoas ...
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot NOOO (voz de Darth Vader)! Você roubou minha linha. Eu literalmente entrei no PPCG apenas para escrever isso, já que tenho pensado nisso nos últimos dois dias desde que vi isso.
Ashwin Gupta
1
Fato não tão divertido: Tiger costumava ser a palavra N.
DanTheMan

Respostas:

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╝

Descompacte, pedaço, transposição, junção, saída.

Explicação

              // 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

Experimente online


81 bytes não concorrentes

O αnão estava sendo acorrentado, .então eu tive que corrigir isso

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

Pyth, 103 89 84 caracteres

Salva 18 bytes com compactação de strings, graças a @Dennis e @FryAmTheEggman
Salva outro byte graças a @isaacg

Aviso: existem muitos não imprimíveis no código; use os links abaixo para experimentá-lo.

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

Experimente online | Suíte de teste

Provavelmente poderia ser jogado golfe. Sugestões são bem-vindas!

Como 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
fonte
A reutilização de Eeny meeny minyalguma forma deve economizar alguns bytes. Além disso, o Pyth possui dois recursos internos para (des) compactação ( .Ze .").
Dennis
@ Dennis Obrigado, ."economiza 14 bytes!
ETHproductions
Pyth usa UTF-8 ou algo mais? Esta é de 89 caracteres, mas 123 bytes
Downgoat
@ Doᴡɴɢᴏᴀᴛ Pyth usa ISO 8859-1 por padrão, então cada caractere tem exatamente um byte.
Dennis
FNQ== VQ, a propósito.
Isaacg
5

Geléia, 84 bytes

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

Experimente online!

Dennis
fonte
4
Comprimir a corda à mão era ... divertido. A pontuação seria muito melhor se Jelly tivesse uma divisão na função de ocorrências .
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`
`)

Explicação

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
user81655
fonte
Não l=Array(n).fill`` funciona por algum motivo?
ETHproductions
@ETHproductions Funciona. Só esqueci de encurtá-lo de alguma forma haha! Obrigado.
user81655
@ user81655 Adoro janelas de prompt JS (). Eles são tão divertidos. (Eu sei que parece loucura, mas eu quero dizer em comparação com Console.Out de cada outro idioma ou equivalente tipo de impressão expressão)
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 "++)))

Anexar "Eeny meeny miny "as outras partes ( "moe Catch ..."e "MOE!"), concatenar as duas seqüências, dividir em palavras, pegar pedaços do tamanho necessário, transpor e concatenar novamente em uma única sequência.

O @Mauris encontrou 3 bytes, fatorando a substring comum "Eeny meeny miny" e tornando o fpointfree.

nimi
fonte
Talvez s="Eeny meeny miny "economize alguns bytes.
Lynn
@Mauris: eu tentei, mas foi mais longo.
nimi 20/01
@Mauris: ... oh não, tem o mesmo comprimento.
nimi 20/01
Como sobref=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: Legal. Uma vez que fé completamente sem sentido, podemos omitir até o nome.
N
4

Python 2, 154 147 bytes

EDIT: Obrigado 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]) 

Isso usa o truque que [0 :: n] imprime o enésimo elemento da lista.

Experimente aqui

TanMath
fonte
Ai. Bem, você acabou de destruir totalmente minha resposta. RI MUITO. Hoje vou tentar sua dica ainda hoje sobre a impressão ("\ n"). O que exatamente o ::operador faz? É assim no loop?
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*' '}

Todas as minhas tentativas de "comprimir" a string apenas a prolongaram. Ainda tentando ...

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
Maçaneta da porta
fonte
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`)

Explicação:

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`)
Quill
fonte
Seu método de entrada está correto, mas o método de saída não é aceito. No entanto, você pode agrupar tudo em uma função, recebendo a entrada como argumento. Você pode tentar o seguinte 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 tem 172 bytes de comprimento. Retorna cada linha como um elemento na matriz. Eu acho que isso é aceitável.
Ismael Miguel
A propósito, se você usar em .map()vez de .forEach(), poderá salvar 3 bytes, reduzindo para 169 bytes. Com um pouco mais de brincadeira, isso pode ser realmente tweetable!
Ismael Miguel
@IsmaelMiguel A pergunta pede que a entrada e a saída sejam especificamente aprovadas STDINe, STDOUTportanto, acho que limita as respostas JavaScript prompte alertinfelizmente.
user81655
Ah eu vejo. Vou atualizar o código quando tiver uma chance. Obrigado por me informar :-)
Quill
@ user81655 Você está correto. Deve ter um alert(b.join`<newline>`)no final. Mas o dano ainda pode ser reduzido com .map(), em vez de .forEach().
Ismael Miguel
3

Python 3, 279 278 272 173 bytes

(obrigado a Mathias Ettinger, que literalmente me salvou 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))  

Se alguém tiver dicas ou sugestões, eu realmente aprecio. Obrigado!

Ashwin Gupta
fonte
Eu acho que você não entendeu o que a entrada representa. Não é o número da linha a mostrar, é o número de filhos entre os quais dividir as palavras. Cada linha deve ser exibida. No seu código, int(i)deve substituir 3, mas há outros erros a serem corrigidos depois disso.
Hand-E-Food
@ Mão-E-Food ok, eu acredito que funciona como você especificou agora!
Ashwin Gupta
Parece melhor! :-) E se você quiser ajuda com o golfe, investigue o operador Modulo, geralmente escrito como %. É ideal para contadores cíclicos.
Hand-E-Food
@ Mão-E-Food ok obrigado! Eu acho que sei no que você está falando. Eu vou consertar isso amanhã. Acho que posso raspar pelo menos alguns bytes.
Ashwin Gupta
Alguns pontos que atendem às práticas recomendadas e ajudam a reduzir o código: 1) .split()serão divididos em espaços em branco (espaço, novas linhas, guias) 2) range(0, x)é melhor redigidos como range(x)3) dê uma olhada na notação de fatia: w[0::3]retornará uma lista de três em três palavras em 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,""],"
"," "]&

Usa o método split-chunk-transpose-join-output da maioria das outras respostas.

LegionMammal978
fonte
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

Explicação:

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

Não ganhará nenhum prêmio pela duração deste, mas foi divertido. :-)

Paul Gessler
fonte
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¸·

Muitos imprimíveis. Experimente online!

Como 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.

Eu tentei comprimir a string com diferentes delimitadores. A única coisa mais eficiente que os espaços seria uma letra minúscula, mas a maioria deles já é usada e, portanto, não pode ser usada para dividir a sequência. Aqui está a quantidade de compactação obtida com as 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

Atualmente estou usando d. Pode ser possível salvar um byte s, substituindo por outra letra hollers.

ETHproductions
fonte