Ini adalah versi kode golf dari pertanyaan serupa yang saya tanyakan di stack sebelumnya tetapi saya pikir itu akan menjadi teka-teki yang menarik.
Diberikan string dengan panjang 10 yang mewakili nomor basis 36, menambahnya dengan satu dan mengembalikan string yang dihasilkan.
Ini berarti string hanya akan berisi digit dari 0
ke 9
dan surat dari a
ke z
.
Basis 36 berfungsi sebagai berikut:
Digit paling kanan bertambah, pertama dengan menggunakan 0
untuk9
0000000000> 9 iterasi> 0000000009
dan setelah itu a
ke z
digunakan:
000000000a> 25 iterasi> 000000000z
Jika z
perlu ditingkatkan, loop kembali ke nol dan digit ke kiri bertambah:
000000010
Aturan lebih lanjut:
- Anda dapat menggunakan huruf besar atau huruf kecil.
- Anda tidak boleh menjatuhkan angka nol di depan. Baik input dan output adalah string dengan panjang 10.
- Anda tidak perlu menangani
zzzzzzzzzz
sebagai input.
Kasus uji:
"0000000000" -> "0000000001"
"0000000009" -> "000000000a"
"000000000z" -> "0000000010"
"123456zzzz" -> "1234570000"
"00codegolf" -> "00codegolg"
code-golf
string
base-conversion
Jack Hales
sumber
sumber
"0zzzzzzzzz"
(memodifikasi digit paling signifikan) sebagai test case. Itu tersandung solusi C saya karena off-by-one-error.Jawaban:
05AB1E , 10 byte
Input dalam huruf besar .
Kode
Penjelasan
Menggunakan penyandian 05AB1E . Cobalah online! atau Verifikasi semua kasus uji .
sumber
Japt , 13 byte
Cobalah online! dan Verifikasi kasus uji
Mengambil input sebagai string
Penjelasan
sumber
JavaScript (ES6), 45 byte
Disimpan 4 byte berkat @OOBalance
Cobalah online!
sumber
Haskell , 58 byte
Cobalah online!
Strategi yang sangat kasar: buat semua string panjang-10 base-36 secara berurutan, dan temukan satu yang muncul setelah input dalam daftar. Luangkan banyak waktu untuk merangkai jauh dari awal daftar.
Haskell , 60 byte
Cobalah online!
Membaca string dari kiri ke kanan hingga mencapai karakter yang diikuti oleh sufiks dari semua z, yang mungkin kosong. Menambahkan karakter itu, dan menggantikan z dengan 0.
sumber
Stax , 7 byte
Jalankan dan debug itu
Penjelasan:
sumber
C (gcc) ,
5048 byteBendera carry yang eksplisit tidak diperlukan setelah restrukturisasi loop agar berakhir segera setelah carry tidak akan terjadi. Pengaturan 9-> A dilakukan selama pemeriksaan loop.
Terima kasih kepada ceilingcat untuk sarannya.
Cobalah online!
Versi asli:
7157 byteVersi ini menggunakan flag carry untuk menyebarkan pembaruan: Saya mengaturnya agar benar untuk memulai kenaikan. String dimodifikasi di tempat dan hanya menerima 0-9, AZ. Bagian yang sulit adalah memastikan bahwa 9-> A dapat ditangani dengan benar pada perangkat.
Sunting: Saya menggunakan kembali pointer input sebagai flag carry.
Cobalah online!
sumber
C,
82815350 byteSecara langsung memodifikasi string input; input dan output dalam huruf besar. Cobalah online di sini . Terima kasih kepada Arnauld untuk bermain golf 24 byte dan untuk ceilingcat untuk bermain golf 3 byte lebih banyak.
Tidak Terkumpul:
sumber
ZZZZZZZZZZ
. Jawaban ErikF melakukan hal yang sama, tetapi bahkan lebih pendek: codegolf.stackexchange.com/a/169468/79343Simulator Mesin Turing Online , 745 byte
Penerjemah online
sumber
Perl 6 ,
34 3230 byteBerkat nwellnhof untuk -2 bytes melalui penggunaan
o
operator untuk menggabungkan fungsiCobalah online!
Fungsi yang mengubah argumen menjadi basis 36, menambahkan 1, mengonversi kembali dan kemudian memformatnya. Sekarang gunakan taktik yang sama dengan jawaban Adnan untuk melestarikan nol terkemuka.
sumber
{S/.//}o{base :36(1~$_)+1: 36}
selama 30 byte.o
saat bermain golf sebelumnya, tetapi saya bisa melihat di mana itu mungkin berguna!.succ
(kenaikan satu per satu) tidak berfungsiMATL , 12 byte
Cobalah online!
sumber
Haskell , 63 byte
Cobalah online! Membalik string dan memeriksa karakter pertama:
9
digantikan oleha
.z
digantikan oleh a0
dan secara rekursif karakter selanjutnya diperiksa.succ
, fungsi penerus yang dapat digunakan pada Chars karena mereka adalah turunan dari kelas Enum .Akhirnya string yang dihasilkan dibalik lagi.
sumber
6502 (NMOS *) rutin kode mesin , 26 byte
*) menggunakan opcode "ilegal"
ISB
/0xF3
, bekerja pada semua chip NMOS 6502 asli, bukan pada varian CMOS yang lebih baru.Mengharapkan pointer ke string 10 karakter di
$fb
/$fc
yang diharapkan menjadi nomor base-36. Menambah nomor ini di tempat.Tidak melakukan apa pun yang masuk akal pada input yang tidak valid (seperti misalnya string yang lebih pendek) - menangani
ZZZZZZZZZZ
"dengan benar" secara tidak sengaja;)Komentar pembongkaran
Contoh program assembler C64 menggunakan rutin:
Demo online
Kode dalam sintaksis ca65 :
sumber
Retina 0.8.2 , 12 byte
Cobalah online! Penjelasan: Bagian
dl
dari tujuan substitusi diperluas ke0-9a-z
sementarao
salinan itu ke sumber, menghasilkanz0-9a-z
(meskipun yang keduaz
diabaikan karena tidak pernah bisa cocok). Ini menambah angka yang cocok. Bagian.z*$
dari pola cocok dengan non-z
digit terakhir ditambah semua trailingz
, sehingga menangani carry dari kenaikannya ke0
.sumber
Ruby , 40 byte
Cobalah online!
0
s"zzzzzzzzzz"
mengembalikan string 11-panjangsumber
brainfuck , 109 byte
Cobalah online!
sumber
Apl (Dyalog Unicode) ,
302824 byteTerima kasih kepada ngn untuk petunjuk untuk menyimpan beberapa byte.
Cobalah online!
Membutuhkan ⎕IO dari 0
Gunakan huruf besar
sumber
'1',
bagian darif
? maka1↓
akan menjadi bagian dari kebalikannya(⎕D,⎕A)⍳'1',
->1,(⎕D,⎕A)⍳
(f⍣¯1)1+f←36⊥1,(⎕D,⎕A)⍳⊢
PHP,
6964 byteversi lumpuh :
Jalankan sebagai pipa dengan
-R
. Input case tidak sensitif, output huruf kecil.pendekatan pertama, 69 byte:
Jalankan sebagai pipa dengan
-F
versi perulangan, juga 69 byte :
PHP yang lebih muda akan menghasilkan peringatan untuk konstanta yang tidak ditentukan.
Y
danA
dengan huruf kecil untuk input huruf kecil.Jalankan sebagai pipa dengan
-nR
... atau coba online .
sumber
-R
dan memanggil 66 byte ini juga.printf('%010s',($b=base_convert)(1+$b($argn,36,10),10,36));
- 59 byte($b=base_convert)(a,b,c)
. Saya banyak belajar dari Anda.Python 2 , 88 byte
Cobalah online!
Menambah string "dengan tangan".
sumber
Arang , 14 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Cetak 9
0
s. Ini berfungsi untuk memberikan hasil.Konversikan input dari basis 36, tambahkan, lalu konversikan kembali ke basis 36. Kemudian, balikkan hasilnya dan cetak ke kiri.
sumber
Java 8,
907656 byteMenerima huruf besar dan kecil untuk input. Output selalu dalam huruf kecil.
Terimakasih untuk Okx untuk bermain golf 18 byte.
Cobalah online sini .
Tidak Terkumpul:
sumber
"".format("%10s",t).replace(' ','0')
1
di awal kemudian menghapusnya:s->Long.toString(Long.valueOf("1"+s,36)+1,36).substring(1)
"1"+s
=>1+s
JavaScript (ES6), 89 byte
Yang ini hampir tidak seefisien byte entri JavaScript lainnya , tapi saya membuatnya tanpa memperhatikan aturan ini:
Jadi ini bukan entri serius - hanya untuk bersenang-senang! Ia bekerja dengan string dengan panjang umum, seperti
0abc
, dan menambahkan sebuah1
ketika digit pertama adalahz
, misalnyazzz
->1000
. Input harus berupa huruf kecil.Penjelasan
Ekspresi
(A, B, C)
sebenarnya berarti "lakukan A, lalu lakukan B, lalu kembali C", yang saya gunakan untuk mendeklarasikan beberapa variabel yang saya gunakan kembali dalam kode.s
singkatan dari "string",l
berarti "terakhir",r
berarti "istirahat".Ini adalah fungsi rekursif. Untuk string seperti biasa
aza
, itu hanya akan menambah karakter terakhir (lihat baris 6) -azb
. Tetapi untuk string yang diakhiri denganz
, sepertih0gz
, itu akan berjalan sendiri pada semua hingga karakter terakhir (thez
) dan mengganti a0
di tempat itu (lihat baris 5) -f(h0gz)
=f(h0g) + 0
=h0h0
.The
||'0'
sejalan 5 adalah agar fungsi bekerja ketika itu disebut pada 1-panjang string (yaitu string'z'
). Tanpanya,f('')
disebut (sejak'z'.slice(0, -1)
itu''
), yang memiliki perilaku yang tidak terdefinisi (secara harfiah - coba sendiri), dan itu tidak baik. Hasil yang diharapkanf('z')
adalah'10'
, dari mana kita dapatkanf('0') + 0
, jadi kita gunakan||'0'
. (||'0'
ini sangat berguna karena tidak menghalangi kasus biasa -r
menjadi setidaknya 1-panjang (s
setidaknya 2-panjang) - karena string hanya palsu ketika mereka 0-panjang.)Metode untuk menambahkan string sama dengan yang digunakan pada entri JS lainnya: ubah "angka" basis-36 menjadi angka aktual, tambahkan 1, lalu ubah kembali ke basis-36. Kita tidak perlu khawatir dengan
1
bertambahnya 'z' ('z'
->'10'
), karena kita tidak pernah benar-benar menambah 'z' (lihat baris 4 dan 6: karakter terakhir hanya bertambah jika bukan 'z').Selain itu, kami tidak pernah mengambil risiko membuang angka nol di depan, karena kami tidak pernah benar-benar memanipulasi lebih dari satu karakter sekaligus - hanya karakter terakhir dalam string. Sisa karakter dipotong dengan rapi saat Anda mengiris string apa pun dan kata penutup yang berurutan.
sumber
Bersih ,
8984 byteCobalah online!
Solusi yang lebih singkat berkat Laikoni .
Bersih , 115 byte
Saya suka ketika bisa digunakan
limit(iterate...
Cobalah online!
Menghasilkan jawaban tanpa mengonversi basis menggunakan pencocokan daftar.
? :: [Char] -> [Char]
melakukan pengangkutan ke depan.@ :: Char -> Char
selisih satu per satu, yang menjelaskan kesenjangan antara'9'
dan'z'
.$ :: [Char] -> [Char]
menambah karakter terakhir dan berlaku?
hingga nilainya stabil.sumber
R ,
152123 byteCobalah online!
Pendekatan yang sama sekali berbeda. Dapatkan poin kode ASCII dan secara berulang "menambah" titik kode paling kanan (membuat
0
(57) melompat kea
(97) danz
(122) kembali ke0
(48)) sampai Anda kehabisanz
s. Konversi kembali ke string.Versi lama
Cobalah online!
Ini semua adalah manipulasi teks, yang tidak berjalan seiring dengan golf kode R.
Ganti semua
z
di akhir string dengan0
. Temukan lokasi elemen terakhir sebelum jejak yang baru dicetak0
. Temukan base 36 digit berikutnya. Membuat perubahan. Senang bisa mengalahkan solusi Simulator Mesin Turing Online.sumber
strtoi
untuk membantu Anda memulai; ada beberapa trik golf lagi untuk turun ke 72.strtoi
terbatas pada jumlah yang agak kecil? Saya menyerah beberapa waktu lalu.int
pembatasan itu sangat bermasalah. Gelandangan! Untuk anak cucu, ini adalah solusi gagal saya: Coba online!Starry , 325 byte
Cobalah online!
Penjelasan:
sumber
Bahasa Wolfram (Mathematica) , 39 byte
Cobalah online!
sumber
Python 3.6+ dan gmpy2 , 62 byte
Cobalah online!
(Perhatikan bahwa gmpy2 bukan bagian dari pustaka standar Python dan membutuhkan instalasi terpisah)
sumber
f=
. Fungsi anonim biasanya dianggap ditemukan dalam kode golf.Pyke , 11 byte
Coba di sini!
Bisa jadi 2 byte lebih pendek dengan perubahan bahasa berikut: Jika mode hex digunakan, ubah semua penggunaan base_36 dan base_10 menjadi base_92 (yang sebenarnya bukan basis 92 dalam konteks itu)
sumber
sed , 94 byte
Cobalah online!
Sed banyak menderita karena harus mengubah karakter dengan mencari.
sumber
Zsh ,
4136 byteCobalah online!
sumber
Jelly , 21 byte
Cobalah online!
Gunakan huruf besar. TIO link juga memungkinkan untuk huruf kecil / campuran.
sumber