Складіть найбільші і найменші числа


13

Натхненна цією публікацією на головоломки. Спойлери для цієї головоломки нижче.

З урахуванням трьох позитивних цілих чисел як вхідних даних, (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 Yep, список цифр чудово підходить для виведення.
AdmBorkBork

@Rod Я не знаю, про що ви говорите, я чітко набрав "вихід" вище. ;-)
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якщо так. В іншому випадку ми перевіряємо, чи потрібно нам покинути цифри ( n>0), тоді ми використовуємо spanдля розбиття рядка на три частини: pцифри, які потрібно скинути, cоптимальна досяжна цифра таrрешта рядка Ми робимо це, передаючи провідний присудок, який перевіряє рівність проти нашої оптимальної цифри. Щоб знайти цю цифру, ми беремо перші n+1цифри рядка, фільтруємо її, після чого передаємо її нашої функції "вибір". Тепер ми просто отримуємо оптимальну цифру і повторюємо, віднімаючи довжину 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

Пітон 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 Обчислення сили брута все ще детерміновані, лише повільніші.
dylnan

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

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

Матлаб, 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.