Голова, плечи, колени и пальцы ног, колени и пальцы ног

31

Введение:

Я думаю, что мы все это знаем, и, вероятно, она была переведена на множество разных языков: детская песня "Голова, плечи, колени и пальцы":

Голова, плечи, колени и пальцы, колени и пальцы
Голова, плечи, колени и пальцы, колени и пальцы
И глаза и уши, рот и нос
Голова, плечи, колени и пальцы, колени и пальцы
Википедия


Вызов:

Входные данные: положительное целое число.

Выходные данные: Выведите одно из следующих слов на основе ввода в качестве 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
Кевин Круйссен
источник
3
Добавлен тег сложности Колмогорова, так как большинство ответов, вероятно, будут использовать входные данные в качестве циклического индекса в константном массиве, генерация которого будет доминировать над количеством байтов.
Мартин Эндер
@MartinEnder Спасибо. Я неправильно использовал только те kolmogorov-complexityответы, которые всегда имеют одинаковый фиксированный вывод, но теперь я вижу, что все дело в фиксированных выходных строках в коде и в поиске шаблонов для игры в гольф (или кодирования, например, с помощью ответа @ Enigma 05AB1E ). Спасибо за добавление; Я не был слишком уверен, какие теги были актуальны для этой задачи, которая была одним из моих (к сожалению, без ответа) вопросов в Песочнице.
Кевин Круйссен
1
@KevinCruijssen По крайней мере ваш вопрос получил несколько +1 :) (оптимистичное замечание) Вы можете искать в песочнице, используя inquestion:2140 shoulders.
Эрик Outgolfer
3
У кого-нибудь еще эта песня застряла у них в голове весь день? ...
Кевин Круйссен

Ответы:

12

05AB1E , 36 35 34 байта

“‡ä¾ØsÏ©s¸±s“#2䤫Г—íÖÇ©¢ÄÓ#s)˜è

Попробуйте онлайн! или как тестовый набор

объяснение

“‡ä¾ØsÏ©s¸±s“                        # dictionary string 'head shoulders knees toes'
             #                       # split on spaces
              2ä                     # split in 2 parts
                ¤                    # get the last part ['knees', 'toes']
                 «                   # concatenate and flatten
                                     # STACK: [['head', 'shoulders'], ['knees', 'toes'], 'knees', 'toes']
                  Ð                  # triplicate
                   “—íÖÇ©¢ÄÓ        # dictionary string 'eyes ears mouth nose'
                             #s      # split on spaces and swap top 2 elements of stack
                               )˜    # wrap stack in a list and flatten
                                 è   # index into list with input

Короче говоря, мы строим список ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']и индексируем его с помощью ввода (0-indexed).

Emigna
источник
4
@KevinCruijssen: объяснение не за горами :) Это довольно обязательно для игры в гольф.
Emigna
‡ä¾ØsÏ©s¸±sкажется странным, учитывая, что каждое слово состоит из 2 символов. Это что-то еще?
Эрик Outgolfer
2
@EriktheGolfer: Да, есть 3 sдля множественного числа, shoulder, knee, toeкоторые являются единственными в словаре. Нам это не нужно, так eyes, earsкак они уже во множественном числе в словаре, так что строка имеет ожидаемую четную длину.
Эминья
О, они меня смутили. Спасибо.
Эрик Outgolfer
31

JavaScript (ES6), 91 88 87 байт

n=>'knees,toes,head,shoulders,eyes,ears,mouth,nose'.split`,`[(245890>>(n%22&~1))&6|n%2]

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

У нас есть 4 различные пары слов, которые всегда появляются вместе: за «головой» всегда следуют «плечи», за «коленями» всегда следуют «пальцы ног» и т. Д.

Поэтому мы можем использовать следующий индекс:

00: [ 'knees', 'toes' ]
01: [ 'head', 'shoulders' ]
10: [ 'eyes', 'ears' ]
11: [ 'mouth', 'nose' ]

И сжать всю последовательность (в обратном порядке) в следующую двоичную маску:

00 00 01 11 10 00 00 01 00 00 01

Мы используем [ 'knees', 'toes' ]в качестве первой пары, чтобы получить как можно больше ведущих нулей.

Мы дополняем эту последовательность дополнительным, 0так что извлеченное значение предварительно умножается на 2, что приводит к:

0b00000111100000010000010 = 245890

Отсюда и окончательная формула для правильного слова:

(245890 >> (n % 22 & ~1)) & 6 | n % 2

Контрольные примеры

Arnauld
источник
10

Python 2, 158 148 137 128 114 109 104 байта

Таблица поиска кажется лучше. Также укоротил большую строку и переупорядочил предметы. -5 байт спасибо Роду за использование строки в качестве списка.

c=int('602323'*2+'4517602323'[input()%22])
print"smkteehnhonoyaeooueeerasutesssdelhs"[c::8]+"ders"*(c<1)

исходное решение:

n=input()%22
n-=10*(n>15)
if n>=12:n-=8
else:n%=6;n-=2*(n>3)
print"hskteemnehnoyaooaoeeerusduessste ls   h  d       e       r       s"[n::8].strip()
Карл Напф
источник
1
Очень оригинальный ответ! +1. Но, хм ... большинство ответов, в которых используются полные строки, короче этого. Тем не менее, мне нравится то, что вы взяли, чтобы увидеть какой-то узор в струнах! Вводная часть для этого.
Кевин Круйссен
Я думаю, что вы можете сделать это плечо, сделав строку так: hskteemnehnoyaooaoeeerusduessste ls h dи затем добавив 'ers', если вы знаете, что слово должно быть 'плечи' :)
Kade
1
Вы можете просто использовать c=int('602323'*2+'4517602323'[input()%22])и бросить hC:
Род
1
[i%22]на первом, [input()%22]на втором
род
1
@Rod Извините, если вы посмотрите на свой код достаточно долго, вы ослепнете.
Карл Напф
6

Perl, 74 байта

Код 73 байта + 1 для -p.

$_=(@a=(head,shoulders,(knees,toes)x2),@a,eyes,ears,mouth,nose,@a)[$_%22]

Использует индексирование на основе 0. Не выводит разделитель, но это можно изменить с -lпомощью флагов.

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

Дом Гастингс
источник
Вы можете сохранить 1 байт x2)x2вместоx2),@a
Адам
4

Python 2, 97 90 байт

Может быть, есть какая-то математика, из-за которой мне не нужно составлять список слов, но пока это работает!

lambda n,k='head shoulders '+'knees toes '*2:(k*2+'eyes ears mouth nose '+k).split()[n%22]

Спасибо Flp.Tkc за сохранение 7 байтов :)

Када
источник
1
Я получил похожее решение, но раньше split()делал его короче:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack
извините, там должен быть пробел после "носа" :)
FlipTack
@ Flp.Tkc Да, я только что понял это :) Обновление в секунду!
Каде
4

Java 7, 155 137 131 123 111 110 байт

String c(int i){return"knees,toes,head,shoulders,eyes,ears,mouth,nose".split(",")[(245890>>(i%22&~1))&6|i%2];}

-12 байт благодаря @Neil .
-1 байт, бесстыдно создавая порт удивительного ответа @Arnauld .

Ява индексируется 0, так что это то, что я использовал.

Ungolfed & тестовый код:

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

class M{
  static String c(int i){
    return "knees,toes,head,shoulders,eyes,ears,mouth,nose".split(",")
      [(245890>>(i%22&~1))&6|i%2];
  }

  public static void main(String[] a){
    System.out.println(c(0));
    System.out.println(c(1));
    System.out.println(c(7));
    System.out.println(c(13));
    System.out.println(c(20));
    System.out.println(c(35));
    System.out.println(c(37));
    System.out.println(c(98));
    System.out.println(c(543));
    System.out.println(c(1000));
  }
}

Выход:

head
shoulders
shoulders
ears
knees
nose
ears
knees
nose
knees
Кевин Круйссен
источник
1
String c(int i){return "head,shoulders,knees,toes,knees,toes,eyes,ears,mouth,nose".split(",")[(i+16)%22%16%10];}только 112 байтов.
Нил
Если вы попытаетесь скопировать комментарий, вы получите дополнительные невидимые байты благодаря Stack Exchange.
Нил
@Neil Ладно, я идиот ... Понятия не имею, как я посчитал 120 грубым вчера поздно вечером ... Вероятно, было слишком поздно ..>.> В любом случае, я отредактировал его (плюс 1 дополнительный байт, удалив пространство), так что спасибо!
Кевин Круйссен
3

C, 153 байта, 141 байта

*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"};i;char*g(a){a%=22;i=(a+4)%10;return b[a<4?a:(a&12)>8?a-8:i<2?i:a%2+2];}

Спасибо @cleblanc за 4 байта. Объявление b глобально бросает тонну предупреждений о приведении к int, но не сломалось для меня.

Ungolfed:

*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"};
i;
char* g(a) {
    a%=22;
    i=(a+4)%10;
    return b[a < 4        ? a
            :(a & 12) > 8 ? a-8
            :i < 2        ? i
            :               a % 2 + 2];
}

Это не самый маленький ответ, но мне понравилась техника, и я с удовольствием нашел несколько шаблонов.

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 байт)
nmjcman101
источник
1
Вы можете сыграть в гольф немного дальше. Перемещая b [] в глобальную область видимости, он может быть объявлен без использования char *, как это, *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'а затем заменить возвращаемый b [...] на put (b [...]), вы можете уменьшить его до 143 байт
cleblanc
+1 И в дополнение к предложению @cleblanc вы также можете изменить оба &&на &.
Кевин Круйссен
Мне любопытно, как предложение @cleblanc об объявлении b глобально работает. Компилятор сказал мне, что это будет * int [], и я подумал, что разница в размере нарушит код. Это не так, но спасибо!
nmjcman101
2

JavaScript (ES6) 91 89 байт

f=
n=>((d='head:shoulders:'+(b='knees:toes:')+b)+d+'eyes:ears:mouth:nose:'+d).split`:`[n%22]

console.log(f.toString().length)
console.log(f(0) === 'head')
console.log(f(1) === 'shoulders')
console.log(f(7) === 'shoulders')
console.log(f(13) === 'ears')
console.log(f(20) === 'knees')
console.log(f(35) === 'ears')
console.log(f(37) === 'nose')
console.log(f(98) === 'knees')
console.log(f(543) === 'nose')
console.log(f(1000) === 'knees')

LMIS
источник
1
Ницца! +1. Когда я портирую ваш ответ на Java 7, он будет твердым на 7 байт по сравнению с ответом @ Arnauld, который уже короче моего. ;) Благодарность!
Кевин Круйссен
1
Я сохранил байты, будучи творческим с моим использованием %: n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10].
Нил
2

R, 95 байт

c(o<-c("head","shoulders",y<-c("knees","toes"),y),o,"eyes","ears","mouth","nose",o)[scan()%%22]

Создает символьный вектор для работы в качестве справочной таблицы. Принимает ввод из stdin ( 1-indexed) и %%22находит соответствующую часть тела.

Бонус: %%векторизован, что означает, что это будет работать и с векторными входами.

Тестовые случаи на R-fiddle (обратите внимание, что это именованная функция, потому scanчто не работает на R-fiddle)

Billywob
источник
2

JQ, 80 символов

(77 символов кода + 3 символа командной строки)

((("head shoulders "+"knees toes "*2)*2+"eyes ears mouth nose ")*2/" ")[.%22]

Образец прогона:

bash-4.3$ jq -r '((("head shoulders "+"knees toes "*2)*2+"eyes ears mouth nose ")*2/" ")[.%22]' <<< 1000
knees

Он-лайн тест (пропуск -rчерез URL не поддерживается - проверьте Raw Output самостоятельно.)

manatwork
источник
2

WinDbg, 207 157 151 байт

ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41

-50 байтов за счет кодирования смещения / длины частей тела в виде символов ascii.

-6 байт, используя локальную переменную при поиске смещения / длины.

Ввод осуществляется с помощью значения, установленного в псевдорегистре $t0.

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

* Initialization, writes this string at address 0x2000000. The nonsense after the body parts
* are the offsets and lengths of the body parts in the first part of the string, each of
* which is incremented by 0x41 to make it a printable ascii character.
ea 2000000 
        "headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";


* Display the output:
r$t4=(@$t0%16)*2+2000027
da1FFFFBF+by(@$t4) Lby(@$t4+1)-41

* Display output explanation:
r $t4 = (@$t0%16)*2+2000027   * Set $t4 = input, @$t0, mod 22, doubled +0x2000027
by(@$t4)                      * byte_at(@$t4)-0x41 is the {Offset} into the string 
                              * for the start of output. The -0x41 is already subtracted
                              * from 0x2000000 to make 0x1FFFFBF.
Lby(@$t4+1)-41                * byte_at(@$t4+1)-0x41 is the {Length} of the output.
da 1FFFFBF+{Offset} L{Length} * Display {Length} chars from {Offset} of the above string.

Пример вывода:

0:000> r$t0=0
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000000  "head"


0:000> r$t0=1
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000004  "shoulders"


0:000> r$t0=7
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000004  "shoulders"


0:000> r$t0=0n13
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200001a  "ears"


0:000> r$t0=0n20
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"


0:000> r$t0=0n35
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200001a  "ears"


0:000> r$t0=0n37
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000023  "nose"


0:000> r$t0=0n98
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"


0:000> r$t0=0n543
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000023  "nose"


0:000> r$t0=0n1000
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"
молоко
источник
2

PHP, 91 102 118 128 129 байт

<?=[head,shoulders,knees,toes,eyes,ears,mouth,nose]['0123230123234567012323'[$argv[1]%22]];

0-индексированные

Вплоть до 91 после удаления str_split, не понимал, что строки PHP были доступны как массив символов (вещь PHP 5+?)

До 102 благодаря предложению insertusername для удаления строковых кавычек и разрешения уведомлений

CT14.IT
источник
-16 байт: удалить все 'вокруг слова, как 'head'становится и headт.д.
insertusernamehere
Не уверен, что правила с этим, но с установкой PHP по умолчанию, я получаю ожидаемые неопределенные постоянные предупреждения при этом
CT14.IT
1
Да, но это абсолютно нормально с правилами сайта. Уведомления и предупреждения можно игнорировать.
имя пользователя здесь
@ CT14.IT, это не предупреждение, это уведомление. «PHP 5.3 или более поздняя версия, значением по умолчанию является E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Этот параметр не отображает ошибки уровня E_NOTICE, E_STRICT и E_DEPRECATED. »- документация PHP оerror_reporting .
manatwork
1
Похоже, что str_split () бесполезен
Crypto
1

Желе , 55 байт

“¥ḷne“¥ṇṭḲ»ẋ2ṭ“¢1$“@⁼5⁼»µẋ2;“¥ḳVo“¥ḳ'k“£Qo“£³ạ»;⁸FḊḲ
ị¢

Попробуйте онлайн! (Индекс на основе 1)

Давай! В самом деле?

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

“¡¦ṡb[wfe=⁺żɦ4Gƈġhḳ"ẇ⁴ż>oH¹8ṡʠʠḟṀUṿḶ>¬Þ:ĖẇrṗṁɼlDṫỤ¬ȷ⁶Dḥci*⁻³GḲOÞạṖṃ\»

Оба кодируют эту строку:

head shoulders knees toes knees toes head shoulders knees toes knees toes eyes ears mouth nose head shoulders knees toes knees toes

Угадай, мне пора идти сейчас

Эрик Outgolfer
источник
1

Powershell, 91 байт, с нулевым индексом

$a='head shoulders '+'knees toes '*2;($a*2+'eyes ears mouth nose '+$a).Split()[$args[0]%22]

Очень простой подход - генерировать массив первых 22 элементов, используя, где это возможно, умножение строк, компилируя их с пробелами и разделяя в конце. (расщепление на 2 байта короче, чем эквивалентная установка в виде массива), затем просто найдите точку в этом массиве, используя модуль ввода, не совсем интересный или зависящий от языка.

Прецедент:

PS C:\++\golf> 0..1000|%{.\hskt $_}
head
shoulders
knees
toes
knees
toes
head
shoulders
knees
toes
knees
toes
eyes
ears
mouth
nose
head
shoulders
knees
toes
knees
toes
head
shoulders
knees
toes
....

и т.п.

colsw
источник
1

рубин, 81 байт

Лямбда-функция, использующая нулевую индексацию.

->n{("head shoulders#{" knees toes "*2}eyes ears mouth nose".split*2)[n%22-6&15]}

объяснение

Мы генерируем следующий массив, из которого мы используем первые 16 элементов, покрывающих правильные строки 2,3,4 песни:

%w{head shoulders knees toes knees toes
   eyes ears mouth nose
   head shoulders knees toes knees toes

   eyes ears mouth nose}                  #last 4 elements not used

Мы берем n по модулю 22, чтобы свести его к одному стиху, затем вычитаем 6. Теперь индекс 6 (например) был изменен на 0 и указывает на правильное слово. Индексы 0..5, которые указывают на первую строку песни, теперь отрицательны. Мы используем &15(идентично, %16но избегаем необходимости в скобках), чтобы отобразить 1-ю строку песни на 4-ю строку. Таким образом индекс 0-> -6->10

в тестовой программе

f=->n{("head shoulders#{" knees toes "*2}eyes ears mouth nose".split*2)[n%22-6&15]}

#call as below to test index 0..43
44.times{|i|p f[i]}
Уровень реки St
источник
Интересная формула индекса. Но такая же длина может быть достигнута без него:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Манатворк
1

Befunge, 129 119 байт

0 индексированные

&29+2*%:2/v>00p>%#7_v
+%2\-"/"g2<|<:-1g007<"head*shoulders*knees*toes*eyes*ears*mouth*nose"p00
02202246022>$$:>7#:%#,_@

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

объяснение

Как указал Арно , слова идут парами, поэтому у нас есть индекс всего из 11 значений, а затем добавляем слово номер% 2, чтобы получить соответствующее слово в паре. Слова помещаются в стек как одна строка, разделенная звездочками, чтобы сэкономить место. Мы проверяем разрывы слов, принимая значение char по модулю 7, поскольку только звездочка кратна 7.

&29+2*%               n = getint() % 22             // % 22 to ensure it's in range
:2/2g                 i = index_array[n/2]          // we use n/2 because words are paired
-"/"                  i -= '/'                      // convert from ASCII to 1-based value
\2%+                  i += n%2                      // get the correct word in the pair
00p                   index = i                     // save for later

"head*shoulders*knees*toes*eyes*ears*mouth*nose"    // push all the words onto the stack

700g1-:|              while (index-1 != 0) {        // the 7 is used in the drop loop   
  00p                   index = index-1             
  >%#7_                 do while (pop() % 7)        // drop up to the next '*' (%7==0)
                      }                    

$$                    pop();pop()                   // get rid of index and extra 7

: 7 % _               while ((c = pop()) % 7)       // output up to the next '*' (%7==0)
 > : ,                  putchar(c)
Джеймс Холдернесс
источник
1

SQL 2005 747 байт

Golfed:

GO
CREATE PROCEDURE H @n INT AS BEGIN IF NOT EXISTS(SELECT*FROM R)BEGIN INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('eyes')INSERT INTO R VALUES('ears')INSERT INTO R VALUES('mouth')INSERT INTO R VALUES('nose')INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')END SELECT W FROM R WHERE I=@n%22 END

Ungolfed:

GO
CREATE PROCEDURE H
@n INT 
AS 
BEGIN IF NOT EXISTS(SELECT*FROM R)
BEGIN 
INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('eyes')INSERT INTO R VALUES('ears')INSERT INTO R VALUES('mouth')INSERT INTO R VALUES('nose')INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')
END 
SELECT W FROM R WHERE I=@n%22 END

Нужна таблица вроде этой, где первый столбец автоматически увеличивается:

введите описание изображения здесь

Это одноиндексный ответ. Таблица заполняется при первом создании хранимой процедуры - это не позволило бы мне выполнить все INSERTв одном выражении, к сожалению, эта функция доступна только в >=SQL 2008. После этого он использует %22трюк из других ответов. После заполнения таблицы используется только последняя часть:

SELECT W FROM R WHERE I=@n%22

Input:  Output:
R 1       head
R 2       shoulders
R 8       shoulders
R 14      ears
R 21      knees
R 36      ears
R 38      nose
R 99      knees
R 54      nose
R 1001    knees
Пит Арден
источник
" это не позволило бы мне сделать все вставки в одном утверждении " почему? Разве не должно быть что-то подобное в SQL после 2008 года?
Кевин Круйссен
@KevinCruijssen Я использую SQL Server 2008 R2, поэтому это странно ... Я только что сделал еще несколько поисков в Google, по-видимому, это как-то связано с "уровнем совместимости" базы данных, который я только что попробовал и потерпел неудачу изменить - он установлен на 2005, и это максимальное значение, поэтому он не имеет этой функции. Должен ли я либо указать версию SQL в своем ответе, либо удалить ответ, если его нельзя правильно укоротить? Потрошенный как это спасло бы меня много текста ...
Пит Арден
Либо я в порядке, так что это ваш звонок. Лично я обычно играю в гольф в Java 7, который я указываю, потому что в большинстве случаев более короткие ответы доступны в Java 8. Вы можете указать это 2005 таким же образом.
Кевин Круйссен
@KevinCruijssen Да, я видел людей, которые делают это для Java и Python. Не очень хотелось бы внести изменения, не имея возможности протестировать код, поэтому я укажу 2005, ура :)
Пит Арден
1

Баш (с ред.), 83 символа

1-индексированных

ed<<<"a
head
shoulders
knees
toes
eyes
ears
mouth
nose
.
3,4t4
1,6y
6x
$(($1%22))"

Образец звонка:

 $ bash test.sh 1001
 knees
Адам
источник
1

постоянный ток , 135 байт

6[head]6[:add6-r;ar:adA+r;ar:a]dshx7[shoulders]7lhx8[knees]8lhxA 2;aAlhx9[toes]9lhxB 3;aBlhx[eyes]C:a[ears]D:a[mouth]E:a[nose]F:a22%;ap

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

Массивы 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извлечь его из массива и распечатать.

brhfl
источник
0

C # 6, 138 байт

string F(int i)=>(i+10)%22<4?"eyes,ears,mouth,nose".Split(',')[(i+10)%22%4]:"head,shoulders,knees,toes,knees,toes".Split(',')[(i+6)%22%6];

repl.it demo

Ungolfed + комментарии:

string F(int i)=>
    // Is it eyes/ears/mouth/nose?
    (i+10)%22<4
        // If yes, then set index to 4-word line and take modular 4
        // String array constructed by splitting comma-delimited words
        ? "eyes,ears,mouth,nose".Split(',')
            [(i+10)%22%4]
        // Else set index to last 6-word line and take modular 6
        : "head,shoulders,knees,toes,knees,toes".Split(',')
            [(i+6)%22%6];
Ссылка Ng
источник
Вы можете объединить строку и использовать один 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 байт )
Кевин Круйссен
0

Excel, 146 байт

=MID("Head     ShouldersKnees    Toes     Eyes     Ears     Mouth    Nose",CHOOSE(MOD(MOD(MOD(B1+16,22),16),10)+1,1,10,19,28,19,28,37,46,55,64),9)

Использует @ Neil's MOD(MOD(MOD(B1+16,22),16),10)для сохранения 15байтов.

Wernisch
источник