Введение:
Я думаю, что мы все это знаем, и, вероятно, она была переведена на множество разных языков: детская песня "Голова, плечи, колени и пальцы":
Голова, плечи, колени и пальцы, колени и пальцы
Голова, плечи, колени и пальцы, колени и пальцы
И глаза и уши, рот и нос
Голова, плечи, колени и пальцы, колени и пальцы
Википедия
Вызов:
Входные данные: положительное целое число.
Выходные данные: Выведите одно из следующих слов на основе ввода в качестве n-го индекса:
head
shoulders
knees
toes
eyes
ears
mouth
nose
Здесь части тела дополнены индексами:
Head (0), shoulders (1), knees (2) and toes (3), knees (4) and toes (5)
Head (6), shoulders (7), knees (8) and toes (9), knees (10) and toes (11)
And eyes (12) and ears (13) and mouth (14) and nose (15)
Head (16), shoulders (17), knees (18) and toes (19), knees (20) and toes (21)
Head (22), shoulders (23), knees (24) and toes (25), knees (26) and toes (27)
Head (28), shoulders (29), knees (30) and toes (31), knees (32) and toes (33)
And eyes (34) and ears (35) and mouth (36) and nose (37)
Head (38), shoulders (39), knees (40) and toes (41), knees (42) and toes (43)
etc.
Правила соревнований:
- Вам, конечно, разрешено использовать 1-индексированный ввод вместо 0-индексированный. Но, пожалуйста, укажите, какой из них вы использовали в своем ответе.
- Вывод нечувствителен к регистру, так что если вы хотите вывести его заглавными буквами, это нормально.
- Вы должны поддерживать ввод как минимум до 1000.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Контрольные примеры (0-индексированные):
Input: Output:
0 head
1 shoulders
7 shoulders
13 ears
20 knees
35 ears
37 nose
98 knees
543 nose
1000 knees
code-golf
string
kolmogorov-complexity
Кевин Круйссен
источник
источник
kolmogorov-complexity
ответы, которые всегда имеют одинаковый фиксированный вывод, но теперь я вижу, что все дело в фиксированных выходных строках в коде и в поиске шаблонов для игры в гольф (или кодирования, например, с помощью ответа @ Enigma 05AB1E ). Спасибо за добавление; Я не был слишком уверен, какие теги были актуальны для этой задачи, которая была одним из моих (к сожалению, без ответа) вопросов в Песочнице.inquestion:2140 shoulders
.Ответы:
05AB1E ,
363534 байтаПопробуйте онлайн! или как тестовый набор
объяснение
Короче говоря, мы строим список
['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']
и индексируем его с помощью ввода (0-indexed).источник
‡ä¾ØsÏ©s¸±s
кажется странным, учитывая, что каждое слово состоит из 2 символов. Это что-то еще?s
для множественного числа,shoulder, knee, toe
которые являются единственными в словаре. Нам это не нужно, такeyes, ears
как они уже во множественном числе в словаре, так что строка имеет ожидаемую четную длину.JavaScript (ES6),
918887 байтКак это работает
У нас есть 4 различные пары слов, которые всегда появляются вместе: за «головой» всегда следуют «плечи», за «коленями» всегда следуют «пальцы ног» и т. Д.
Поэтому мы можем использовать следующий индекс:
И сжать всю последовательность (в обратном порядке) в следующую двоичную маску:
Мы используем
[ 'knees', 'toes' ]
в качестве первой пары, чтобы получить как можно больше ведущих нулей.Мы дополняем эту последовательность дополнительным,
0
так что извлеченное значение предварительно умножается на 2, что приводит к:Отсюда и окончательная формула для правильного слова:
Контрольные примеры
Показать фрагмент кода
источник
Python 2,
158148137128114109104 байтаТаблица поиска кажется лучше. Также укоротил большую строку и переупорядочил предметы. -5 байт спасибо Роду за использование строки в качестве списка.
исходное решение:
источник
hskteemnehnoyaooaoeeerusduessste ls h d
и затем добавив 'ers', если вы знаете, что слово должно быть 'плечи' :)c=int('602323'*2+'4517602323'[input()%22])
и броситьh
C:[i%22]
на первом,[input()%22]
на второмPerl, 74 байта
Код 73 байта + 1 для
-p
.Использует индексирование на основе 0. Не выводит разделитель, но это можно изменить с
-l
помощью флагов.Попробуйте онлайн .
источник
x2)x2
вместоx2),@a
Python 2,
9790 байтМожет быть, есть какая-то математика, из-за которой мне не нужно составлять список слов, но пока это работает!
Спасибо Flp.Tkc за сохранение 7 байтов :)
источник
split()
делал его короче:k='head shoulders '+'knees toes '*2
print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
Java 7,
155137131123111110 байт-12 байт благодаря @Neil .
-1 байт, бесстыдно создавая порт удивительного ответа @Arnauld .
Ява индексируется 0, так что это то, что я использовал.
Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
String c(int i){return "head,shoulders,knees,toes,knees,toes,eyes,ears,mouth,nose".split(",")[(i+16)%22%16%10];}
только 112 байтов.C,
153 байта,141 байтаСпасибо @cleblanc за 4 байта. Объявление b глобально бросает тонну предупреждений о приведении к int, но не сломалось для меня.
Ungolfed:
Это не самый маленький ответ, но мне понравилась техника, и я с удовольствием нашел несколько шаблонов.
Changelog:
b
в глобальный, чтобы избежатьchar
(4 байта)a > 11 && a < 16
=>(a & 12) > 8
(2 байта)i=(a-6)%10
=>i=(a+4)%10
так чтоi < 2 && i >= 0
=>i < 2
(6 байт)источник
*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'
а затем заменить возвращаемый b [...] на put (b [...]), вы можете уменьшить его до 143 байт&&
на&
.JavaScript (ES6)
9189 байтисточник
%
:n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10]
.R, 95 байт
Создает символьный вектор для работы в качестве справочной таблицы. Принимает ввод из stdin (
1-indexed
) и%%22
находит соответствующую часть тела.Бонус:
%%
векторизован, что означает, что это будет работать и с векторными входами.Тестовые случаи на R-fiddle (обратите внимание, что это именованная функция, потому
scan
что не работает на R-fiddle)источник
JQ, 80 символов
(77 символов кода + 3 символа командной строки)
Образец прогона:
Он-лайн тест (пропуск
-r
через URL не поддерживается - проверьте Raw Output самостоятельно.)источник
WinDbg,
207157151 байт-50 байтов за счет кодирования смещения / длины частей тела в виде символов ascii.
-6 байт, используя локальную переменную при поиске смещения / длины.
Ввод осуществляется с помощью значения, установленного в псевдорегистре
$t0
.Как это работает:
Пример вывода:
источник
PHP, 91
102118128129байт0-индексированные
Вплоть до 91 после удаления str_split, не понимал, что строки PHP были доступны как массив символов (вещь PHP 5+?)
До 102 благодаря предложению insertusername для удаления строковых кавычек и разрешения уведомленийисточник
'
вокруг слова, как'head'
становится иhead
т.д.error_reporting
.Желе , 55 байт
Попробуйте онлайн! (Индекс на основе 1)
Давай! В самом деле?
В качестве бонуса, это сжатая строка, которую я должен был использовать вместо верхней строки:
Оба кодируют эту строку:
Угадай, мне пора идти сейчас
источник
Powershell, 91 байт, с нулевым индексом
Очень простой подход - генерировать массив первых 22 элементов, используя, где это возможно, умножение строк, компилируя их с пробелами и разделяя в конце. (расщепление на 2 байта короче, чем эквивалентная установка в виде массива), затем просто найдите точку в этом массиве, используя модуль ввода, не совсем интересный или зависящий от языка.
Прецедент:
и т.п.
источник
рубин, 81 байт
Лямбда-функция, использующая нулевую индексацию.
объяснение
Мы генерируем следующий массив, из которого мы используем первые 16 элементов, покрывающих правильные строки 2,3,4 песни:
Мы берем n по модулю 22, чтобы свести его к одному стиху, затем вычитаем 6. Теперь индекс 6 (например) был изменен на 0 и указывает на правильное слово. Индексы 0..5, которые указывают на первую строку песни, теперь отрицательны. Мы используем
&15
(идентично,%16
но избегаем необходимости в скобках), чтобы отобразить 1-ю строку песни на 4-ю строку. Таким образом индекс0
->-6
->10
в тестовой программе
источник
->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Befunge,
129119 байт0 индексированные
Попробуйте онлайн!
объяснение
Как указал Арно , слова идут парами, поэтому у нас есть индекс всего из 11 значений, а затем добавляем слово номер% 2, чтобы получить соответствующее слово в паре. Слова помещаются в стек как одна строка, разделенная звездочками, чтобы сэкономить место. Мы проверяем разрывы слов, принимая значение char по модулю 7, поскольку только звездочка кратна 7.
источник
SQL 2005 747 байт
Golfed:
Ungolfed:
Нужна таблица вроде этой, где первый столбец автоматически увеличивается:
Это одноиндексный ответ. Таблица заполняется при первом создании хранимой процедуры - это не позволило бы мне выполнить все
INSERT
в одном выражении, к сожалению, эта функция доступна только в>=SQL 2008
. После этого он использует%22
трюк из других ответов. После заполнения таблицы используется только последняя часть:источник
Баш (с ред.), 83 символа
1-индексированных
Образец звонка:
источник
постоянный ток , 135 байт
Попробуйте онлайн!
Массивы
dc
должны быть построены по одному элементу за раз, что берет на себя всю тяжесть этого упражнения. Поскольку «глаза», «уши», «рот» и «нос» появляются в нашем массиве только один раз, мы просто вставляем их. Но для остальных мы экономим несколько байтов, помещая их в стек, напримерx[head]x
, где x является серединой его трех значений, затем мы запускаем макрос,[:add6-r;ar:adA+r;ar:a]dshx
чтобы поместить его в массив, вытягиваем его обратно, вставляем в то же значение, меньшее шести, вытягиваем обратно, а затем помещаем в последний раз в исходное значение плюс десять Мы используем среднее значение, потому чтоdc
позволяет нам использовать шестнадцатеричные цифры даже в десятичном режиме, а вычитаниеA
на один байт меньше, чем сложение16
- это также работает только потому, что все средние значения меньше пятнадцати. Мы должны делать колени и пальцы ног дважды, и сделать наш макрос достаточно умным, чтобы разобраться в этом, дороже, чем просто запустить макрос дважды; но мы сохраняем байты здесь, загружая ранее сохраненную копию строки вместо того, чтобы записывать ее снова (B 3;aB
противB[toes]B
- я думаю, что это экономит всего 3 байта).Как только мы построим массив, все, что нам нужно сделать, это
22%
затем;ap
извлечь его из массива и распечатать.источник
C # 6, 138 байт
repl.it demo
Ungolfed + комментарии:
источник
Split
, и иметь ту же проверку, что и ternary (?:
) внутри квадратных скобок (с+4
для второй части), например:string F(int i)=>"eyes,ears,mouth,nose,head,shoulders,knees,toes,knees,toes".Split(',')[(i+10)%22<4?(i+10)%22%4:(i+6)%22%6+4];
( 126 байт )Excel, 146 байт
Использует @ Neil's
MOD(MOD(MOD(B1+16,22),16),10)
для сохранения15
байтов.источник