Вдохновленный этим постом на Puzzling. Спойлеры для этой загадки ниже.
Используя три положительных целых числа в качестве входных данных, (x, y, z)
создайте включающий диапазон [x, y]
, объедините этот диапазон вместе, а затем удалите z
необязательно последовательные цифры, чтобы получить самые большие и наименьшие возможные положительные целые числа. Начальные нули не допускаются (т. Е. Цифры должны начинаться с [1-9]
). Выведите эти два числа в любом порядке.
Для примера из загадочного поста, для ввода (1, 100, 100)
, наибольшее число возможно есть 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
а наименьшее число 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
следуя ниже логики от jafe в ответ отправил туда:
- Мы не можем влиять на длину номера (есть фиксированное количество цифр), поэтому для максимизации значения мы берем максимальную первую цифру, затем вторую цифру и т. Д.
- Удалите 84 первых не-девятки (осталось 16 цифр):
999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Наибольшее число в следующих 17 цифрах равно 7, поэтому отсюда следующая цифра в ответе может быть не более 7 (мы не можем удалить более 16 цифр). Так что удалите 15 не 7-х ... (1 цифра слева, чтобы удалить):
999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Отсюда следующая цифра может быть не более 8, поэтому удалите одну не-8 из середины:
99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Аналогичная логика, но обратная (т. Е. Мы хотим привести
1
s вместо ведущего9
s) для наименьшего числа.
Вот пример меньше: (1, 10, 5)
.
Мы строим диапазон 12345678910
и определяем, какие 5
цифры мы можем удалить, оставляя максимально возможное число. Очевидно, это означает, что мы хотим максимизировать начальную цифру, так как мы не можем влиять на длину вывода. Так что, если мы удалим 12345
, у нас останется 678910
, и это самое большое, что мы можем сделать. Сделать наименьшее немного сложнее, так как вместо этого мы можем вытащить числа из середины, оставив 123410
как можно меньше.
Ибо (20, 25, 11)
результат довольно скучный, как 5
и1
.
Наконец, чтобы исключить ответы, которые пытаются привести нули, (9, 11, 3)
дает, 91011
который в свою очередь дает 91
и10
как самые большие и самые маленькие.
I / O и правила
- Если это проще / короче, вы можете написать две программы / функции - одну для самой большой и одну для самой маленькой - в этом случае ваш результат является суммой обеих частей.
- Вход и выход могут быть заданы любым удобным способом. .
- Вход можно предположить , чтобы поместиться в родном типе номера вашего языка, однако нельзя предположить, что объединенные числа и выходные данные будут соответствовать этому.
- Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
источник
9, 11, 3
что подойдет.Ответы:
Haskell , 162 байта
Попробуйте онлайн!
Использует алгоритм, описанный Jafe. Может быть, короче использовать менее эффективный метод, но писать было веселее :)
%
Операция занимает 4 аргумента ( на самом деле 3, но все):m
который является функцией , которая выбирает членов «оптимальный» из списка (либоmaximum
или вminimum
зависимости от того, что мы хотим);f
которая является функцией «фильтра»;n
количество оставленных цифр; иs
строка. Сначала мы проверяем, равно ли n числу оставшихся в строке цифр (я использовал>=
для безопасности), и оставляем оставшиеся,s
если так. В противном случае мы проверяем, нужно ли по-прежнему отбрасывать digits (n>0
), затем мы используем,span
чтобы разбить нашу строку на три части:p
отбрасываемые цифры,c
оптимальная достижимая цифра иr
оставшаяся строка. Мы делаем это, передавая предикат span, который проверяет равенство с нашей оптимальной цифрой. Чтобы найти эту цифру, мы берем первые случае, который имеет отношение только к первой итерации. После этого нам больше не нужен фильтр.n+1
цифры строки, отфильтруйте ее, а затем передайте ее нашей функции "chooser". Теперь мы просто выводим нашу оптимальную цифру и повторяем, вычитая длинуp
(количество пропущенных цифр)n
. Обратите внимание, что мы не передаем нашу функцию фильтрации рекурсивному вызову, а вместо этого заменяем ее наid
. Это потому, что фильтр только для того, чтобы избежать выбора ведущих 0 вminimum
%
действительно только вспомогательная функция для#
которой наша «реальная» функция, принимаяx
,y
иz
. Мы используем понимание списка только для того, чтобы избежать некоторого повторения, перебирая наши кортежи функций и передавая их%
вместе соz
связанной строкой. Эта строка создается с помощью оператора волшебной монады,(=<<)
который в этом контексте работает следующим образомconcatMap
.источник
Желе , 17 байт
Попробуйте онлайн!
Рассчитывает все возможности, затем сохраняет самые большие и самые маленькие.
Левый аргумент:
x,y
построить диапазон. Правильный аргумент:z
цифры должны быть удалены.источник
Python 2 , 143 байта
Попробуйте онлайн!
Это работает путем вычисления всех комбинаций целевого размера (порядок элементов сохраняется) и получения наименьшего / наибольшего числа из него
источник
Древесный уголь , 56 байт или 21 +
4635 =6756 байтПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Введите
x
иy
, создайте инклюзивный диапазон и объедините числа в строку.Цикл один раз для каждой удаляемой цифры.
Создайте список строк, сформированных путем удаления каждого возможного символа из текущей строки и получения максимума.
Распечатайте результат.
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Введите
x
иy
, создайте инклюзивный диапазон и объедините числа в строку.Введите
z
и увеличьте его. Затем я создаю список такой длины: мне нужно иметь возможность увеличиватьсяz
внутри следующего фильтра, но только переменным разрешено увеличивать переменные; в этом есть лазейка, котораяPushOperator
увеличивает длину списка.Отфильтруйте нужные символы, проверив, что в области среза нет нижних символов. Область начинается с первых
z+1
символов (так как можно нарезать первыйz
), а конечная точка увеличивается для каждого сохраняемого символа. Старайтесь не выбирать ноль для первого символа.Более быстрый алгоритм составляет 30 байтов, когда используется для вычисления максимально возможного числа:
Попробуйте онлайн! Ссылка на подробную версию кода. Изменить: с тех пор я был в состоянии объединить два вышеупомянутых во второе 56-байтовое решение, которое генерирует оба результата:
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Генерация начальной строки.
Представлять
z+1
как длину списка.Переверните список, клонируя его, и сохраните результат.
Выведите два результата на отдельных строках. (Другой способ сделать это - разделить результаты буквальным
\r
символом.)Генерация максимально возможного числа.
Создайте наименьшее возможное число, используя клонированный список для отслеживания
z
.источник
Желе ,
1918 байтПопробуйте онлайн!
Не очень неэффективно, определенно не указует идти на ,( 19292) =305812874887035355118559193163641366325011573739619723360
1, 100, 100
какисточник
05AB1E , 16 байтов
Попробуйте онлайн!
Полная программа, считывающая входные данные в следующем порядке: y, x, z . Выводит список из двух списков символов.
объяснение
источник
Ć`‚
довольно умный, хороший ответ!Matlab, 95 байт
Попробуйте онлайн!
Возвращает матрицу 1x2 с min и max.
Как это устроено
источник