ПРОБЛЕМА
Учитывая два слова, найдите победителя в битве цифровых корней .
Определите цифровой корень слова следующим образом:
- Каждой букве алфавита присваивается номер: A = 1, B = 2, C = 3, ..., Z = 26
- Добавьте значения для каждой буквы, чтобы суммировать слово. Возьмите "CAT", например. C + A + T = 3 + 1 + 20 = 24
- Добавьте все одиночные цифры, которые составляют этот результат: 24 => 2 + 4 = 6
- Повторяйте шаг № 3, пока не достигнете одной цифры. Эта единственная цифра является цифровым корнем слова.
Правила:
- Победитель объявляется, если его цифровой корень больше другого.
- Если значения цифрового корня равны, сократите слова, удалив каждый экземпляр буквы с самым высоким значением из обоих слов и произведя пересчет.
- Повторяйте шаги № 1 и № 2 до тех пор, пока не останется победитель или в одном из слов не останется только одна буква (или нет букв).
- Если значения цифрового корня равны после прохождения процесса сокращения, более длинное слово объявляется победителем.
- Если слова имеют одинаковую длину и победитель не найден после прохождения процесса сокращения, победитель не объявляется.
Особые правила:
- Не допускается использование модуля при расчете самого цифрового корня . Это может быть использовано где-либо еще.
- Предположим, что слова будут состоять только из заглавных букв - без знаков препинания, без пробелов и т. Д.
ВХОД
Потяните слова через стандартный ввод (через запятую). Параметры метода, или как вы хотите. Укажите в своем решении или коде, как слова анализируются или готовятся.
ВЫХОД
Показать победное слово. Если победителя нет, выведите «STALEMATE».
Примеры:
Intput: CAN, BAT
CAN = 18 = 9
BAT = 23 = 5
выход: CAN
вход: зоопарк, нет
ZOO = 56 = 11 = 2
NO = 29 = 11 = 2
OO = 30 = 3
N = 14 = 5
выход: НЕТ
ОБНОВЛЕНИЕ : входные данные должны быть прочитаны с использованием стандартного ввода со словами в виде строки через запятую.
ОБНОВЛЕНИЕ : Добавлена пара примеров для проверки.
ОБНОВЛЕНИЕ : разъяснено удаление буквы с самым высоким значением в случае связи - это также немного меняет условие остановки - если слово состоит из одной буквы или нуля букв, процесс сокращения останавливается
источник
Ответы:
J, 100
работает так:
не все же принимают входные данные точно так , как просили.
источник
APL (Дьялог) (
9186)Пояснение (в порядке исполнения):
⎕ML←3
: установите ML в 3 (это делает⊂
среднее разделение, между прочим).G←Z⊂⍨','≠Z←⍞
: чтение ввода, разделение запятыми, сохранение в G и переход к функции.+/¨⎕A∘⍳¨⍵
: рассчитать оценку для каждого слова. (⎕A
это список, содержащий алфавит.)Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨
: вычислить цифровой корень для каждой оценки (суммируя все цифры до тех пор, пока есть еще одна цифра) и сохраняя их в Z.Z≡∪Z
: если все оценки уникальны ...:G[↑⍒Z]
: ... затем выведите слово с наибольшим количеством очков (из исходного списка).⋄1∊↑¨⍴¨⍵:'STALEMATE'
: в противном случае (если есть связь), если одно из слов имеет длину 1, выведите STALEMATE.⋄∇1∘↓¨⍵
: в противном случае уберите первую букву из каждого слова и снова запустите функцию.источник
Рубин - 210
тесты:
источник
d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}
."If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
Haskell, 205 символов
Образцы прогонов:
w
, импортированный более старый, более короткий модульисточник
',':b
→_:b
(-2), если вы не слишком привязаны к многострочной обработкеinteract$unlines.map([...]).lines
→putStr.[...]=<<getLine
(-11), если вы позволяете себе ослаблять выводputStr
→print
(-1). Я ненавижу эту операцию отрицания, принимающую так много символов, но не могу найти обходной путь.Perl, 224
225229Базовый гольф (пока ничего умного):
Perl 5.10 и выше, запустить с
perl -M5.010 <file>
илиperl -E '<code here>'
источник
К, 106
Использует обработку исключений, чтобы перехватить ошибки стека, которые приводят к тупиковой ситуации.
источник
VBA (
242462)Оказывается, приведенный ниже код не соответствует спецификации, поэтому мне пришлось переделать, добавив много длины (см. Выше). : / / Это может быть возможно в дальнейшем играть в гольф, но это уже довольно компактно, и я сомневаюсь, что смогу вернуть его к соревновательному счету.
Оригинал (ниже) не удалял наиболее ценные буквы из слов, когда был галстук.
источник
Это действительно пришло мне в голову, и это мой первый пост. Хотя он старый, я заметил, что никто не сделал версию php, так что вот моя.
534 персонажа.
Теперь я не уверен относительно правил запуска, поэтому я начал с $ f = 'CAN, CBN' в качестве ввода. Я надеюсь, что это было правильно. Я выполнил все тесты, и он прошел все из них, хотя это не особенно элегантно. Я действительно должен немного поспать сейчас, но мне было очень приятно работать над этим - спасибо за отличную головоломку.
Кодировано на http://codepad.org/ZSDuCdin
источник
$f=trim(fgets(fopen('php://stdin')));
для ввода данных.$w=fgetcsv(STDIN);
работает лучше.D: 326 символов
Более разборчиво:
источник
Mathematica
Некоторые детали по-прежнему отсутствуют
источник
Mathematica
220207Написав это, я заметил, что это следует тем же рассуждениям, которые использовал Велисарий,
использование
Поскольку ответ не является конкурентным (будучи таким многословным), я решил использовать формат ввода, более близкий к Mathematica.
источник
CoffeeScript - 335
Не так доволен этим, как мог бы, но я все равно с этим справлюсь. Фактическая оценка очень краткая (
y
функция), ноif
сравнивать результаты (вz
) довольно долго.Чтобы использовать это, позвоните
z
с двумя словами (напримерz 'FOO','BAR'
). Он забьет оба слова и вернет слово с более высоким баллом. Если это галстук, он будет повторяться с измененными словами (сохраняя оригиналы, чтобы в конечном итоге вернуть, следовательно, дополнительные два параметра), которые он получает изx
функции.Эквивалентный (расширенный) javascript для интересующихся:
источник
Ракетка 479 байт
Ungolfed:
Тестирование:
Выход:
источник
PHP,
339(без спецификации),410382359339337 байтРЕДАКТИРОВАТЬ 1 : +71 байт. Использование
STDIN
вместоfopen('php://stdin','r');
и коротких тегов. Также полное соответствие спец.РЕДАКТИРОВАТЬ 2 : -28 байт. Используя
fgetcsv(STDIN)
вместоexplode(',',trim(fgets(STDIN)))
, и использовалfor
цикл вместоwhile
цикла.РЕДАКТИРОВАТЬ 3 : -23 байта. Объединенные функции
a
иb
объединенные для циклов.РЕДАКТИРОВАТЬ 4 : -20 байт. Превратился
c
из рекурсивного в петлю. Затем удалили функциюc
и поместили ее код в глобальное пространство имен.РЕДАКТИРОВАТЬ 5 : -2 байта. Спасибо @Titus за
-r
флаг.источник
-r
флагомДЖАВА
источник
C ++, 473 (я заимствую курс железа)
Я уверен, что мог бы как-то сократить его, но я устал.
Редактировать: первоначально принял аргумент командной строки, модифицированный для использования cin. Вероятно, теперь это на несколько символов длиннее, но я слишком устал, чтобы пересказывать это.
источник
Python: 383 символа
запустите функцию
c('CAN','BAT')
:источник
F #,
559533530 байтПока не конкурентоспособен. Я уверен , что с может быть короче, а также последние несколько строк. Отсутствие более легкого доступа к аргументам командной строки также вредит.
Попробуйте онлайн!
Неуправляемая версия
источник
PHP,
296 281267 байтзапустить
-n
или попробовать онлайн (TiO включает разбивку).В феврале 2011 года текущая версия PHP была 5.3.5; так что я не мог
[$a,$b]=fgetcsv(...)
и такое)count_chars
встроенный псевдонимsubstr
Но ни один не спас бы много; так что это не имеет большого значения.
Самыми дорогостоящими вещами были циклы (конечно) и правило № 4 (
4036 байт).источник