Хоч торо, хоч Торо кинув, Тролл кидає через жорсткі корита


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 байти збережено завдяки користувачеві23013

Спробуйте його онлайн тут


Як ми повинні спробувати це? (не всі говорять CJam, деякі з нас говорять lolcode)
Behrooz

@Behrooz Є посилання. Клацніть на ньому, введіть свої дані у розділ введення, Виконати. Не впевнений, як це може бути простіше :)
Оптимізатор

Холлі дерьмо, я думав, як я повинен дати йому список слів. приємний
Behrooz

1
@ user23013 Чорт! Кожен раз!
Оптимізатор

2
Або q1b2+B%.
jimmy23013

18

Pyth, 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.


Чи не буде цього неправдивим?
Олександр-Бретт

5
@ alexander-brett Що саме ти маєш на увазі? Вихід усіх інших входів не визначений в ОП. Ми можемо вивести все, що завгодно.
Якубе

Вибачте, я пропустив цю редакцію в ОП. Це прикро: 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, хоча через ретельний кидок Торео в такому порядку перекинув жорсткого троля . Якщо вхід не знайдено, знахідка поверне -1, що зручно перетворюється на нуль після значення +1.


Зауважте, що цей 0матеріал більше не потрібен. Вибачте, що змінили його на вас.
Захоплення Кальвіна

Дякуємо, що помітили зусилля. Це було гарне рішення на деякий час ...
Логічний лицар

3
@CarpetPython Приємне використання розподілу підлоги - це виходить напрочуд акуратно.
xnor

7

Python 2.7.9 32-бітна версія, 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


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 число. Потім беремо цей mod 31, віднімаємо 1 і беремо результат mod 10. Еквівалентний псевдокод:

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

Демонстрація , тест-джгут .


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

1

Japt , 6 байт

nH %BÉ

Спробуйте | Перевірте всі слова


Пояснення

Скористається тим, що при аналізі базового nрядка на ціле число JavaScript зупинить розбір, якщо він зустрічає цифру більше, nі поверне результат до цього моменту. Використовуючи тут (цифри 0-v) base-32, ws в "кинув" і "кинути", по суті, ігнорується.

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

Java 8, 53 25 байт

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

або

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

Порт відповіді CJam @Optimizer, оскільки він (швидше за все) не може бути виконаний коротше на Java.

Спробуйте в Інтернеті.


У Java є parseInt, чи не так? Чи порт мого рішення не буде коротшим?
Кудлатий

@Shaggy Java справді має parseIntбазу, але, на жаль, досить байтовий через вимогу статичного класу: Long.parseLong(...,32)як найкоротший варіант. До того ж, схоже"throw""threw" , це не вдається навіть) у Java чомусь . wзнаходиться поза діапазоном базової 32, як видається (а використання 33 дає невірні результати).
Кевін Кройсейсен

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.