Ваша задача, если вы решите принять ее, - создать функцию или программу, которая выдает «да», если данное число делится на 13, и выдает «нет», если это не так.
Правила:
- Вы не можете использовать номер 13 в любом месте.
- Никаких синонимов для 13 тоже нет (как при использовании 15 - 2).
- Бонусные баллы будут начисляться за неиспользование модуля, дополнительный бонус за неиспользование деления.
Подсчет очков:
- Ваша оценка будет число байт в коде (пробелы не включены) , умноженный на ваш бонус.
- Если вы не использовали модуль, этот бонус составляет 0,90; если вы не использовали деление, этот бонус составляет 0,90.
- Если вы не использовали ни один, этот бонус составляет 0,80.
- Чем ниже ваш счет, тем лучше.
Ввод всегда будет целым числом больше 0 и меньше 2 ^ 32.
Ваш вывод должен быть простым «да» или «нет».
Пояснения:
- Использование какого-либо окольного метода генерации числа 13 для использования является приемлемым. Простые арифметические синонимы, такие как (10 + 3), не допускаются.
- Функция или программа должны буквально выводить «да» или «нет», если данное число делится на 13.
- Как всегда, разумные решения рекомендуются, но не обязательны.
источник
function f(n){return "yes"}
. Это вернет «да» для всех чисел, которые можно разделить на 13Using some roundabout method of generating the number 13 for use is acceptable.
Как вы определяете, что такое "достаточно окольный"?Ответы:
Ява (оценка
60,859,2)Оценка: (76 - 2 пробела) символы * 0,8 = 59,2
источник
println
->print
?ASM - 16 бит x86 на командной оболочке WinXP
исполняемый файл - 55 байт * 0,8 = 44
источник - 288 символов * 0,8 = 230,4
Число 13 даже не появляется в собранном файле .com.
Соберите используя A86.
источник
The input will always be an integer greater than 0 and less than 2^32
. Вы не можете использовать 16 битPython 3.x: 54 * 0.8 = 43.2
Это может быть отговорка, чтобы иметь строку длиной 13, но здесь это идет:
Он работает путем построения строки из n пробелов (выбор разделителя является произвольным, но я выбрал пробел по очевидным причинам) и разбиения подстрок из 13 пробелов, пока не останется строка, содержащая n% 13 пробелов.
источник
print 'yneos'[any((' ' * input()).split(' '))::2]
' '
с ,' '*6+' '
чтобы сохранить 5 символов - но потом я обнаружил , что пространства не рассчитывать на всех ...GolfScript, 32 символа
Я хотел попробовать что-то отличное от всех остальных, поэтому мое решение вычисляет цифровой корень числа 14 из базы путем многократного преобразования числа в основание 14 и суммирования цифр, пока результат больше не станет меньше. По сути, это то же самое, что и вычисление остатка по модулю 13, за исключением того, что результат будет в диапазоне от 1 до 13 вместо 0 до 12.
Поскольку проверка, равен ли цифровой корень 13, будет затруднена без использования самого числа 13 (или какого-то неудачного обходного пути, такого как 12 + 1), я фактически увеличиваю входное число на единицу перед циклом и уменьшаю результат после. Таким образом, результат для чисел, кратных 13, фактически будет равен нулю, что гораздо проще проверить.
Вот прокомментированная версия программы:
Эта программа будет фактически обрабатывать любые неотрицательные целочисленные входные данные, так как GolfScript использует арифметику bignum. Конечно, очень большие входы могут потреблять чрезмерное время и / или память.
В коде не используются ни модули, ни деление напрямую, хотя он использует базовый оператор преобразования GolfScipt, который почти наверняка выполняет некоторое деление и взятие остатков внутри. Я оставлю это на GigaWatt, чтобы решить, соответствует ли это мне бонусу или нет.
источник
С 68 * 0,8 = 54,4
После 24 ответов никто еще не придумал этот очевидный алгоритм:
источник
JavaScript (27,9)
Текущая версия (31 символ * 0,90 бонуса = 27,9).
Демо: http://jsfiddle.net/9GQ9m/2/
Редактировать 1: отказаться от второго бонуса, используя модуль, чтобы значительно снизить счет и избежать
for
петли. Также исключите~~
и сохраните два символа (спасибо@copy
).Старая версия (48 символов * 0,80 бонуса = 38,4)
источник
~~
допустимый ввод данных; иначеprompt()<<1
тоже будет работать.Brainfuck
Оценка: 200 * 0,8 = 160
Читает со стандартного ввода. Вероятно, не самое умное решение, но получить все, что работает в BF, приятно. Это довольно компактно, хотя.
источник
Скала (38 * 0,9 = 34,2)
Аналогично
0xD
(hex) или015
(oct).Значение ASCII
CR
составляет 13.источник
Haskell, 28 * 0,8 = 22,4
источник
Python:
Например
дает
источник
20
)f=lambda n:pow(8,n,79)-1 and "no" or "yes"
исправляет это, 43 * 0,8 = 34,4С 54,4 == 68 * .8
80 * .8источник
\r
- я думал, что это хорошо только для поддержки Windows. Но почему,c>0
когдаc
будет делать?>0
ничего хорошего. Но вместо того, чтобы заметить, что ваша функция их не поддерживает, я подумал, что==
это хорошо.ECMAScript 6, 25 × 0,9 = 22,5
Да, это скучный способ получить 13.
источник
APL ((21 - 1) × 0,8 = 16)
⎕IO
для правильной работы в Dyalog APL должно быть установлено значение 0. Для получения 13 возьмем пол (⌊
) натурального логарифма (⍟
) 9 в степени 6 (9*6
). После этого мы находим GCD (∨
) наших input (⎕
) и 13, а затем проверяем, равно ли это 1. Это используется для индексации ([...]
) вектора ответов.Если кто-то хочет быть педантичным в отношении упоминания байтов в спецификации оценки, оценка для зашифрованной версии UTF-8 такова
(29 - 1) × 0.8 = 22.4
. :)источник
С, 88
Трюк Фибоначчи.
источник
Perl - 44 × 0,8 = 35,2
Считая Шебанг одним байтом.
Я немного опоздал с игрой, но подумал, что поделюсь алгоритмом, так как другие посты к этому моменту не использовали его.
Это работает при наблюдении, что если n делится на 13 , то ⌊ n / 10 ⌋ + n% 10 * 4 также делится на 13 . Значения 13 , 26 и 39 переключаются на себя. Все другие кратные 13 , в конечном счете достигнет одного из этих значений не более чем лог 10 п итераций.
В других базах
По общему признанию,
chop
это немного отговорка. С базовым представлением 10 это эквивалентноdivmod
. Но алгоритм отлично работает в других базах, например, в базах 4 или 8.Псевдокод Python в стиле вышеприведенного алгоритма (база 10):
В базе 2:
В базе 4:
В базе 8:
и т. д. Любая база меньше 13 работает одинаково хорошо.
источник
Javascript: 59 * 0,8 = 47,2 (?)
скрипка :
Включая улучшение мелламокба (57 * 0,8 = 45,6):
источник
return n-c?'no':'yes'
пропуски и пропустив вторую точку с запятой.prompt
для ввода иalert
вывода, что делает программу интерактивной и экономит несколько символов.Perl: (51-4 пробела) * 0,9 = 42,3
источник
Perl (19,8)
21 байт * .9
примечание: моя первая Perl-программа. Полагаю, слабо набрано для гольфа.
источник
в C (K & R): 47 * 0,8 = 37,6
EDIT1: хорошо, удалили все зависимости от внешних функций, вышеописанное будет работать до тех пор, пока вы поместите эту строку в 13-ю строку файла! :) Если
__LINE__
можно заменить на скажем,0xd
можно сохранить еще 5 символов (оценка: 33,6)источник
J - 22,4 = 28 * 0,8
Основан на умном циклическом методе mxmul .
Примеры:
источник
JavaScript (108 меньше 0 для пробелов) => 108, x 0,8 (без модуля, без деления) = 86,4
b=b=>{a=z,a=a+"";return+a.slice(0,-1)+4*+a.slice(-1)};z=prompt();for(i=99;i--;)z=b();alert(b()-z?"no":"yes")
Этот метод использует следующий алгоритм: 1. Возьмите последнюю цифру, умножьте ее на четыре, добавьте к остальному усеченному числу. 2. Повторите шаг 1 для 99 итераций ... 3. Протестируйте его еще раз, используя шаг 1, если полученное число само по себе, вы нашли кратное 13.
Предыдущее обновление, удаление
var
и обратная логика в предупреждении для удаления большего числа символов с использованием условного вычитания-ложного.Технически, конечный результат заключается в том, что вы в конечном итоге достигнете двузначного числа, такого как 13, 26 или 39, которое при повторном выполнении шага 1 даст 13, 26 или 39 соответственно. Таким образом, тестирование на итерацию 100, являющееся одним и тем же, подтвердит делимость.
источник
Чеддер, 20 байтов (неконкурентный)
Оценка 20 * 0,9 = 18
Простой ответ.
источник
Common Lisp (71 байт * 0,8) = 56,8
Простая рекурсия, правда.
(defun w(x)(if(> x 14)(w(- x 13))(if(> 14 x 12)(print'yes)(print'no))))
Ungolfed:
источник
Рубин (
5048 * 0,9 = 43,2)Умный способ использования
eval
источник
D 56 символов .80 бонус = 44,8
это может быть отговорка с использованием 1/13, и двойной может хранить любое 32-битное число точно
редактировать: это работает путем умножения на 1/13 и проверки дробной части, если она отличается от 0 (с учетом ошибок округления), или другими словами, она проверяет дробную часть i / 13
источник
Python 2.7
(20 - 1 пробел) * 0,9 (без деления) = 17,1
да / нет вместо истина / ложь: 31 * 0,9 (без деления) = 27,9
использует преимущества Python
int
для преобразования других баз из строк в целые 10. вы можете видеть, что в обеих версиях используется разная (но одинаковая длина символов)редактировать: 1 символ сохранить в да / нет версии
edit2: еще 2 символа побрился!
edit3: еще раз спасибо за комментарии! еще больше символов сбрасывается с помощью встроенных восьмеричных представлений python (
015
==13
...) вместо базового перевода intисточник
print['no','yes'][input()%int('d',14)==0
14-1
или26/2
. Я просто взял на себя творческую свободу представлять 13Perl, 95 * 0,8 = 76
Для ясности добавлены разрывы строк. Возможно, я мог бы сделать этот ответ намного короче, но я чувствую, что этот ответ представляет собой уникальный способ решения проблемы.
источник
Питон - оценка 27,9
(31 символ * 0,90) - отказывается от бонуса за более короткий код.
более старая версия: (47 символов * 0,80) - полный ответ на Javascript от mellamokb, но на языке Python.
старая версия: (60 символов * 0,80)
старая версия: (105 символов * 0,80)
источник
(1,10,9,12,3,4)
сохранит 1 символ, но не разрешит до значения меньше 13.В Q:
источник
Правая линейная грамматика - ∞ баллов
Затем, в зависимости от того, как вы решите «запустить» его, он выдаст «да» или «нет».
Не серьезная запись, просто веселье;)
РЕДАКТИРОВАТЬ: Возможно, я должен объяснить немного.
Грамматика является набором правил (производства) , которые определяют язык . Язык можно рассматривать как все возможные строки, образованные алфавитом, которые соответствуют правилам его грамматики.
Здесь алфавит - это набор всех десятичных цифр. Правила грамматики заключаются в том, что все строки должны образовывать десятичные целые числа, которые делятся на 13.
Мы можем использовать приведенную выше грамматику, чтобы проверить, принадлежит ли строка нашему языку.
Правила грамматики содержат терминальные символы (которые являются элементами языка), а также нетерминальные символы, которые заменяются рекурсивно.
Проще объяснить, что происходит на примере:
Скажем, например, что тестируемая строка - 71955.
Всегда есть начальный символ (который не является терминальным), в случае грамматики выше это 'S'. На данный момент мы не прочитали никаких символов из нашей строки:
Теперь мы читаем первый символ в нашей строке, который равен '7', затем мы ищем правило в грамматике, которое имеет любой из нетерминалов в нашем текущем шаблоне в левой части '->', и это имеет наш символ в правой части '->'. К счастью, есть один (S-> 7G), поэтому мы заменяем нетерминальные символы в нашем текущем паттерне правой частью нового правила:
Теперь у нас есть нетерминальная буква «G» в нашем шаблоне, и следующий символ, который нужно прочитать, это «1», поэтому мы ищем правило в нашей грамматике, которое начинается с «G-> 1». Мы находим, что есть один (G-> 1F), поэтому мы заменим нетерминал RHS нашего нового правила:
Продолжайте повторять этот процесс:
Следующее правило: F-> 9D
Следующее правило: D-> 5F
Следующее правило: F-> 5S
На данный момент у нас больше нет символов в нашей строке, но у нас есть еще один нетерминальный символ там. Из первого правила в грамматике мы видим, что мы можем заменить 'S' пустой строкой (ε): S-> ε
Это дает нам текущую скороговорку: 71955ε, что эквивалентно 71955.
Мы прочитали все символы в нашей строке, и шаблон не содержит нетерминальных символов. Это означает, что строка принадлежит языку и, следовательно, 71955 фактически делится на 13.
Т.е. цель состоит в том, чтобы pattern = string. Если у вас остались какие-либо нетерминальные символы, после прочтения всех символов в вашей строке строка не принадлежит языку. Аналогично, если в вашей строке еще есть символы для чтения, но в грамматике нет правил, позволяющих вам двигаться вперед, тогда строка не принадлежит языку.
источник