Несмотря на то, что Торо бросил, Тролль бросает через жесткие корыта

19

Каждому из этих девяти схожих до смешного слов присвойте число 1-9 любым удобным для вас способом:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

Напишите программу, которая принимает строку. Если вход является одним из этих девяти слов, выведите номер, который вы ему присвоили. Если ввод не является одним из слов выше, программа может делать что угодно (включая ошибку или цикл навсегда).

Слова чувствительны к регистру, например Thoreau, должны давать число от 1 до 9, но thoreauне обязательно будут делать то же самое.

пример

Предположим, вы назначаете номера следующим образом:

though   9
through  2
thorough 7
Thoreau  6
throw    3
threw    5
trough   4
tough    1
troll    8

Затем, когда toughввод, 1должен быть вывод.
Когда throughввод, 2должен быть вывод.
Когда throwввод, 3должен быть вывод.
, , ,
Когда thoughввод, 9должен быть вывод.

Все остальные входы могут делать что угодно.

Детали

  • Возьмите входную строку через stdin или командную строку и выведите ее в stdout.
  • Вывод может содержать один завершающий перевод строки.
  • Вместо программы вы можете написать функцию, которая принимает строку и обычно печатает результат или возвращает его.
  • Самая короткая подача в байтах побеждает .
Кальвин Хобби
источник
1
Слей это! У меня было умное решение для вывода нуля, когда не найден с помощью findметода строки Python . Затем правила изменились. Умная идея теперь не такая умная.
Логика Найт
@CarpetPython Мой плохо на самом деле. Не стесняйтесь понижать голосование, если вы чувствуете себя неудовлетворенными изменениями. (Хотя я обещаю всем, что больше никаких изменений не будет.)
Увлечения Кэлвина
Ничего страшного. Я думаю, что мой ответ все еще действителен (хотя я немного многословен).
Логика Рыцарь
Могу ли я заставить его работать независимо от капитализации?
ASCIIThenANSI
2
@ASCIIThenANSI до тех пор, пока это работает для 9 случаев
Хобби Кельвина

Ответы:

19

CJam, 11 9 7 байт

q1b2+B%

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

Мы используем тот факт, что сумма кодов ASCII + 2, смоделированных с 11, дает очень хороший порядок от 1 до 9, а затем 10 для девяти рассматриваемых слов. Вот заказ:

through -> 1
thorough -> 2 
tough -> 3 
Thoreau -> 4 
throw -> 5 
threw -> 6 
trough -> 7 
though -> 8 
troll -> 9

Объяснение кода :

q               e# Read the input
 1b             e# Sum the ASCII code values of all characters in this word
   2+           e# Increment the sum by 2
     B%         e# Mod by 11 and automatically print the mod result at the end

4 байта сохранены благодаря user23013

Попробуйте онлайн здесь

оптимизатор
источник
Как мы должны это попробовать? (не все говорят на CJam, некоторые из нас говорят на lolcode)
Behrooz
@Behrooz Есть ссылка. Нажмите на него, поместите свой ввод в раздел ввода, Выполнить. Не уверен, как это может быть проще :)
Оптимизатор
Холли дерьмо, я думал, как я должен дать ему список слов. хороший
Behrooz
1
@ user23013 Черт! Каждый раз!
Оптимизатор
2
Или q1b2+B%.
jimmy23013
18

Пиф, 8 символов

e%Cz8109

Попробуйте онлайн: демонстрация или тестовый набор

Я использую назначение:

though   5
through  9
thorough 4
Thoreau  7
throw    3
threw    2
trough   8
tough    6
troll    1

Объяснение:

   z       input()
  C        convert to int (convert each char to their ASCII value
           and interprete the result as number in base 256)
 %  8109   modulo 8109
e          modulo 10

Кстати, я нашел магическое число 8109, используя этот скрипт: fqr1 10Sme%CdT.z1.

Jakube
источник
Не будет ли это ложных срабатываний?
Александр-Бретт
5
@ alexander-brett Что именно ты имеешь в виду? Выход всех других входов не указан в OP. Мы можем вывести все, что захотим.
Якуб
Извините, я пропустил это редактирование в ОП. Это позор: P
Александр-Бретт
11

Python 2, 92 54 байта

print'K{7j)yE<}'.find(chr(hash(raw_input())%95+32))+1

Строка индекса создается с помощью for word in words: print chr(hash(word)%95+32),. Как указано в ответе Якуба, хеш-функция будет давать разные результаты в зависимости от версии Python. Эта индексная строка рассчитана на 64-битном Python 2.7.6.

Более длинный (92 байта), но менее загадочный ответ:

print'though through thorough Thoreau throw threw trough tough troll'.find(raw_input())/7+1

Программы возвращают 1-9, хотя через тщательный бросок Торо бросил корыто жесткого тролля в этом порядке. Когда вход не найден, find вернет -1, что удобно превращается в ноль после +1.

Логика Найт
источник
Обратите внимание, что 0материал больше не требуется. Извините, что изменил это на вас.
Увлечения Кэлвина
Спасибо за внимание к усилиям. Некоторое время это было хорошим решением ...
Логик Найт
3
@CarpetPython Хорошее использование разделения пола - все работает на удивление аккуратно.
xnor
7

32-битная версия Python 2.7.9, 22 байта

lambda x:hash(x)%78%10

Обратите внимание, версия действительно важна здесь. Вы получите другие результаты, если вы используете 64-битную версию Python. Поскольку hashметод будет вычислять 64-битные хеш-значения вместо 32-битных.

Назначение:

though  => 5   through => 6   thorough => 8
Thoreau => 7   throw   => 3   threw    => 1
trough  => 9   tough   => 4   troll    => 2

Попробуйте онлайн: http://ideone.com/Rqp9J8

Jakube
источник
2
Вау, так все это время вы перебирали языковые версии и биты операционной системы? : P
Оптимизатор
1
Очень хороший ответ. Вы нашли константу 78 с помощью математики, автоматизированной итерации или каких-то догадок?
Логика Найт
3
@CarpetPython Просто простой перебор, который проходит через все возможные модули. Однажды sorted(...)==range(1,10)я остановился.
Якуб
5

Pyth, 7 байт

et%Cz31

Я использую следующее назначение:

though   8
through  3
thorough 1
Thoreau  5
throw    4
threw    7
trough   6
tough    2
troll    9

Czинтерпретирует ввод как базовое 256 число. Затем мы берем этот мод 31, вычитаем 1 и получаем результат мод 10. Эквивалентный псевдокод:

((base_256(input()) % 31) - 1) % 10

Демонстрация , проверка жгута .

isaacg
источник
1

Python 2, 27 байт

f=lambda w:int(w,34)%444/46

С этим назначением:

>>> for w in "though through thorough Thoreau throw threw trough tough troll".split(): print f(w),w
...
9 though
7 through
3 thorough
8 Thoreau
2 throw
5 threw
6 trough
1 tough
4 troll

Возможны несколько вариантов, например

f=lambda w:int(w,35)/159%10
ygramul
источник
1

Japt , 6 байт

nH %BÉ

Попробуй это | Проверьте все слова


объяснение

Использует тот факт, что при разборе базовой nстроки до целого числа JavaScript прекратит синтаксический анализ, если встретит цифру больше, чем nи вернет результат до этой точки. При использовании base-32 здесь (цифры 0-v) ws в «threw» и «throw», по сути, игнорируются.

nH      :Convert from base-32
   %B   :Modulo 11
     É  :Subtract 1

JavaScript, 22 байта

Прямой перевод - не стоит размещать его отдельно.

f=
U=>parseInt(U,32)%11-1
o.innerText=["through","tough","troll","trough","though","throw","threw","thorough","Thoreau"].map(s=>f(s)+": "+s).join`\n`
<pre id=o><pre>

мохнатый
источник
0

C (gcc) , 66 байт

h,k;f(char*s){for(h=33;*s;)h^=*s++;h=strchr(k="(Z5qW]2@H",h)-k+1;}

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

gastropner
источник
Может потребоваться -Oфлаг компилятора. h;f(char*s){for(h=33;*s;)h^=*s++;h=index("(Z5qW]2@H",h)-"H"+9;}
потолок кошка
0

Java 8, 53 25 байт

s->(s.chars().sum()+2)%11

или

s->-~-~s.chars().sum()%11

Порт ответа CJam @Optimizer, потому что это (скорее всего) не может быть сделано короче в Java ..

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

Кевин Круйссен
источник
Ява имеет parseInt, не так ли? Разве порт моего решения не будет короче?
Лохматый
@Shaggy Java действительно имеет parseIntс заданной базой, но, к сожалению, она является чрезмерно байтовой из-за требования статического класса: Long.parseLong(...,32)как самый короткий вариант. Кроме того, кажется"throw""threw" , что по какой-то причине он не работает также) в Java . wкажется, что находится вне диапазона base-32 (а использование 33 дает неверные результаты).
Кевин Круйссен