Dalam tantangan ini, Anda akan menerima input, mengonversinya menjadi heksadesimal, membuat beberapa perubahan, dan menghasilkan hasilnya.
Karena mereka hanya 16 karakter dalam heksadesimal, kode Anda harus sesingkat mungkin.
Contohnya
Contoh dipisahkan oleh garis kosong. Baris pertama adalah input, baris kedua menunjukkan langkah-langkah, ketiga menunjukkan output
234589
234589 -> 3945D -> 39454 -> 9A1E -> 9115 -> 239B -> 2392 -> 958
958
435234
435234 -> 6A422 -> 61422 -> EFEE -> 5655 -> 1617
1617
153
153 -> 99 -> 99 -> 63
1617
Langkah
Masukan akan selalu berupa bilangan bulat positif
Untuk menghasilkan output, Anda akan mengikuti langkah-langkah berikut:
- Ubah input menjadi heksadesimal
- Ganti huruf apa saja dengan indeksnya dalam alfabet (mis.
a -> 1, b -> 2
) - Ubah hasilnya kembali menjadi heksadesimal
- Jika hasilnya berisi huruf apa saja, lanjutkan ke langkah 2. Jika tidak, hasilkan hasilnya
Ini adalah kode-golf sehingga kode terpendek dalam byte menang!
code-golf
math
number
base-conversion
hexadecimal
Downgoat
sumber
sumber
749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Jawaban:
Jelly , 18 byte
Cobalah online!
Biner, versi 18 byte dari kode sumber memiliki dump xxd
dan bekerja dengan versi penerjemah Jelly ini .
Bagaimana itu bekerja
Ḍ
(decimal-to-integer) seharusnya berfungsi sebagai singkatanḅ⁵
, tetapi versi terbaru Jelly pada saat posting ini memiliki bug yang mencegah saya menggunakannya.sumber
JavaScript ES6,
98926764 byteDisimpan 3 byte berkat @Downgoat, 3 lainnya terima kasih ke @ user81655
Menemukan versi yang jauh, jauh lebih pendek, membuang loop untuk rekursi:
Mungkin bagian yang paling menarik dari program ini adalah
replace
fungsinya:Cuplikan tes
(diambil dari sini )
sumber
.toString(16)
:x=>eval("for(x=(j=n=>n.toString(16))(x);/\\D/.test(x);)x=j(+x.replace(/\\D/g,z=>+('0x'+z)-9))")
. Mungkin juga menghemat beberapa byte menggunakan rekursi.replace
string sebelum mengevaluasi, tetapi ternyata lebih lama.h=
CJam,
2119 byteUji di sini.
Penjelasan
Kasus yang sangat jarang dari hasil modulo negatif sangat membantu. :)
sumber
Ruby, 35 + 1 = 36
Dengan bendera baris perintah
p
, jalankanPenjelasan:
Bendera -p membuat loop, menyimpan input dan output akhirnya dalam variabel
$_
.'%x'
melakukan konversi hex, dantr!
melakukan penggantian digit dan mengembalikan nilai falsey jika tidak ada yang berubah. ulang dimulai dengan yang baru$_
.sumber
Julia,
7874 byteIni adalah fungsi rekursif yang menerima integer dan mengembalikan string.
Tidak Disatukan:
sumber
MATL , 23
25bytePenolakan
Saat menulis jawaban ini, saya perhatikan ada bug di
dec2base
fungsi MATL , memperbaikinya, dan merilis versi baru dengan koreksi (serta beberapa akumulasi perubahan yang tidak terkait lainnya) .Karena saya menggunakan versi yang lebih lama dari tantangan ini, menurut konsensus di Meta jawaban ini tidak memenuhi syarat untuk menang .
Kode
Contoh
Penjelasan
sumber
Dyalog APL,
373633 byteTerima kasih kepada Adám dan ngn untuk saran. Saya menjaga
16⊥⍣¯1⊢⍵
bukan⍵⊤⍨⍴⍨16
- itu byte tambahan, tetapi memungkinkan kita untuk beroperasi pada jumlah ukuran yang sewenang-wenang daripada 64-bit.sumber
{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
10⊥10|X+10≤X
->10(⊣⊥|+≤)X
(secara teknis tidak setara, tetapi berfungsi untuk digit hex)16⊥⍣¯1⊢⍵
->⍵⊤⍨⍴⍨16
Python,
118105 bytesumber
PHP,
14012612211411287 atau 84 byte (termasuk-r
)Tidak sepenuhnya yakin tentang bagaimana aturan di sekitar ini karena ini adalah upaya codegolf pertama saya, tetapi kode dapat dijalankan
php -r
tanpa perlu<?
dan?>
Kode
Diformat
Kode Alternatif (menggunakan argv bukan stdin)
Diformat
Catatan
Sunting 1: Saya memotong panggilan
intval()
untuk menyimpan 14 karakter karena PHP akan dengan senang hati memperlakukan string numerik sebagai angka.Sunting 2: Saya menghapus
\n
dari output yang saya lupa hapus setelah pengujian, dan menghapus tanda kutip dari gema akhir untuk menyimpan total 4 karakter.Sunting 3: Menghapus panggilan terakhir ke
intval()
Sunting 4: Disimpan 2 byte dengan menghapus tanda kutip dari garis regex
Sunting 5: Diubah
[a-f]
menjadi\D
untuk menyimpan 3 karakter,strval
panggilan dihapus daripreg_replace
untuk 8 lebih; menambahkan versi yang menggunakanargv[]
bukannya STDIN, memindahkan terminator loop ke pernyataan while (oops!) menyimpan 11 karakter lebih banyak, dan memindahkan panggilan dechex kesubject
bagian daripreg_replace
untuk 3 lainnya, membuat total 25; juga menambahkan versi non-stdin sebagai versi alternatif yang menggunakan 3 karakter lebih sedikit. Terima kasih atas bantuannya, @Blackholesumber
-r
opsi). Tapi seorang pemimpin;
selalu lebih pendek dari seorang pemimpin?>
, jadi jangan lupakan itu. Ngomong-ngomong, ini adalah kode yang lebih pendek:for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;
(-29 byte).153
harus memberi63
, bukan99
. Tetapi-r
gratis. (lihat codegolf.meta.stackexchange.com/a/2428/55735 )R ,
106103102 byte-3 byte dengan menggunakan
if
bukanwhile
-1 byte berkat Giuseppe menggunakan
as.double
bukanas.integer
Cobalah online!
Cukup tambahkan
a(your_integer_here)
ke TIO untuk melihat hasilnya.Saya menggunakan rekursi untuk menerapkan kembali fungsi ke setiap iterasi berturut-turut, dengan syarat tidak menemukan huruf 'abcdef' di dalam string, ketika kondisi ini False, output hasilnya sebagai string. Bagian terbaiknya adalah penemuan
chartr
fungsi saya, yang memungkinkan saya untuk menukar elemen dengan elemen terkait dalam string. String ini berasal dari fungsi yang memaksa heksadesimal menjadi format string.Sunting: Saya mencoba menggunakan
sprint("%x",y)
alih-alihas.hexmode(as.double(y))
, tetapi saya masih diharuskan untuk menggunakanas.double
suatu tempat dalam kode, yang lebih panjang21 byte.sumber
as.double
lebih pendek darias.integer
05AB1E , 12 byte
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
ÐþQ
alternatifnya bisaD.ï
(D
: Gandakan.ï
;: is_int?) untuk jumlah byte yang sama.sumber
[hÐþQ#Au₂L‡
tidak selalu bekerja sayangnya. Negara menyatakan untuk mengonversi ke hex satu kali pertama, dan kemudian di setiap iterasi. Jika saya menempelkan kode Anda di suite pengujian saya, tiga kasus pengujian pertama sudah benar, tetapi dua yang terakhir gagal.C # (Visual C # Interactive Compiler) , 92 byte
Cobalah online!
Lebih sedikit kode golf:
sumber
Mathematica, 107 byte
Tidak dapat memikirkan cara lain untuk bermain golf ini ...
sumber
Mathematica, 80 byte
Ini menggunakan trik yang rapi untuk loop-sementara yang saya pelajari dari alephalpha. The
//.
adalah "menerapkan aturan substitusi ini sesering mungkin". Kemudian kami menggunakan pola,l_/;Max@l>9
yang hanya cocok jika daftar digit heksadesimal masih mengandung digit lebih besar dari 9.sumber
Japt,
4540 byteBerdasarkan jawaban JS saya:
Cukup menyedihkan untuk bahasa golf, ya? Tampaknya ada banyak orang menyadari selama tantangan ini bahwa penerjemah mereka memiliki bug, dan saya sekarang termasuk di antara mereka. Ini harus dapat dilakukan dalam 30 byte atau kurang, tetapi bug membuat ini tidak mungkin.
Ini menciptakan fungsi
H
yang bisa disebut seperti:Atau, di sini adalah program lengkap, mengambil masukan dari STDIN:
Cobalah online!
sumber
GNU Sed (dengan ekstensi eval), 44
Saya berharap
sed
akan mengizinkany/A-F/1-6/
. Tapi ternyata tidak.sumber
Python 3,
10189 byteSecara keseluruhan, ini sangat mirip dengan solusi Boomerang , tetapi dibutuhkan beberapa pendekatan berbeda untuk berbagai aspek.
Ini adalah versi diperluas dari kode asli saya:
11 byte hilang berkat @pacholik (mengganti jeroan
join
dengan operasi tunggal yang bekerja untuk digit dan huruf). Byte lain dipangkas dengan menggantijoin
trik dengan slicing-string yang memukul saya pada saat bola lampu (tetapi yang sudah ada dalam tips golf Python , meskipun di bawah judul yang menentukan Python 2).sumber
join
dapat disingkat menjadistr(ord(c)%12)for c in n
.Java, 201 byte
sumber
Japt , 21 byte
Cobalah online!
Peningkatan signifikan atas jawaban Japt yang ada. Itu tidak menangani
153 -> 63
kasus yang diusulkan dalam komentar, tetapi tidak ada jawaban lain yang tampaknya baik jadi saya akan meninggalkannya kecuali OP mengklarifikasi.Output sebagai daftar angka desimal, dapat diubah menjadi keluaran angka desimal untuk 1 byte
Penjelasan:
sumber
APL (NARS) 104 karakter, 208 byte
uji:
Saya tidak tahu apakah itu baik-baik saja ... Mungkin tidak cukup untuk jawaban kualitas standar ...
sumber
Serius, 42 byte
Hex Dump:
Cobalah online
Harus ada cara yang lebih pendek dari ini, tetapi inilah yang saya dapatkan ... (Di sinilah saya mendapati diri saya berharap
W
benar-benar muncul, karena lebih pendek untuk meletakkan;
hak sebelum yang terakhir ketika Anda TIDAK menginginkannya daripada untuk menempatkanX
SETIAP SETIAPW
. Di sini, memilikiW
pop bukannya mengintip akan menghemat tiga byte.)sumber
Japt, 18 byte
Cobalah
sumber
PHP, 71 byte
Jalankan sebagai pipa dengan
-nR
atau coba online .Menghasilkan peringatan untuk beberapa input dalam PHP 7.1 dan yang lebih baru; ganti
-
dengan!=
untuk memperbaiki.Menghasilkan peringatan lain di PHP 7.2; masukkan
abcdef
tanda kutip untuk memperbaikinya.sumber