Фон
Есть общая загадка, которая выглядит примерно так:
Улитка находится на дне 30-футового колодца. Каждый день улитка может подняться на 3 фута. Ночью, когда они спят, они спускаются вниз на 2 фута. Сколько дней нужно улитке, чтобы выбраться из колодца?
Интуитивный ответ
30 дней, потому что улитка поднимается на 1 фут в день в течение 30 дней, чтобы достичь вершины,
но на самом деле ответ
28 дней, потому что как только улитка поднимется в воздух на 27 футов (после 27 дней), они просто поднимутся на оставшиеся 3 фута к вершине на 28-й день.
Вызов
Эта проблема обобщает эту загадку. Учитывая три положительных целых числа в качестве входных данных, представляющих общую высоту, высоту набора высоты и высоту падения, возвращает количество дней, которое потребуется, чтобы выбраться из скважины.
Если улитка не может выбраться из колодца, вы можете вернуть 0, вернуть ложное значение или сгенерировать исключение. Вы также можете написать код, который будет останавливаться тогда и только тогда, когда существует решение.
Если вы хотите, вы можете принять высоту падения как отрицательное целое число.
Тестовые случаи
(30, 3, 2) -> 28 (84, 17, 15) -> 35 (79, 15, 9) -> 12 (29, 17, 4) -> 2 (13, 18, 8) -> 1 (5, 5, 10) -> 1 (7, 7, 7) -> 1 (69, 3, 8) -> Нет (81, 14, 14) -> Нет
счет
Это код-гольф , поэтому выигрывает самый короткий ответ на каждом языке.
источник
Ответы:
Grey Snail , 1206 байтов для числового ввода / вывода, 149 байтов для одинарного ввода / вывода
Ради забавы. Состав первой программы:
Возьмите числовой ввод и вывод. Вход
A
,B
,C
соответственно. По сравнению с другим (близким)O(1)
ответом, код имеет сложностьO(n)
. Но для большого количества это может съесть Вашу память сначала.Повесьте, если решение не найдено.
f
(возможно) рекурсивная функция для преобразования целых чисел в точки Аргумент сохраняется в[p]
и выводится в[o]
.U
является функцией тестированияS1>=S2
, сохраняющей параметрB, A
при сохраненииA-B
вA
.Код, начиная с
D
заглушки, превращает точки в числа.Основополагающий принцип такой же, как и в моем ответе C (срывая ложные данные для невозможных решений).
Автономная версия, 149
156157167170230байты, поддерживают только унарный ввод / выводВвод должен быть точками, например,
..........
для10
.U
рассчитываетA=A-B
и переходит кD
когдаA<=0
. В противном случае$
назначаетсяA+C
дляA
и вызоваU
.Повесьте, если решение не найдено.
Трюки: злоупотребляйте способностью "компилятора" интерпретировать пустую строку. Вы можете срывать условия в
GOTO
заявлении, чтобы сделать безусловные прыжки, и тот же трюк работает дляPOP
.Замечание: я могу сыграть в гольф больше на 3 байта, но при этом мой и WheatWizard ответ будут иметь точно такую же логику. В результате, вероятно, самое короткое решение GraySnail, и я пытаюсь доказать это.
источник
C # (.NET Core) ,
3231 байтПопробуйте онлайн!
Рекурсивный подход. Если улитка не может сбежать, она заканчивается следующим сообщением:
Process is terminating due to StackOverflowException.
источник
a<=b
вa>b
и замены следующих частейf=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
f
для рекурсивного вызова.f
и точкой с запятой, если он назван. Первое, что я обнаружил, это, но здесь нет единого мнения.f=...
что я не уверен, следует ли нам добавлять точку с запятой в конце.GREY SNAIL,
219206169167159156146 байт (одинарный IO)Я думаю, что могу немного поиграть в гольф.
источник
JavaScript (ES6),
312827 байтСохранено несколько байтов благодаря @Arnauld
Я не понял, что мы можем потерпеть неудачу за исключением. Уверен, что это оптимально:
Присвойте переменную, например
f=
, затем вызовите likef(climb)(fall)(height)
. Броски,InternalError: too much recursion
если подняться невозможно.JavaScript (ES6), 38 байт
Рекурсивная функция, которая возвращает количество дней или
NaN
никогда.Контрольные примеры
Показать фрагмент кода
источник
d=>u=>g=h=>h>u?1+g(h-u+d):1
g=
в середине, потому что эта переменная хранит промежуточную функцию, необходимую для рекурсивного вызова. Более длинный ответ выполняет рекурсивный вызовf
, который требует, чтобы имя было включено в число байтов.Excel,
5146 байт-1 байт благодаря @ Скараби .
-4 потому что INT (x) = FLOOR (x, 1)
Ввод взят из ячеек A1, B1 и C1 соответственно. Возвращает
FALSE
для недействительных сценариев.источник
ceiling(x)
всегда равно-floor(-x)
, так что я думаю, что вы могли бы сохранить 1 байт, заменивCEILING((A1-B1)/(B1-C1)+1,1)
на-FLOOR((B1-A1)/(B1-C1)+1,1)
.C (gcc), 39
434446475860байтовТолько на 32-битном GCC и все оптимизации отключены.
Вернуть 0, когда решение невозможно. Модифицированная версия оригинального рекурсивного решения.
Вдохновлен решениями @Jonah J и @CarlosAlejo C #.
Я обновлю расширенную версию позже (после того, как я закончу свой ответ Grey Snail).
источник
Assign instead of return
Java (OpenJDK 8) , 35 байт
Попробуйте онлайн!
Математика побеждает!
кредиты
источник
a-c-1
→a+~c
.Python 2 , 37 байт
Попробуйте онлайн!
Наконец, моя рекурсивная версия оказалась ниже моего стандартного вычисления (я передавал счет своей функции вместо того, чтобы добавить ее перед вызовом).
Python 2 , 43
46байтовПопробуйте онлайн!
Побрил 3 байта, торгуя «__ и 1» для «__> 0».
Используя булеву хитрость, по существу выполняет:
источник
f=
перед своим кодом (первое решение), и ваш счетчик байтов становится 37, потому что он рекурсивный, поэтому вы не можете оставить его анонимным.f=
может быть отброшен для лямбды, только когда она не рецидивирует.R, 43 байта
Заимствование из других ответов:
Выдает ошибку, если нет решения.
источник
J, 25 байт
Сначала хорошее решение, которое является читом, так как оно предполагает, что «что-либо кроме положительного целочисленного результата» равно «None»:
объяснение
2-/\
используйте окна длиной 2 на нашем 3 элементном вводе, помещая знак минус между каждым, что для ввода30 3 2
, например, возвращает27 1
%/
поместите символ деления между каждым элементом списка, в нашем случае список состоит только из двух элементов, поэтому он означает «делить 27 на 1»>:
увеличение на 1>.
взять потолокофициальное решение
Вот официальное решение, которое преобразует негативы и бесконечность в 0, и я не смог найти достаточно краткого решения для этого:
TIO
источник
If the snail cannot climb out of the well, you may return 0, return a falsy value, or throw an exception.
Для написания тестовых случаев я просто решилNone
указать, что ответа не было. Не могли бы вы добавить объяснение и ссылку «Попробовать онлайн»?Perl 5 , 37 байт
35 байт код +2 для
-pa
.Попробуйте онлайн!
источник
PHP> = 7.1, 60 байт
печатает 0 для выхода
PHP Sandbox Online
PHP> = 7,1, 67 байт
ничего не печатает без побега
PHP Sandbox Online
источник
Mathematica,
474039 байт-7 байтов от @KeyuGan
источник
69, 3, 8
и⌈
считается как 3 байта, насколько я думаю.Max
для заменыIf
заявления.If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Рубин ,
4947 байтВыдает исключение, если улитка не может выбраться
Попробуйте онлайн!
источник
h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceil
проходит тестовые случаи и сохраняет 9 байтов.Пакетный, 66 байт
Второй последний контрольный пример ничего не печатал, а последний контрольный пример фактически потерпел крах
CMD.EXE
...источник
05AB1E , 19 байтов
Объяснение:
Для недопустимых значений это может возвращать любое значение меньше 1. Однако в 05AB1E только 1 является правдивым, поэтому это соответствует требованию, что вывод для недопустимого значения должен быть ложным.
Попробуйте онлайн!
источник
PHP, 60 байт
печатает
N
дляNone
. Беги с-r
.источник
05AB1E , 12 байтов
Попробуйте онлайн!
Печатает,
0
если невозможно.Формат ввода:
источник
Japt , 12 байт
Проверьте это онлайн!
Выходы
undefined
никогда, после возможного зависания вашего браузера на некоторое время, поэтому, пожалуйста, будьте осторожны.Я не уверен, что это оптимально.
oWV-W l
работает на всех, кроме последних трех случаев ...источник
Haskell ,
3029 байтПопробуйте онлайн!
Короче, чем существующий ответ на Haskell. Возможно, кто-то еще может победить меня.
Это использует рекурсивный подход к решению проблемы. Каждая рекурсия по сути является днем движения для улитки. Если оставшееся до конца расстояние меньше требуемого, мы заканчиваем нашу рекурсию.
источник
(b#c)a=1+sum[(b#c)$a+c-b|a>b]
.b!c
в понимании списка.QBIC ,
3123 байтаПросто заметил, что требования изменились. Эта версия не проверяет, достигнет ли когда-нибудь улитка вершины колодца.
Приведенное ниже объяснение для исходной версии, которая проверяет, существует ли решение, охватывает также все соответствующие части этого кода.
Оригинал, 31 байтовый ответ:
объяснение
Попробуйте онлайн! (Хорошо, не совсем: это перевод QBIC в код QBasic, запускаемый в repl.it (в некоторой степени отсутствует) среда QBasic)
источник
Excel VBA, 47 байт
Функция анонимного непосредственного окна VBE, которая принимает входные данные из диапазона
[A1:C1]
отActiveSheet
выходных данных объекта до непосредственного окна VBEЭто решение, основанное на формулах Excel, кажется меньше, чем любое чисто VBA-решение, которое я могу придумать :(
источник
Haskell, 47
55байт (48, если требуется кортеж)вариация кортежа
объяснение
источник
d>c||c<s
просто на0<1
, как вы уже неявно делаете в своем объяснении, потому чтоotherwise
это просто синонимTrue
. 2. Рекурсивный вызов в вашей версии кортежа все еще каррируется. 3. Вы можете определить свою функцию, а(d#c)s
неf d c s
сохранять еще два байта.c<=s
вместоc<s
.0
вместо-1
разрешенного OP дает 38 байт: попробуйте онлайн!Python 3, 41 байт
Ошибка для Никогда
Outgolf @veganaiZe
источник
int(b>=a)
чтобы1-(b<a)
спасти 2 байта?APL (Dyalog) , 13 байт
Попробуйте онлайн!
Ошибки при делении на ноль, если улитка не может выбраться из колодца.
источник
C # (.NET Core) , 37 байт
Нерекурсивная лямбда. Использует формулу, найденную здесь . Может быть сокращено на 6 байт, если «любой отрицательный результат» является допустимым способом возврата ошибки; в настоящее время возвращает 0 вместо.
источник
h-f-1
может бытьh+~f
.Python v2 & v3, 44 байта
^ Бесконечная рекурсия (ошибка) для None case.
источник
(x-z-1)//(y-z)+1
. Я не делаю много Python, поэтому я могу ошибаться ...f=
из подсчета байтов, удалить пробелы вокруг if и elses и переключиться на Python 2, где целочисленное деление - одиночное/
Программируемый калькулятор HP-15C, 26 байт
Три числа загружаются в стек по порядку перед запуском программы. Высота падения вводится как отрицательное число. Если улитка не может вылезти из колодца, результатом будет либо отрицательное число, либо ошибка № 0 (ошибка деления на ноль).
Коды операций в шестнадцатеричном формате:
Инструкция значения:
Вы можете попробовать программу с этим симулятором HP-15C .
источник
Common Lisp, 49 байт
Попробуйте онлайн!
Рекурсивная функция, переполнение стека, если решение не найдено.
источник
PowerShell ,
9594 байтаПопробуйте онлайн!
источник