Сделай самые большие и маленькие цифры


13

Вдохновленный этим постом на 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
  • Аналогичная логика, но обратная (т. Е. Мы хотим привести 1s вместо ведущего 9s) для наименьшего числа.

Вот пример меньше: (1, 10, 5).

Мы строим диапазон 12345678910и определяем, какие 5цифры мы можем удалить, оставляя максимально возможное число. Очевидно, это означает, что мы хотим максимизировать начальную цифру, так как мы не можем влиять на длину вывода. Так что, если мы удалим 12345, у нас останется 678910, и это самое большое, что мы можем сделать. Сделать наименьшее немного сложнее, так как вместо этого мы можем вытащить числа из середины, оставив 123410как можно меньше.

Ибо (20, 25, 11)результат довольно скучный, как 5и1 .

Наконец, чтобы исключить ответы, которые пытаются привести нули, (9, 11, 3)дает, 91011который в свою очередь дает 91и10 как самые большие и самые маленькие.

I / O и правила

  • Если это проще / короче, вы можете написать две программы / функции - одну для самой большой и одну для самой маленькой - в этом случае ваш результат является суммой обеих частей.
  • Вход и выход могут быть заданы любым удобным способом. .
  • Вход можно предположить , чтобы поместиться в родном типе номера вашего языка, однако нельзя предположить, что объединенные числа и выходные данные будут соответствовать этому.
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

список цифр приемлем как вывод?
Род

Тестовый пример, который дал бы фиктивный минимум при оценке тех с ведущими нулями, может быть полезен - я думаю, 9, 11, 3что подойдет.
Джонатан Аллан

@Rod Да, список цифр подходит для вывода.
AdmBorkBork

@ Род Я не знаю, о чем ты говоришь, я четко напечатал «вывод» выше. ;-)
AdmBorkBork

@JonathanAllan Хороший звонок. Добавлен.
AdmBorkBork

Ответы:


5

Haskell , 162 байта

l=length
((m,f)%n)s|n>=l s=[]|n>0,(p,c:r)<-span(/=m(f$take(n+1)s))s=c:((m,id)%(n-l p)$r)|1>0=s
(x#y)z=[p%z$show=<<[x..y]|p<-[(maximum,id),(minimum,filter(>'0'))]]

Попробуйте онлайн!

Использует алгоритм, описанный 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.


3

Желе , 17 байт

r/VDœcL_¥¥ḷ/ƇVṢ.ị

Попробуйте онлайн!

Рассчитывает все возможности, затем сохраняет самые большие и самые маленькие.

Левый аргумент: x,yпостроить диапазон. Правильный аргумент: zцифры должны быть удалены.

r/VDœcL_¥¥ḷ/ƇVṢ.ị
r/                 Inclusive range from x to y
  V                Concatenate the digits together
   D               Get the resulting digits
         ¥         Dyad:
        ¥            Dyad:
      L                Length of the list of digits in the concatenated number.
       _               Subtract the number of digits to be removed.
    œc               Combinations without replacement. (remove z digits)
            Ƈ      Keep lists of digits that:
          ḷ/       have a positive first element (no leading zeros).
             V     Combine digits into integers. (vectorizes to ldepth 1)
              Ṣ    Sort the numbers
               .ị  Indexes at value 0.5 which yields the first and last elements.

2

Python 2 , 143 байта

import itertools
s,e,r=input()
l=''.join(map(str,range(s,e+1)))
L=[i for i in itertools.combinations(l,len(l)-r)if'0'<i[0]]
print min(L),max(L)

Попробуйте онлайн!

Это работает путем вычисления всех комбинаций целевого размера (порядок элементов сохраняется) и получения наименьшего / наибольшего числа из него


Ох ... Я думаю, это работает, лол. Я очень старался создать программу, которая на самом деле рассчитывает ее детерминистически.
Дон Тысяча

@RushabhMehta Расчеты методом грубой силы все еще детерминированы, только медленнее.
Дилнан

2

Древесный уголь , 56 байт или 21 + 46 35 = 67 56 байт

≔⪫…·NNωθFN≔⌈EθΦθ⁻λνθθ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔⪫…·NNωθ

Введите xи y, создайте инклюзивный диапазон и объедините числа в строку.

FN

Цикл один раз для каждой удаляемой цифры.

≔⌈EθΦθ⁻λνθ

Создайте список строк, сформированных путем удаления каждого возможного символа из текущей строки и получения максимума.

θ

Распечатайте результат.

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌊Φ✂θκLυ¹∨κIλ⊞Oυω

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔⪫…·NNωθ

Введите xи y, создайте инклюзивный диапазон и объедините числа в строку.

F⊕N⊞υω

Введите zи увеличьте его. Затем я создаю список такой длины: мне нужно иметь возможность увеличиваться zвнутри следующего фильтра, но только переменным разрешено увеличивать переменные; в этом есть лазейка, которая PushOperatorувеличивает длину списка.

 θ                      String of digits
Φ                       Filter over characters
         κ              Current index
          Lυ            Length of list i.e. current `z` value
            ¹           Literal 1
       ✂θ               Slice string of digits
      Φ                 Filter over characters
              κ         Outer index
               Iλ       Cast inner character to number
             ∨          Logical OR
     ⌊                  Minimum
   ⁼ι                   Equals the outer character
  ∧              ⊞Oυω   And also push to list i.e. increment `z`
                        Implicitly print

Отфильтруйте нужные символы, проверив, что в области среза нет нижних символов. Область начинается с первых z+1символов (так как можно нарезать первыйz ), а конечная точка увеличивается для каждого сохраняемого символа. Старайтесь не выбирать ноль для первого символа.

Более быстрый алгоритм составляет 30 байтов, когда используется для вычисления максимально возможного числа:

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌈✂θκLυ¹⊞Oυω

Попробуйте онлайн! Ссылка на подробную версию кода. Изменить: с тех пор я был в состоянии объединить два вышеупомянутых во второе 56-байтовое решение, которое генерирует оба результата:

≔⪫…·NNωθF⊕N⊞υω≔⮌υη⟦Φθ∧⁼ι⌈✂θκLυ¹⊞OυωΦθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔⪫…·NNωθ

Генерация начальной строки.

F⊕N⊞υω

Представлять z+1как длину списка.

≔⮌υη

Переверните список, клонируя его, и сохраните результат.

Выведите два результата на отдельных строках. (Другой способ сделать это - разделить результаты буквальным \rсимволом.)

Φθ∧⁼ι⌈✂θκLυ¹⊞Oυω

Генерация максимально возможного числа.

Φθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

Создайте наименьшее возможное число, используя клонированный список для отслеживания z.


1

Желе ,  19  18 байт

rDẎœcL_⁵Ɗ$ị@Ƈ1ḌṢ.ị

Попробуйте онлайн!

Не очень неэффективно, определенно не указует идти на , 1, 100, 100как(19292)знак равно305812874887035355118559193163641366325011573739619723360


1

05AB1E , 16 байтов

ŸSDg³-.Æʒ¬Ā}{Ć`‚

Попробуйте онлайн!

Полная программа, считывающая входные данные в следующем порядке: y, x, z . Выводит список из двух списков символов.

объяснение

ŸSDg³-.Æʒ¬Ā}{Ć`‚    Full program. Inputs: y, x, z.
Ÿ                   Inclusive binary range from x to y. Push [x ... y].
 S                  Dump the digits separately in a list.
  Dg                Duplicate, and use the second copy to get its length.
    ³-              Subtract z from the length.
      .Æ            Retrieve all combinations of length - z elements from the digits.
        ʒ  }        Keep only those that...
         ¬Ā         Don't start with a 0 (head, then Python-style boolean).
            {       Sort the remaining elements.
             Ć      Enclose. Pushes list + list[0] (appends its tail to itself)
              `     Dump all elements separately on the stack.
               ,    Pair, to get the last two, min and max (after enclosing)

О, Ć`‚довольно умный, хороший ответ!
Кевин Круйссен

0

Matlab, 95 байт

function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

Попробуйте онлайн!

Возвращает матрицу 1x2 с min и max.

Как это устроено

% Full code
function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

% The function
function[m]=f(s,e,c),                                                                       end

                     % Creates the range in a single string
                     a=sprintf('%d',s:e);

                                                   % Gets all the combinations
                                                   combnk(a,length(a)-c)

                                         % Converts the string combinations to integers
                                         x=str2num(                     );

                                                                          % Finds min and max
                                                                          m=[min(x),max(x)];
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.