Спрощення чисел


16

Як, ви не можете згадати 6 або 7-значний номер телефону, який з’явився на екрані телевізора на секунду ?! Використовуючи спеціальну техніку, описану нижче, ви перетворитесь на прогулянкову книгу!

Очевидно, що число 402легше запам’ятати, ніж число 110010010, а число 337377легше запам’ятати, ніж число 957472. Це означає, що запам'ятоване число, з одного боку, повинно містити якомога менше цифр, а з іншого, бажано, щоб число містило якомога більше повторюваних чисел.

Як критерій складності запам’ятовування ми беремо суму числа цифр у кількості та кількості різних цифр у кількості. Запам'ятоване число можна записати в іншій системі числення, можливо, тоді буде простіше запам'ятати. Наприклад, 65535виглядає число в шістнадцятковій нотації FFFF.

Завдання

Вам потрібно написати програму для вибору бази системи числення, щоб мінімізувати критерій складності. База системи числення повинна бути обрана в діапазоні від 2 до 36, тоді цифри 0-9та англійські літери A-Zможна використовувати для представлення числа.

Вхідні дані

Вхід містить десяткове ціле число від 1 до 999999999.

Вихідні дані

Вихід повинен містити базу системи числення (від 2 до 36), мінімізуючи критерій складності запам'ятовування та число у вибраній системі числення, розділених одним пробілом. Якщо кілька баз дають однакове значення для критерію, то вибирайте найменшу серед них.

Примітки

  • Літери повинні бути великими літерами ( A-Z).

Випробування

Введення-виведення

1              2 1

2              3 2

65535       16 FFFF

123          12 A3


16
Великий виклик, але для цього потрібно більше тестових випадків.
Grimmy

7
Крім того, формат виводу є занадто суворим, ви можете дозволити, наприклад, масив з двох елементів, основи та рядка, або дозволити їх у зворотному порядку або розділити іншим символом. Також я припускаю, що ви додасте суму цифр до числа цифр, але ви можете уточнити це.
Erik the Outgolfer

8
Чи можна використовувати a-zзамість A-Z?
Ніл

5
Чи можемо ми просто використовувати відповідні числа замість A-Z?
flawr

8
@VerNick Наступного разу, коли ви пишете подібний виклик, я б запропонував дозволити обидва ці запити, оскільки вони є лише непотрібним ускладненням, яке відлякує: див. Наприклад, тут .
недолік

Відповіді:


6

Perl 6 , 55 54 байти

-1 байт завдяки Джо Кінгу.

{~map({$^b,.base($b)},2..36).min:{@$_+.Set}o*[1].comb}

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


1
Ви можете замінити @$_на@_ і він все ще працює.
СерБогман

2
@SirBogman Це просто трапляється працювати з дуже малою кількістю тестових випадків.
nwellnhof

Що має сенс. Це було не зовсім правильно.
СерБогман

5

Python 2 , 150 149 127 144 байт

lambda n:min((len(c(n,b))+len(set(c(n,b))),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n/b,b,chr(n%b+48+7*(n%b>9))+s)or s or'0'

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


Пітон 3 , 136 байт

lambda n:min((len((*c(n,b),*{*c(n,b)})),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

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


Python 3.8 (передвипуск) , 131 байт

lambda n:min((len((*(x:=c(n,b)),*{*x})),b,x)for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

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


c перетворює базове число 10 в будь-яку базу (2-36), і перша (анонімна) функція знаходить найменший результат.


5

05AB1E , 16 14 байт

-1 байт завдяки Kevin Cruijssen

₆LBāøΣнDÙìg}1è

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

Або додайте R) »наприкінці, щоб точно відповідати вказаному вихідному формату, але більшість інших відповідей не турбували.

Пояснення:

₆L          # range 1..36
  B         # convert the input to each of those bases
   āø       # enumerate (pair each element with its 1-based index)
Σ     }     # sort by
     g      # length
 н          # of the first element
    ì       # concatenated to
  DÙ        # itself, uniquified
1è          # take the second entry (first will always be base 1)

1
-1 байт, використовуючи ₆L©B®øзамість₆LεBy‚}
Кевін Круїссен

1
@KevinCruijssen Дякую! Ще один -1, використовуючи ā, здається, ви завжди забуваєте про це.
Grimmy

Лол, я дійсно так .. Я пам’ятав це з цим викликом раніше сьогодні, не те, щоб це допомогло якимось чином, ха-ха
Kevin Cruijssen

@recursive ви, здається, не прочитали відповіді. Я пов'язую версію, яка відповідає суворим вимогам до виходу, і пояснюю, чому я не зробив це основною версією.
Grimmy

@Grimy винний за звинуваченням. Вибач що турбую.
рекурсивна

4

JavaScript (ES6),  87 85  101 байт

Редагувати: +16 марних байтів, щоб відповідати суворому формату виводу

n=>(g=m=>--b>2?g(m<(v=new Set(s=n.toString(b)).size+s.length)?m:(o=b+' '+s.toUpperCase(),v)):o)(b=37)

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


Ага, я пропустив цю частину
TFeld

4

Japt v2.0a0 -gS, 24 23 байти

Не дуже, але це робить свою роботу. +2 байти за абсолютно непотрібну вимогу, щоб вихід був великим.

37o2@sX u ¸iXÃñÈÌiXÌâ)l

Спробуй це

37o2@sX u ¸iXÃñÈÌiXÌâ)l     :Implicit input of integer
37o2                        :Range [2,37)
    @                       :Map each X
     sX                     :  Convert the input to a base-X string
        u                   :  Uppercase
          ¸                 :  Split on spaces (there are none, so this returns a singleton array)
           iX               :  Prepend X
             Ã              :End map
              ñ             :Sort by
               È            :Pass each X through the following function
                Ì           :  Last element of X
                 i          :  Prepend
                  XÌâ       :    Last element of X, deduplicated
                     )      :  End prepend
                      l     :  Length
                            :Implicit output of the first sub-array, joined with spaces

Так, це добре, але букви мають бути великими літерами.
Вер Нік каже:

1
@VerNick, чому? Це не додає абсолютно нічого складного.
Shaggy

... Гадаю, наступна річ буде "розділена одним пробілом". Здається, формат виводу був дуже суворим щодо цього завдання, і з коментарів не схоже, що він зміниться.
Джонатан Аллан

@JonathanAllan, на щастя, я можу "виправити" це зі зміною прапора.
Кошлатий

3

PHP ,124 119 байт

for($i=36;$b=strtoupper(base_convert($argn,10,--$i));$o[strlen($b.count_chars($b,3))]="$i $b");krsort($o);echo end($o);

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

Соромно за +12 байт у PHP, щоб вивести великі регістри ... але ... все одно.


3

Zsh , 85 байт

for b ({36..2})x=$[[#$b]$1]&&x=${x#*\#}&&a[$#x+${#${(us::)x}}]=$b\ $x
a=($a)
<<<$a[1]

Для цієї кількості висловлювань всередині циклу for for використання ...&&...&&...коротше, ніж {...;...;...;}.

for b ({36..2})                   # order decreasing: smaller bases overwrite larger ones
    x=$[[#$b]$1] && \             # set x to [base]#[num] 
    x=${x#*\#} && \               # strip leading [base]#
    a[$#x+${#${(us::)x}}]=$b\ $x  # use score as index to store "[base] [number]"
#            ${(us::) }           # (s::)plit into characters, take (u)nique
a=($a)                            # remove empty elements from array
<<<$a[1]                          # print out the first element (smallest score)

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

Ось 81-байтне рішення, яке [base]#[num]замість нього друкує форму :

for b ({36..2})x=$[[#$b]$1]&&y=${x#*\#}&&a[$#y+${#${(us::)y}}]=$x
a=($a)
<<<$a[1]

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



2

Вугілля деревне , 38 байт

Nθ≔EE³⁴↨θ⁺²ιL⁺ιΦι⁼λ⌕ικη≔⁺²⌕η⌊ηηIη ↥⍘θη

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Nθ

Введіть ціле число.

≔EE³⁴↨θ⁺²ι

Перетворити його з бази 2 в базу 36 ...

L⁺ιΦι⁼λ⌕ικη

... дедублювати, об'єднувати і приймати довжину.

≔⁺²⌕η⌊ηη

Візьміть індекс мінімальної складності і додайте 2, щоб отримати базу.

Iη ↥⍘θη

Роздрукуйте основу та ціле число, перетворене на базу у верхньому регістрі.



2

Желе , 25 байт

bⱮ36µQL+LN)Mḟ1Ḣ,ị‘ịØBʋ¥⁸K

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

Монадична посилання, яка бере аргумент цілого числа і повертає рядок Jelly потрібного формату. Якщо двопозиційний список був прийнятним результатом (відповідно до більшості викликів), міг би зберегти 2 байти. Якщо база 1 була прийнятною для крайового випадку 1 як вхідного, можна зберегти ще 2 байти.






1

Мова Вольфрама (Mathematica) , 109 111 байт

Print[a=OrderingBy[#~IntegerDigits~Range@36,Tr[1^#]+Tr[1^Union@#]&,1][[1]]," ",ToUpperCase[#~IntegerString~a]]&

+2: фіксовано. Дякуємо за вилов @Roman

OrderingBy було введено в Mathematica 12.0, який, схоже, ще не оновив TIO.


"Якщо кілька баз дають однакове значення для критерію, вибирайте найменше серед них.": OrderingByНе відповідає цій вимозі.
Роман

Може, щось із MinimalBy, як це ?
Роман

@ Роман чи не так? Наскільки я можу сказати, він зберігає відносний порядок двох індексів, які мають однакове значення ..
attinat

2
За допомогою аргументу 123ваше рішення друкує 36 3Fзамість необхідного 12 A3. Отримавши OrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]відповідь {36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 6, 5, 11, 10, 9, 8, 7, 4, 3, 2, 1}, тому звичайне припущення про відсутність повторного замовлення еквівалентних записів, здається, тут ігнорується. Мій $Version"12.0.0 для Mac OS X x86 (64-бітний) (7 квітня 2019)".
Роман

Ах, ти маєш рацію. Моє погано, що цього не помітили.
attinat

1

C (стук) , 165 байт

n,i=2,j,p=99,r,m,x;char*g,*_,b[74][37];t(n){for(;g=b[i],i<37;r=j<p?_=g,p=j,i:r,++i)for(j=0,m=n;m;m/=i,*--g=x+=x>9?87:48)j+=b[i+36][x=m%i]++?1:2;printf("%i,%s",r,_);}

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

n // вхід

, i = 2 // ітератор від бази 2 до 36

, j // поточна складність

, p = 99 // найкраща складність

, r // результат = ітератор

, m // temp копія n

, x; // m% i

char * g // поточний рядок ptr

, * _ // кращий str ptr

, b [74] [37]; // буфер

/ * [37 + 37] = [отримані рядки + тест для використаних символів] * /

t (n) {

for (; g = b [i], // переміщення ptr

   i<37 ; 
   r=j<p?_=g,p=j,i:r, // save best solution

   ++i){//for every base

для (j = 0, m = n; m; m / = i, // дістати цифру

   *--g=x+=x>9?87:48)
   // move ptr backward for printf use and transform to ascii value

j + = b [i + 36] [x = m% i] ++? 1: 2; // приріст байта щодо символу

// і якщо це було 0 кроків j на 2: 1 для нового використовуваного символу та 1 для підрахунку цифр

// else incr тільки цифри count + покажчик переміщення

// printf ("% s -", ​​g); // тест

// printf ("r% ip% ij% i \ n", r, p, j); // тест

}

printf ("% i,% s", r, _); // вихід

}


1
163 байти можна назвати не один раз.
слюсарка

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.