Eeny, meeny, miny, moe

11

pengantar

Lagu masa kecil Eeny, meeny, miny, moe sering digunakan untuk memilih siapa "itu" ketika bermain tag. Semua orang akan berdiri dalam lingkaran dan menunjuk satu orang yang dipilih secara acak. Mereka akan bernyanyi:

Eeny, meeny, miny, moe,
Tangkap kaki harimau.
Jika dia berteriak, biarkan dia pergi,
Eeny, meeny, miny, moe.

Ketika mereka menyanyikan setiap kata, mereka menunjuk orang berikutnya dalam lingkaran. Orang yang diarahkan ketika "moe" terakhir dinyanyikan akan menjadi "itu". Anak-anak akan segera berdiri dan berpencar.

Tujuan

Laksanakan program terpendek dalam byte yang mengambil input, jumlah anak, dan daftar kata-kata yang dinyanyikan ketika mereka diarahkan.

Pemenang akan dipilih dalam satu minggu.

Memasukkan

Dari STDIN, bilangan bulat tunggal, positif, jumlah anak. Ini mungkin lebih dari jumlah kata dalam lagu.

Keluaran

Menulis untuk STDOUT daftar di mana setiap baris mewakili anak dan berisi kata dinyanyikan saat mereka sedang diarahkan. Jika ada terlalu banyak anak, baris kosong mungkin dihilangkan.

Persyaratan

  • Selalu mulai dengan anak pertama.
  • Tampilkan kata-kata tanpa tanda baca.
  • "Moe" terakhir harus ditekankan sebagai "MOE!" termasuk tanda baca.

Contoh

Memasukkan

3

Keluaran

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

Memasukkan

7

Keluaran

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

Memasukkan

1

Keluaran

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

Memasukkan

21

Keluaran

Eeny
meeny
miny
moe
Catch
a
tiger
by
the
toe
If
he
hollers
let
him
go
Eeny
meeny
miny
MOE!
Makanan Tangan
sumber
1
Apakah input akan lebih besar dari jumlah kata yang ada?
Gagang Pintu
7
Haruskah "menangkap" dan "jika ia" dan "olehnya" / "oleh" diperlakukan sebagai dua kata atau satu? Dalam lagu itu, mereka hanya dihitung sebagai satu "titik"
OldBunny2800
4
Kami selalu berakhir dengan "Ibuku ... berkata ... untuk ... memilih ... yang ... sangat ... terbaik ... yang satu ... dan ... kau ... adalah ...ITU!" Itu akan menjadi bonus keren. Tentu saja, curang selalu menyeret keluar "Anda" dan "adalah" atas beberapa orang ...
ThisSuitIsBlackNot
1
@ ThisSuitIsBlackNot NOOO (Suara Darth Vader)! Anda mencuri dialog saya. Saya benar-benar masuk ke PPCG hanya untuk menulis itu karena saya sudah memikirkannya selama dua hari terakhir sejak saya melihat ini.
Ashwin Gupta
1
Fakta yang tidak terlalu menyenangkan: Tiger dulunya adalah kata N.
DanTheMan

Jawaban:

5

TeaScript , 82 byte

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

Dekompresi, chunk, transpose, gabung, output.

Penjelasan

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

Cobalah online


Non-bersaing 81 byte

Tidak αdirantai .jadi saya harus memperbaiki bug ini

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

Pyth, 103 89 84 karakter

Disimpan 18 byte dengan kompresi string, terima kasih kepada @Dennis dan @FryAmTheEggman
Menyimpan byte lain berkat @isaacg

Peringatan: ada banyak unsintables dalam kode; gunakan tautan di bawah untuk mencobanya.

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

Cobalah online | Suite uji

Mungkin bisa bermain golf. Saran diterima!

Bagaimana itu bekerja

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.
Produksi ETH
sumber
Menggunakan kembali Eeny meeny minyentah bagaimana seharusnya menghemat beberapa byte. Juga, Pyth memiliki dua built-in untuk kompresi (de) ( .Zdan .").
Dennis
@Dennis Terima kasih, ."simpan 14 byte!
ETHproduk
Apakah Pyth menggunakan UTF-8 atau yang lainnya? Ini adalah 89 karakter tetapi 123 byte
Downgoat
@ Doᴡɴɢᴏᴀᴛ Pyth menggunakan ISO 8859-1 secara default, sehingga setiap karakter tepat satu byte.
Dennis
FNQ== VQ, omong-omong.
isaacg
5

Jelly, 84 byte

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

Cobalah online!

Dennis
sumber
4
Menekan tali dengan tangan adalah ... menghibur. Skor akan jauh lebih baik jika Jelly memiliki fungsi split pada kejadian .
Dennis
5

JavaScript (ES6), 167 byte

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`
`)

Penjelasan

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
pengguna81655
sumber
Tidak l=Array(n).fill`` berhasil karena suatu alasan?
ETHproduk
@ ETHproductions Berhasil. Aku lupa memendekkannya entah bagaimana haha! Terima kasih.
user81655
@ user81655 Saya suka jendela JS prompt (). Mereka sangat menyenangkan. (Saya tahu itu terdengar gila tapi maksud saya dibandingkan dengan setiap konsol bahasa lain. Ekspresi jenis cetakan atau setara)
Ashwin Gupta
4

Haskell, 160 157 byte

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 "++)))

Tergantung "Eeny meeny miny "pada bagian lain ("moe Catch ..." dan "MOE!"), gabungkan kedua string, pisahkan menjadi kata-kata, ambil potongan dengan ukuran yang diperlukan, transpos dan gabungkan lagi menjadi satu string.

@Mauris menemukan 3 byte dengan memfaktorkan substring umum "Eeny meeny miny" dan membuat fpointfree.

nimi
sumber
Mungkin s="Eeny meeny miny "menghemat beberapa byte.
Lynn
@Mauris: Saya mencoba, tetapi lebih lama.
nimi
@Mauris: ... oh tidak, ia memiliki panjang yang sama.
nimi
Bagaimana denganf=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: Bagus. Setelah fbenar-benar pointfree, kita dapat menghilangkan bahkan nama.
nimi
4

Python 2, 154 147 byte

EDIT: Terima kasih, 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]) 

Ini menggunakan trik yang [0 :: n] mencetak elemen ke-n dari daftar.

Coba di sini

TanMath
sumber
Aduh. Ya, Anda benar-benar menghancurkan jawaban saya. LOL. Saya akan mencoba kiat Anda hari ini tentang hasil cetak ("\ n"). Apa sebenarnya yang dilakukan ::operator? Apakah itu seperti untuk di dalam loop?
Ashwin Gupta
3

Ruby, 160 byte

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*' '}

Semua upaya saya untuk "mengompresi" string baru saja membuatnya lebih lama. Masih berusaha ...

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
Gagang pintu
sumber
3

JavaScript (ES6), 189 byte:

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`)

Penjelasan:

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`)
Bulu ayam
sumber
Metode input Anda benar, tetapi metode output tidak diterima. Anda bisa, bagaimanapun, membungkus semuanya dalam suatu fungsi, menerima input sebagai argumen. Anda dapat mencoba yang berikut 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)ini:, yang panjangnya 172 byte. Ini mengembalikan setiap baris sebagai elemen dalam array. Saya pikir ini bisa diterima.
Ismael Miguel
Omong-omong, jika Anda menggunakan .map()alih-alih .forEach(), Anda dapat menyimpan 3 byte, dikurangi menjadi 169 byte. Dengan sedikit mengutak-atik, ini mungkin sebenarnya tweetable!
Ismael Miguel
@IsmaelMiguel Pertanyaannya meminta input dan output untuk secara khusus melalui STDINdan STDOUTjadi saya pikir itu membatasi jawaban JavaScript promptdan alertsayangnya.
user81655
Oh begitu. Saya akan memperbarui kode ketika saya mendapat kesempatan. Terima kasih telah memberi tahu saya :-)
Quill
@ user81655 Anda benar. Seharusnya ada alert(b.join`<newline>`)di akhir. Tetapi kerusakan masih bisa dikurangi dengan .map(), bukannya .forEach().
Ismael Miguel
3

Python 3, 279 278 272 173 byte

(Terima kasih kepada Mathias Ettinger yang benar-benar menyelamatkan saya 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))  

Jika ada yang punya tips atau saran, saya akan sangat menghargainya. Terima kasih!

Ashwin Gupta
sumber
Saya pikir Anda telah salah mengerti apa yang diwakili oleh input. Itu bukan nomor baris untuk ditampilkan, itu adalah jumlah anak di antaranya untuk membagi kata-kata. Setiap baris harus ditampilkan. Dalam kode Anda, int(i)harus menggantikan 3, tetapi ada kesalahan lain untuk memperbaikinya setelah itu.
Hand-E-Food
@ Hand-E-Food oke saya percaya ini berfungsi seperti yang Anda tentukan sekarang!
Ashwin Gupta
Itu terlihat lebih baik! :-) Dan jika Anda membutuhkan bantuan golf, selidiki operator Modulo, biasanya ditulis sebagai %. Ini ideal untuk penghitung siklik.
Hand-E-Food
@ Hand-E-Food ok terima kasih! Saya rasa saya tahu apa yang Anda maksud. Saya akan memperbaikinya besok. Saya pikir saya bisa mencukur setidaknya beberapa byte.
Ashwin Gupta
Beberapa poin yang berfungsi baik pada praktik terbaik dan membantu memperpendek kode: 1) .split()akan dibagi menjadi kosong (spasi, baris baru, tab) 2) range(0, x)ditulis terbaik sebagai range(x)3) melihat notasi slice: w[0::3]akan mengembalikan daftar setiap tiga kata dalam w.
301_Moved_Permanently
2

Mathematica, 154 byte

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,""],"
"," "]&

Menggunakan metode split-chunk-transpose-join-output dari sebagian besar jawaban lainnya.

LegionMammal978
sumber
2

MATLAB, 167 byte / karakter:

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

Penjelasan:

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

Tidak akan memenangkan penghargaan apa pun selama ini, tapi itu menyenangkan. :-)

Paul Gessler
sumber
2

Japt, 90 87 86 byte

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

Banyak hal yang tidak patut. Cobalah online!

Bagaimana itu bekerja

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

Saya sudah mencoba mengompresi string dengan pembatas yang berbeda. Satu-satunya hal yang lebih efisien daripada spasi adalah huruf kecil, tetapi sebagian besar sudah digunakan, dan dengan demikian, tidak dapat digunakan untuk memisahkan string. Inilah jumlah kompresi yang dicapai dengan sisanya:

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

Saat ini saya menggunakan d . Dimungkinkan untuk menyimpan byte dengan s, menggantikan beberapa huruf lain di hollers.

Produksi ETH
sumber