Велика база, невеликі цифри


19

Мова J має дуже нерозумний синтаксис для визначення констант . Я хочу зосередити увагу на одній крутій особливості, зокрема: вмінні писати у довільних базах.

Якщо ви пишете XbYдля Xбудь-якого числа і Yбудь-якого рядка буквено-цифрових значень, то J буде інтерпретувати Yяк базове Xчисло, де 0через 9мають своє звичайне значення і aчерез zпредставляють 10 по 35.

І коли я кажу Xбудь-яке число, я маю на увазі будь-яке число. Для цілей цього питання я буду обмежуватись Xцілим числом, але в J ви можете використовувати що завгодно: від’ємні числа, дроби, складні числа, що завгодно.

Дивна річ - це те, що ви можете використовувати лише цифри від 0 до 35 як базові цифри, оскільки ваша колекція корисних символів складається лише з 0-9 та az.

Проблема

Я хочу, щоб програма могла допомогти мені магічні цифри гольфу на зразок 2,933,774,030,998 за допомогою цього методу. Ну гаразд, може, не так вже й багато, я на тебе легко пітиму. Так...

Ваше завдання полягає в тому, щоб написати програму або функцію , яка приймає (зазвичай велике) десяткове число Nміж 1 і 4294967295 (= 2 32 -1) в якості вхідних даних, і виводить / повертає найкоротший уявлення виду XbY, де Xє позитивним цілим числом, Yє рядок, що складається з буквено-цифрових значень (0-9 та az, нечутливий до регістру), і Yінтерпретується в базові Xрівні N.

Якщо довжина кожного представлення XbYподання більша або дорівнює кількості цифр N, Nзамість цього виведіть . У всіх інших зв'язках ви можете виводити будь-яке непусте підмножина найкоротших зображень.

Це кодовий гольф, тому коротше - краще.

Тестові справи

      Input | Acceptable outputs (case-insensitive)
------------+-------------------------------------------------------
          5 | 5
            |
   10000000 | 79bkmom  82bibhi  85bgo75  99bauua  577buld
            | 620bq9k  999baka
            |
   10000030 | 85bgo7z
            |
   10000031 | 10000031
            |
   12345678 | 76bs9va  79bp3cw  82bmw54  86bjzky  641buui
            |
   34307000 | 99bzzzz
            |
   34307001 | 34307001
            |
 1557626714 | 84bvo07e  87brgzpt  99bglush  420blaze
            |
 1892332260 | 35bzzzzzz  36bvan8x0  37brapre5  38bnxkbfe  40bij7rqk
            | 41bgdrm7f  42bek5su0  45bablf30  49b6ycriz  56b3onmfs
            | 57b38f9gx  62b244244  69b1expkf  71b13xbj3
            |
 2147483647 | 36bzik0zj  38br3y91l  39bnvabca  42bgi5of1  48b8kq3qv
 (= 2^31-1) | 53b578t6k  63b2akka1  1022b2cof  1023b2661  10922bio7
            | 16382b8wv  16383b8g7  32764b2gv  32765b2ch  32766b287
            | 32767b241
            |
 2147483648 | 512bg000  8192bw00
            |
 4294967295 | 45bnchvmu  60b5vo6sf  71b2r1708  84b12mxf3  112brx8iv
 (= 2^32-1) | 126bh5aa3  254b18owf  255b14640  1023b4cc3  13107bpa0
            | 16383bgwf  21844b9of  21845b960  32765b4oz  32766b4gf
            | 32767b483  65530b1cz  65531b1ao  65532b18f  65533b168
            | 65534b143  65535b120

Якщо ви коли-небудь не впевнені в тому, чи дорівнює деяке представлення деякій кількості, ви можете скористатися будь-яким J-перекладачем, як, наприклад, у Try It Online . Просто введіть stdout 0":87brgzptі J виплюне назад 1557626714. Зауважте, що J приймає лише малі регістри, навіть якщо ця проблема нечутлива до регістру.

Деякі корисні теорії

  • Для всіх Nменше 10 000 000 десяткове представлення є коротким, ніж будь-яке інше, і, отже, є єдиним прийнятним результатом. Щоб зберегти що-небудь, вам потрібно буде принаймні на чотири цифри коротше у новій базі і навіть більше, якщо база перевищує 99.
  • Досить перевірити основи до стелі квадратного кореня N. Для будь-якого більшого підстави B , Nбуде не більше два цифр в базовій B , тому в перший раз , ви отримаєте що - то з дійсної першою цифрою близько BN/ 35. Але при такому розмірі ви завжди будете принаймні настільки ж великі, як і десяткове представлення, тому немає сенсу намагатися. Маючи на увазі, ceil (sqrt (найбільша кількість, яку я прошу вирішити цю проблему)) = 65536.
  • Якщо у вас є будь-яке представлення в базі менше 36, представлення базового 36 буде принаймні таким же коротким. Таким чином, вам не доведеться турбуватися про випадково короткі рішення в базах менше 36. Наприклад, представлення 35bzzzzzzна 1,892,332,260 використовує незвичну цифру для цієї бази, але 36bvan8x0має однакову довжину.

Lol, 1557626714 = 420blaze ^ _ ^
DrQuarius

Відповіді:


9

JavaScript (ES6), 103 101 байт

Вводиться як рядок.

n=>[...Array(7e4)].reduce(p=>p[(r=++b+(g=x=>x?g(x/b|0)+(x%b).toString(36):'b')(n)).length]?r:p,n,b=2)

Тестові справи

Примітка: Кількість ітерацій функції фрагмента обмежена 600, щоб тестові випадки закінчувалися швидше. (В іншому випадку це займе кілька секунд.)


Якщо моя кількість занадто велика, щоб працювати з цим, як би я це виправити? Збільшення ітерацій, здається, не допомагає.
FrownyFrog

N<232

Пошук "Згубні номери", 2136894800297704.
FrownyFrog,

@FrownyFrog Ви можете це обробити, збільшивши кількість ітерацій та використовуючи Math.floor(x/b)замість них x/b|0. (Але я цього не перевіряв.)
Арнольд,

1
це спрацювало! Дякую.
FrownyFrog

3

Рубін , 118 байт

Це було пов’язано в іншому запитанні, і я помітив, що тут не так багато відповідей, тому я вирішив дати постріл.

Пройдіться всіма базами і включаючи вхід для побудови всіх дійсних конструкцій з числа J. Він пропускає 1-8, тому що жодного способу вони не будуть коротшими, ніж представлення базової 10. Все, що розглядається, це досить наївне рішення, оскільки він закликає digitsвбудований отримати цифри, але, оскільки це починається з найменш значущої цифри спочатку, ми мусимо reverseйого отримати фактичне число, щоб його можливо було покращити.

Це повільно. Отже, soooooo неймовірно повільний. Наприклад, TIO вичерпано 34307000. Ми можемо піти з квадратним коренем або навіть з вибором Арнальда, 7e4щоб заощадити час, але це коштує зайвих байтів, то чому б це турбувати?

->n{([n.to_s]+(9..n).map{|b|d=n.digits b;"#{b}b"+d.reverse.map{|i|i.to_s 36}*''if d.all?{|i|i<36}}-[p]).min_by &:size}

Спробуйте в Інтернеті!

Спробуйте в режимі онлайн w / sqrt, щоб все закінчилося вчасно


1

05AB1E , 37 байт

[¼35ݾãvtîEyNβQižhA«yèJ'bìNìDgIg@i\}q

Потрібно працювати теоретично, але вичерпано час для всіх нетривіальних тестових випадків 10000000. Декартовий продукт, вбудований ã, надзвичайно повільний4..

Без остаточного твердження if, DgIg@i\}його все одно можна перевірити на нижчі значення, щоб перевірити, чи справді він працює: Спробуйте в Інтернеті.

Побачу, чи можу я пізніше придумати (можливо набагато довше, але) більш ефективне рішення.

Пояснення:

[              # Start an infinite loop:
 ¼             #  Increase the counter variable by 1 (0 by default)
 35Ý           #  Push a list in the range [0, 35]
 ¾ã            #  Take the cartesian product of this list with itself,
               #  with chunks-sizes equal to the counter variable
 v             #  Loop `y` over each of these lists:
  t            #   Take the square-root of the (implicit) input-integer
   î           #   Ceil it
  E            #   Loop `N` in the range [1, ceil(square(input))]:
   yNβ         #    Convert list `y` to base-`N`
   Qi          #    If it's equal to the (implicit) input-integer:
     žh        #     Push string "0123456789"
       A«      #     Append the lowercase alphabet
     yè        #     Index each value in list `y` into this string
     J         #     Join the characters to a single string
     'bì      '#     Prepend a "b"
        Nì     #     Prepend the number `N`
     D         #     Duplicate it
      g        #     And pop and push the length of this string
       Ig      #     Also push the length of the input
         @i }  #     If the length of the string is >= the input-length:
           \   #      Discard the duplicated string
     q         #     Stop the program
               #     (after which the result is output implicitly;
               #      or if the string was discarded and the stack is empty, it will
               #      implicitly output the implicit input as result instead)

1
Вражаюча відповідь! Я думаю, що вам не вистачає правила: "Якщо довжина кожного представлення XbYподання більша або дорівнює кількості цифр N, Nзамість цього виведіть ." У той час як у вас є покриті перші 10 мільйонів чисел, я підозрюю, що введення даних 10000031поверне щось подібне 26blmoof. Число дійсне, але довжина така ж, як і вхідна, тому замість нього слід повертати вхід.
Значення чорнила

@ValueInk Ах ой. Дякуємо, що помітили! Тепер слід виправити ціною в кілька байт.
Kevin Cruijssen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.