Penyederhanaan angka


15

Bagaimana, Anda tidak dapat mengingat nomor telepon 6 atau 7 digit yang muncul di layar TV sebentar ?! Dengan menggunakan teknik khusus yang dijelaskan di bawah ini, Anda akan berubah menjadi buku telepon berjalan!

Jelas, angkanya 402lebih mudah diingat daripada angkanya 110010010, dan angkanya 337377lebih mudah diingat daripada angkanya 957472. Ini berarti bahwa angka yang dihafal, di satu sisi, harus mengandung digit sesedikit mungkin, dan di sisi lain, diinginkan bahwa nomor tersebut mengandung angka berulang sebanyak mungkin.

Sebagai kriteria untuk kesulitan mengingat, kita mengambil jumlah dari jumlah digit dalam jumlah dan jumlah digit dalam jumlah yang berbeda. Nomor yang dihafal dapat ditulis dalam sistem angka lain, mungkin kemudian akan lebih mudah diingat. Misalnya, angka 65535dalam notasi heksadesimal terlihat sepertiFFFF .

Tugas

Anda perlu menulis sebuah program untuk memilih basis sistem bilangan untuk meminimalkan kriteria kompleksitas. Basis sistem angka harus dipilih dalam kisaran 2 hingga 36, ​​kemudian angka 0-9dan huruf InggrisA-Z dapat digunakan untuk mewakili angka.

Memasukkan

Input berisi bilangan bulat desimal dari 1 hingga 999999999.

Keluaran

Keluaran harus mengandung dasar sistem angka (dari 2 hingga 36), meminimalkan kriteria kompleksitas menghafal, dan angka dalam sistem angka yang dipilih, dipisahkan oleh satu ruang. Jika beberapa pangkalan memberikan nilai yang sama untuk kriteria tersebut, maka pilihlah yang terkecil di antara mereka.

Catatan

  • Huruf-hurufnya harus huruf besar ( A-Z).

Uji Kasus

Input output

1              2 1

2              3 2

65535       16 FFFF

123          12 A3


16
Tantangan besar, tetapi perlu lebih banyak uji kasus.
Grimmy

7
Juga, format output agak terlalu ketat, Anda mungkin ingin mengizinkan misalnya array dari dua elemen, basis dan string, atau memungkinkan mereka dalam urutan terbalik atau dipisahkan oleh karakter lain. Juga, saya berasumsi bahwa Anda menambahkan jumlah digit ke jumlah digit, tetapi Anda mungkin ingin memperjelasnya.
Erik the Outgolfer

8
Bisakah saya menggunakan a-zbukan A-Z?
Neil

5
Bisakah kita menggunakan angka yang sesuai saja A-Z?
flawr

8
@ VerNick Lain kali Anda menulis tantangan yang sama saya sarankan mengizinkan kedua permintaan ini, karena mereka hanya sebuah komplikasi yang tidak perlu yang tidak dianjurkan: lihat misalnya di sini .
flawr

Jawaban:


5

Python 2 , 150 149 127 144 byte

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'

Cobalah online!


Python 3 , 136 byte

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

Cobalah online!


Python 3.8 (pra-rilis) , 131 byte

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

Cobalah online!


c mengkonversi nomor basis 10 ke basis apa pun (2-36), dan fungsi pertama (anonim) menemukan hasil terkecil.


5

05AB1E , 16 14 byte

-1 byte terima kasih kepada Kevin Cruijssen

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

Cobalah online!

Atau tambahkan R) »di akhir untuk menyesuaikan persis dengan format output yang ditentukan, tetapi sebagian besar jawaban lain tidak mengganggu.

Penjelasan:

₆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 byte dengan menggunakan ₆L©B®øbukan₆LεBy‚}
Kevin Cruijssen

1
@KevinCruijssen Terima kasih! -1 lain dengan menggunakan ā, sepertinya Anda selalu melupakan yang itu.
Grimmy

Lol, memang saya lakukan .. Saya ingat dengan tantangan ini sebelumnya hari ini, bukan karena itu membantu, haha ​​xD
Kevin Cruijssen

@recursive Anda sepertinya tidak membaca jawabannya. Saya menautkan versi yang sesuai dengan persyaratan keluaran yang ketat, dan menjelaskan mengapa saya tidak menjadikannya versi utama.
Grimmy

@Grimy bersalah seperti yang dituduhkan. Maaf mengganggu Anda.
rekursif


4

JavaScript (ES6),  87 85  101 byte

Sunting: +16 byte tidak berguna untuk mematuhi format output yang ketat

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)

Cobalah online!


Ah, saya melewatkan bagian itu
TFeld

4

Japt v2.0a0 -gS, 24 23 byte

Tidak cantik, tetapi berhasil. +2 byte untuk persyaratan yang sama sekali tidak perlu bahwa output huruf besar.

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

Cobalah

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

Ya, itu berfungsi dengan baik, tetapi huruf-hurufnya harus huruf besar.
Ver Nick mengatakan Reinstate Monica

1
@ Verick, mengapa? Itu sama sekali tidak menambah tantangan.
Shaggy

... Saya kira hal selanjutnya akan "dipisahkan oleh satu ruang". Tampaknya format output telah dibuat sangat ketat pada tantangan ini, dan dari komentar sepertinya tidak akan berubah.
Jonathan Allan

@ Jonathan Allan, untungnya saya bisa "memperbaiki" yang satu itu dengan mengganti bendera.
Shaggy

3

PHP ,124 119 byte

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

Cobalah online!

Sayang sekali tentang +12 byte di PHP untuk huruf besar output ... tapi ... pokoknya.


3

Zsh , 85 byte

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

Untuk jumlah pernyataan di dalam for loop ini, menggunakan ...&&...&&...lebih pendek dari {...;...;...;}.

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)

Cobalah online!

Inilah solusi 81-byte yang mencetak dalam bentuk [base]#[num]sebagai gantinya:

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

Cobalah online!



2

Arang , 38 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukkan bilangan bulat.

≔EE³⁴↨θ⁺²ι

Konversikan dari basis 2 ke basis 36 ...

L⁺ιΦι⁼λ⌕ικη

... deduplicate, concatenate, dan mengambil panjangnya.

≔⁺²⌕η⌊ηη

Ambil indeks kompleksitas minimum dan tambahkan 2 untuk mendapatkan basis.

Iη ↥⍘θη

Cetak alas dan bilangan bulat yang dikonversi ke alas itu dalam huruf besar.



2

Jelly , 25 byte

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

Cobalah online!

Tautan monadik mengambil integer sebagai argumennya dan mengembalikan string Jelly dari format yang diinginkan. Jika daftar dua item adalah output yang dapat diterima (sesuai dengan sebagian besar tantangan), dapat menghemat 2 byte. Jika basis 1 dapat diterima untuk kasus tepi 1 sebagai input, dapat menyimpan 2 byte lebih lanjut.



1

Perl 5 , 161 byte

sub f{$X=99;for$b(2..36){$_=c($_[0],$b);$x=uniq(/./g)+y///c;($X,$B,$C)=($x,$b,$_)if$x<$X}$B,$C}
sub c{my($n,$b)=@_;$n?c(int$n/$b,$b).chr(48+$n%$b+7*($n%$b>9)):''}

Cobalah online!



1

Perl 5 -Minteger -MList::Util=uniq,first -ap , 123 112 byte

$"=$,;map{@r=();$t="@F";do{unshift@r,(0..9,A..Z)[$t%$_]}while$t/=$_;$a[@r+uniq@r]||="$_ @r"}2..36;$_=first{$_}@a

Cobalah online!


1

Bahasa Wolfram (Mathematica) , 109 111 byte

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

+2: diperbaiki. Terima kasih atas tangkapan @Roman

OrderingBy diperkenalkan di Mathematica 12.0, yang TIO tampaknya belum diperbarui.


"Jika beberapa pangkalan memberikan nilai yang sama untuk kriteria tersebut, maka pilih yang terkecil di antara mereka.": OrderingByTidak sesuai dengan persyaratan ini.
Roman

Mungkin ada sesuatu dengan MinimalBy, seperti ini ?
Roman

@Roman bukan? Sejauh yang saya tahu, ini mempertahankan urutan relatif dari dua indeks yang memiliki nilai yang sama ..
attinat

2
Dengan argumen tersebut 123, solusi Anda mencetak 36 3Falih-alih yang diperlukan 12 A3. Dari OrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]saya mendapatkan jawabannya {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}, sehingga asumsi biasa untuk tidak memesan ulang entri yang setara tampaknya diabaikan di sini. My $Versionadalah "12.0.0 untuk Mac OS X x86 (64-bit) (7 April 2019)".
Roman

Ah kamu benar Buruk saya karena tidak memperhatikan itu.
attinat

1

C (dentang) , 165 byte

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,_);}

Cobalah online!

n // masukan

, i = 2 // iterator dari base 2 hingga 36

, j // kompleksitas saat ini

, p = 99 // kompleksitas terbaik

, r // result = iterator

, m // temp copy n

, x; // m% i

char * g // ptr string saat ini

, * _ // str str terbaik

, b [74] [37]; // buffer

/ * [37 + 37] = [string diperoleh + tes untuk karakter yang digunakan] * /

t (n) {

untuk (; g = b [i], // gerakkan ptr

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

   ++i){//for every base

untuk (j = 0, m = n; m; m / = i, // ekstrak digit

   *--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; // kenaikan byte relatif ke karakter

// dan jika 0 penambahan j oleh 2: 1 untuk karakter baru yang digunakan dan 1 untuk jumlah digit

// selain itu, hanya digit yang dihitung + pindahkan pointer

// printf ("% s -", ​​g); // test

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

}

printf ("% i,% s", r, _); // output

}


1
163 byte dapat dipanggil lebih dari sekali.
ceilingcat

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.