Inilah tantangan mudah yang menyenangkan:
Diberikan string yang merepresentasikan angka dalam basis yang tidak diketahui, tentukan basis terendah yang mungkin dimiliki nomor tersebut. String hanya akan berisi
0-9, a-z
. Jika suka, Anda dapat memilih untuk mengambil huruf besar alih-alih huruf kecil, tetapi harap tentukan ini. Anda harus mengeluarkan basis serendah mungkin ini dalam desimal.
Ini adalah contoh yang lebih konkret. Jika string input adalah "01234", angka ini tidak mungkin berada dalam biner, karena 2, 3, dan 4 semuanya tidak terdefinisi dalam biner. Demikian pula, angka ini tidak boleh di basis 3, atau basis 4. Oleh karena itu, angka ini harus di basis-5, atau basis yang lebih tinggi, jadi Anda harus menampilkan '5'.
Kode Anda harus berfungsi untuk basis apa pun antara basis 1 (unary, semua '0's) dan basis 36 (' 0-9 'dan' a-z ').
Anda dapat mengambil input dan memberikan output dalam format apa pun yang masuk akal. Basis-konversi bawaan diizinkan. Seperti biasa, celah standar berlaku, dan jawaban terpendek dalam byte adalah pemenangnya!
Tes IO:
#Input #Output
00000 --> 1
123456 --> 7
ff --> 16
4815162342 --> 9
42 --> 5
codegolf --> 25
0123456789abcdefghijklmnopqrstuvwxyz --> 36
sumber
You must output this lowest possible base in decimal.
Jawaban:
Jelly , 4 byte
Membutuhkan huruf besar. Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Python,
2722 byteIni membutuhkan input untuk menjadi bytestring (Python 3) atau bytearray (Python 2 dan 3).
Terima kasih kepada @AleksiTorhamo untuk bermain golf 5 byte!
Uji di Ideone .
Bagaimana itu bekerja
Kami mulai dengan mengambil string maksimal. Ini titik kode huruf lebih tinggi dari titik kode angka, karakter maksimal ini juga basis maksimal 36 digit.
Titik kode '0' - '9' adalah 48 - 57 , jadi kita harus mengurangi 48 dari titik kode mereka untuk menghitung angka yang sesuai, atau 47 untuk menghitung basis serendah mungkin. Demikian pula, titik kode huruf 'a' - 'z' adalah 97 - 122 . Karena 'a' mewakili digit dengan nilai 10 , kita harus mengurangi 87 dari titik kode mereka untuk menghitung angka yang sesuai, atau 86 untuk menghitung basis serendah mungkin. Salah satu cara untuk mencapai ini adalah sebagai berikut.
Perbedaan antara 97 dan 58 ( ':' , karakter setelah '9' ) adalah 39 , jadi mengambil poin kode modulo 39 dapat mencapai pengurangan. Karena 48% 39 = 9 , dan hasil yang diinginkan untuk karakter '0' adalah 1 , pertama-tama kita kurangi 8 sebelum mengambil hasil modulo 39 . Pengurangan pertama diperlukan karena jika tidak 'u'% 39 = 117% 39 = 0 .
sumber
ord()
dan menang dengan 3 byte. :)Python, 25 byte
Mendefinisikan lambda yang mengambil string
x
. Menemukan digit terbesar dalam string (diurutkan dengan huruf di atas angka, menurut standar python), dan mengonversi ke basis 36. Menambahkan 1, karena8
tidak ada di basis 8.sumber
Haskell, 34 byte
Menggunakan
mod(ord(c)-8,39)
ide dari Dennis.41 byte
45 byte:
Output seperti
Just 3
.sumber
Cheddar ,
342921 byteDisimpan 8 byte berkat Dennis !!!
Menggunakan huruf kecil
Cobalah online
Penjelasan
sumber
(-)&8
bukann->n-8
?f&n
obligasin
untuk arg pertama dari fungsi.05AB1E , 6 byte
Mengambil huruf dalam huruf besar.
Penjelasan
Cobalah online
sumber
Sebenarnya , 6 byte
Cobalah online!
sumber
Julia, 22 byte
Ada karakter BS (0x08) antara tanda kutip. Cobalah online!
sumber
-''
dilakukan?JavaScript (ES6),
4137 byteSunting: Disimpan 4 byte berkat @ edc65.
sumber
pop()
untuk menyimpan 4Haskell,
5540 byteTerima kasih @Dennis atas pendekatannya. (ambil itu, @xnor;))
sumber
f=
38 byte karenaf
tidak mengambil argumen eksplisit.Perl 6: 18 byte
Mendefinisikan lambda yang mengambil argumen string tunggal, dan mengembalikan integer. Ini membagi string menjadi karakter, menemukan yang "tertinggi", mengubahnya menjadi basis 36, menambahkan 1.
Yang ini menggunakan pendekatan modulo dari Dennis. Sama panjang.
sumber
Retina , 28 byte
Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)
Penjelasan
Ini memilah karakter input.
Ini menghapus semua karakter kecuali yang terakhir, sehingga dua tahap pertama menemukan karakter maksimum.
Ini adalah dua tahap yang membentuk lingkaran. Yang pertama menduplikasi karakter pertama dan yang kedua "decrements" (menggantikan misalnya
x
denganw
,a
dengan9
dan1
dengan0
). Tahap terakhir menemukan nol sebagai karakter pertama, ia menghilangkannya sebagai gantinya. Ini adalah teknik standar untuk menghasilkan serangkaian karakter, mengingat ujung atas. Karenanya, ini menghasilkan semua "digit" dari0
ke digit maksimum.Akhirnya, kita cukup menghitung jumlah digit, yang memberi kita basis.
sumber
R,
998985 byteLihat! Kurang dari 100 byte!
Lihat! Off 10 byte!
Lihat! Off 4 byte!
Tidak Disatukan:
Seperti sering, jawaban ini memanfaatkan
ifelse
fungsi:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)
sumber
scan
metode Anda untuk golf beberapa byte;)PHP,
5138 byte(Dari Dennis) ^^
Proposal lain tanpa trik Dennis
sumber
<?=base_convert(max(str_split($argv[1])),36,10)+1
adalah solusi yang elegan, tetapi pada 49 byte!intval()
alih-alihbase_convert()
yang lebih pendek menjadi 38 byte<?=intval(max(str_split($argn)),36)+1;
tio: tio.run/##K8go@P/…Oktaf, 20 byte
sumber
Pyke, 6 byte
Coba di sini!
sumber
Java 7,
6761 byte(m-8)%39
berkat @Dennis jawaban menakjubkan ' .Tidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber
Math.max()
Anda dapat menggunakanm = m>c?m:c
reduce
C89,
55535250 byte-8%39
tanpa malu-malu dicuri dari DennisUji
Keluaran
Disimpan 2 byte berkat Toby Speight
Disimpan 2 byte berkat Kevin Cruijssen
sumber
f(char*s,int b)
menjadif(s,b)char*s;
.f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
C, 55 byte
Jawaban ini mengasumsikan bahwa input dalam ASCII (atau identik dalam angka dan huruf, misalnya ISO-8859 atau UTF-8):
Kami hanya mengulang di sepanjang string, mengingat nilai terbesar yang terlihat, kemudian menggunakan konversi modulo-39 yang terkenal dari basis- {11..36}.
Program uji
Hasil tes
sumber
f()
lebih dari sekali. Saya tahu bahwa hampir semua permainan yang adil dalam golf, tetapi naluri profesional saya menganggapnya terlalu rapuh!m
antar panggilanf()
. Maka program pengujian saya masih bisa bekerja.Mathematica,
3432 byte2 byte disimpan berkat Martin Ender
Saya memutuskan metode yang berbeda pantas mendapat jawaban baru.
Metode yang
dicuriterinspirasi oleh solusi Dennissumber
Max@Mod[ToCharacterCode@#-8,39]&
(hal yang sama berlaku untuk jawaban Anda yang lain)&
sampai akhir untuk menunjukkan fungsi anonim.@
di kedua jawaban Anda (ToCharacterCode@#
danCharacters@#
).Mathematica,
3432 bytedisimpan 2 byte berkat Martin Ender
Mendefinisikan fungsi murni yang mengambil string sebagai input.
Pisahkan input menjadi karakter, ubah menjadi basis 36 angka, dan kembalikan +1 maksimum.
sumber
Max@BaseForm[Characters@#,36]+1&
C # REPL, 17 byte
Baru saja mengirim jawaban @ Dennis ke C #.
sumber
CJam, 10 byte
Terima kasih kepada Martin Ender karena telah menyelamatkan saya beberapa byte!
Menggunakan formula Dennis
Cobalah online
CJam,
1816 btyesSolusi alternatif:
Cobalah online
sumber
Scala, 25 byte
print((args(0).max-8)%39)
Jalankan seperti:
$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz
sumber
R,
6254 byteTidak Disatukan:
Pembaruan: dicukur 8 byte karena redundansi
na.rm=T
bawah asumsi validitas input.Peningkatan 39% dalam ukuran dibandingkan dengan jawaban Frédéric . Selain itu, ia menjalankan sedikit lebih cepat: 0,86 detik untuk 100000 replikasi dibandingkan 1,09 detik untuk jawaban yang bersaing. Jadi salah satu tambang saya lebih kecil dan lebih efisien.
sumber
Dyalog APL , 10 byte
Anjuran untuk input huruf besar.
⌈/
maksimum⍞
karakter input⍳⍨
1 diindeks menjadi⎕D,
semua digit diikuti oleh⎕A
semua karakterTryAPL online!
sumber
BASH 70
Input huruf adalah huruf kecil.
sumber
JavaScript,
575048 byte7 byte disimpan thnks ke @ kamaroso97 2 byte disimpan berkat @Neil
Jawaban asli:
sumber
n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1))
.Math.max
ada. Terima kasih telah memberi tahu saya tentang itu![...s]
lebih pendek daris.split``
.Perl,
3027 byteTermasuk +1 untuk
-p
Jalankan dengan input pada STDIN, mis
base.pl
:sumber
LiveScript, 32 byte
Port jawaban ini dalam bahasa favorit saya yang mengkompilasi ke JavaScript. Jika
base~number
operator bekerja dengan variabel saya bisa menulis->1+36~(it/'')sort!pop!
(23 byte), tetapi bertentangan dengan fungsi bind operator: /sumber