Эни, мини, мин, мо

11

Вступление

Песня детства Eeny, meeny, miny, moe часто использовалась, чтобы выбрать, кто был "этим", играя тэг. Каждый будет стоять в кругу и указывать на одного человека, выбранного случайным образом. Они будут петь:

Eeny, meeny, miny, moe,
Поймай тигра за палец.
Если он кричит, отпусти его,
Эни, Мини, Мин, Моу.

Когда они пели каждое слово, они указывали на следующего человека в круге. Человек, на которого указывают, когда пели последнее «мо», будет «этим». Дети сразу встали бы и разбежались.

Цель

Реализуйте самую короткую программу в байтах, которая принимает входные данные, количество дочерних элементов и перечисляет слова, которые пели, когда на них указывали.

Победитель будет выбран через одну неделю.

вход

От STDIN, одно, положительное целое число, количество детей. Это может быть больше, чем количество слов в песне.

Выход

Записывает в STDOUT список, где каждая строка представляет ребенка и содержит слово, спетое в то время, когда на него указывали. Если дочерних элементов слишком много, пустые строки могут быть пропущены.

Требования

  • Всегда начинай с первого ребенка.
  • Показать слова без знаков препинания.
  • Заключительное «мо» должно быть подчеркнуто как «МЧС!» в том числе пунктуация.

пример

вход

3

Выход

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

вход

7

Выход

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

вход

1

Выход

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

вход

21

Выход

Eeny
meeny
miny
moe
Catch
a
tiger
by
the
toe
If
he
hollers
let
him
go
Eeny
meeny
miny
MOE!
Hand-E-Food
источник
1
Будет ли ввод когда-либо больше, чем количество присутствующих слов?
Дверная ручка
7
Должны ли слова «поймать» и «если он» и «его» / «посредством» следует рассматривать как два слова или одно? В песне они считаются только одной «точкой»
OldBunny2800
4
Мы всегда заканчивали словами: «Моя ... мама ... сказала ... чтобы выбрать ... самую ... лучшую ... одну ... и ... ты ... ...ЭТО!" Это было бы классным бонусом. Конечно, мошенники всегда тянули «ты» и «есть» над несколькими людьми ...
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot NOOO (голос Дарта Вейдера)! Вы украли мою линию. Я буквально вошел в PPCG только для того, чтобы написать это, так как я думал об этом последние два дня с тех пор, как увидел это.
Эшвин Гупта
1
Не очень забавный факт: Тигр раньше был словом «N».
DanTheMan

Ответы:

5

TeaScript , 82 байта

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

Распаковать, портировать, транспонировать, объединить, вывести.

объяснение

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

Попробуйте онлайн


Неконкурентный 81 байт

αНе получал прикован , .так что я должен был исправить это ошибка

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

Пит, 103 89 84 символов

Сохранено 18 байтов при сжатии строк благодаря @Dennis и @FryAmTheEggman
Сохранено еще один байт благодаря @isaacg

Предупреждение: в коде много непечатных элементов; используйте ссылки ниже, чтобы попробовать это.

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

Попробуй это онлайн |Тестирование

Может быть, в гольф. Предложения приветствуются!

Как это работает

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@Catch@...let@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
источник
Повторное использование Eeny meeny minyкаким-либо образом должно сэкономить несколько байтов. Кроме того, Pyth имеет две встроенные функции для (де) сжатия ( .Zи .").
Деннис
@Dennis Спасибо, ."экономит 14 байтов!
ETHproductions
Pyth использует UTF-8 или что-то еще? Это 89 символов, но 123 байта
Downgoat 20.01.16
@ Doᴡɴɢᴏᴀᴛ Pyth по умолчанию использует ISO 8859-1, поэтому каждый символ занимает ровно один байт.
Деннис
FNQ== VQкстати.
Исаак
5

Желе, 84 байта

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

Попробуйте онлайн!

Деннис
источник
4
Сжатие струны вручную ... занимательно. Счет был бы намного лучше, если бы у Jelly была функция разделения на вхождения .
Деннис
5

JavaScript (ES6), 167 байт

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

объяснение

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
источник
Не l=Array(n).fill`` работает по какой-то причине?
ETHproductions
@ETHproductions Это работает. Я просто забыл сократить это как-то, ха-ха! Спасибо.
user81655 20.01.16
@ user81655 Мне нравятся окна JS prompt (). Они просто такие веселые. (Я знаю, это звучит безумно, но я имею в виду, по сравнению с любым другим языком console.out или эквивалентным выражением типа печати)
Эшвин Гупта
4

Haskell, 160 157 байт

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

Готовьтесь "Eeny meeny miny "к другим частям ( "moe Catch ..."и"MOE!" ), объединяйте обе строки, разделяйте их на слова, берите куски необходимого размера, транспонируйте и объединяйте снова в одну строку.

@Mauris нашел 3 байта, выделив общую подстроку "Eeny meeny miny" и сделав ее fбессмысленной.

Ними
источник
Может быть, s="Eeny meeny miny "сохраняет некоторые байты.
Линн
@Mauris: я пытался, но это было дольше.
Ними
@Mauris: ... о нет, он такой же длины.
Ними
Как насчетf=unlines.map unwords.transpose.(`chunksOf`(["moe Catch a tiger by the toe If he hollers let him go","MOE!"]>>=words.("Eeny meeny miny "++)))
Линн
@ Маурис: Хорошо. однаждыf мы совершенно бессмысленны, мы можем опустить даже название.
Ними
4

Python 2, 154 147 байт

РЕДАКТИРОВАТЬ: Спасибо Джо Уиллис!

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

При этом используется трюк, заключающийся в том, что [0 :: n] печатает n-й элемент списка.

Попробуй здесь

TanMath
источник
Уч. Ну, вы просто полностью уничтожили мой ответ. LOL. Позже сегодня я попробую ваш совет о печати ("\ n"). Что именно делает ::оператор? Это как в цикле?
Эшвин Гупта
3

Рубин, 160 байт

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

Все мои попытки «сжать» строку просто удлинили ее. Все еще пытаюсь...

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
Дверная ручка
источник
3

JavaScript (ES6), 189 байт:

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

Объяснение:

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`)
полый вал
источник
Ваш метод ввода правильный, но метод вывода не принят. Вы можете, однако, обернуть все это в функцию, получив входные данные в качестве аргумента. Вы можете попробовать следующее: 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)длиной 172 байта. Он возвращает каждую строку как элемент в массиве. Я думаю, что это приемлемо.
Исмаэль Мигель
Кстати, если вы используете .map()вместо .forEach(), вы можете сохранить 3 байта, уменьшив до 169 байтов. С немного большим количеством возни, это на самом деле может быть твиттер!
Исмаэль Мигель
@IsmaelMiguel Вопрос требует, чтобы ввод и вывод проходили конкретно, STDINи STDOUTпоэтому я думаю, что он ограничивает ответы JavaScript promptи, alertк сожалению, ограничен .
user81655
О, я вижу. Я обновлю код, когда у меня будет шанс. Спасибо за сообщение :-)
Quill
@ user81655 Вы правы. Это должно быть alert(b.join`<newline>`)в конце. Но урон все еще можно уменьшить с помощью .map(), вместо .forEach().
Исмаэль Мигель
3

Python 3, 279 278 272 173 байта

(спасибо Матиасу Эттингеру, который буквально спас мне 100+ БАЙТОВ! )

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

Если у кого-то есть советы или предложения, я буду очень признателен. Благодаря!

Эшвин Гупта
источник
Я думаю, вы неправильно поняли, что представляет собой вклад. Это не номер строки, чтобы показать, это количество детей, между которыми делятся слова. Каждая строка должна отображаться. В вашем коде int(i)должно занять место 3, но есть и другие ошибки, которые нужно исправить после этого.
Hand-E-Food
@ Hand-E-Food хорошо, я думаю, что это работает, как вы указали сейчас!
Эшвин Гупта
Это выглядит лучше! :-) А если вам нужна помощь в игре в гольф, исследуйте оператора Modulo, обычно записанного как %. Идеально подходит для циклических счетчиков.
Hand-E-Food
@ Hand-E-Food хорошо, спасибо! Я думаю, я знаю, к чему вы клоните. Я собираюсь исправить это завтра. Я думаю, что смогу сбрить хотя бы пару байтов.
Эшвин Гупта
Несколько моментов, которые служат как передовым методам, так и помогают сократить код: 1) .split()разделить на пробелы (пробел, новые строки, табуляции) 2) range(0, x)лучше всего записать как range(x)3) взглянуть на нотацию срезов: w[0::3]вернет список из каждых трех слова в w.
301_Moved_Permanently
2

Mathematica, 154 байта

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

Использует метод split-chunk-transpose-join-output большинства других ответов.

LegionMammal978
источник
2

MATLAB, 167 байт / символов:

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

Объяснение:

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

Не получу никаких наград за длину этой, но это было весело. :-)

Пол Гесслер
источник
2

Japt 90 87 86 байт

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

Много непечатных. Попробуйте онлайн!

Как это работает

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

Я пытался сжать строку с разными разделителями. Единственной вещью, более эффективной, чем пробелы, была бы строчная буква, но большинство из них уже используются, и, следовательно, не могут использоваться для разделения строки. Вот сколько сжатия достигается с оставшимися:

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

В настоящее время я использую d. Может быть возможно сохранить байт с помощью sзамены другой буквы в hollers.

ETHproductions
источник