0x Nama pengguna
Ada begitu banyak orang yang menggunakan layanan olahpesan sehingga mereka kehabisan ruang untuk menyimpan semua nama pengguna! Untuk memperbaikinya, mereka akan mulai menyimpan nama pengguna sebagai heksadesimal, jika memungkinkan.
Jika nama pengguna hanya terdiri dari karakter 0123456789ABCDEF
(tidak peka huruf besar-kecil), itu dapat dikonversi menjadi heksadesimal dan disimpan sebagai integer. Misalnya, nama pengguna ba5eba11
dapat diartikan sebagai 0xBA5EBA11
, integer heksadesimal.
Tapi bagaimana dengan itu 05AB1E
? Itu mendapat nol di depan, yang akan hilang. Jadi, setiap kali kami mengonversi nama pengguna, kami pastikan untuk menambahkan 1
sebelumnya sebelum membacanya sebagai bilangan bulat.
Tantangan
Tugas Anda adalah menulis sebuah program atau fungsi yang, diberi nama pengguna yang tidak kosong sebagai string, 'heksa-kompres' nama pengguna:
- Jika itu dapat ditafsirkan sebagai bilangan bulat heksadesimal, tambahkan 1, diartikan sebagai heksadesimal, dan kemudian cetak hasilnya sebagai basis 10.
- Jika tidak, kembalikan string yang tidak dimodifikasi.
Ini adalah kode-golf , jadi solusi terpendek (dalam byte) menang! Fungsi konversi basis bawaan diizinkan.
Uji Kasus
Anda dapat mengasumsikan bahwa setiap bilangan bulat yang dihasilkan berada dalam rentang bilangan bulat standar bahasa Anda.
Seperti halnya nama pengguna pada sebagian besar sistem pengiriman pesan, string input hanya akan berisi alfanumerik dan garis bawah.
Ingat, Anda selalu perlu menambahkan arahan 1
sebelum konversi!
"ba5eba11" -> 7421737489
"05AB1E" -> 17148702
"dec0de" -> 31375582
"Beef" -> 114415
"da7aba5e" -> 7960443486
"500" -> 5376
"DENNIS" -> "DENNIS"
"Garth" -> "Garth"
"A_B_C" -> "A_B_C"
"0x000" -> "0x000"
Untuk referensi, berikut ini adalah implementasi Python 3 yang saya gunakan untuk kasus uji (ungolfed):
import re
def convert_name(name):
if re.fullmatch('^[0-9A-Fa-f]+$', name):
return int('1' + name.upper(), base = 16)
else:
return name
Jawaban:
05AB1E , 4 byte
Penjelasan
Jika input memiliki karakter hex yang tidak valid,
H
tidak akan mendorong apa pun sehingga nilai terakhir pada stack akan menjadi input yang digandakan, itu sebabnya program mencetak inputnya jika input yang tidak valid.Cobalah online!
sumber
05AB1E
adalah nama pengguna yang valid.JavaScript (ES6), 15 byte
Bagaimana itu bekerja
'0x1'+s
mengubah input menjadi string heksadesimal literal dengan prepended1
, mis0x105ab1e
. Lalu-0
gips hasilnya ke nomor. JavaScript melihat0x
di awal dan secara implisit mencoba untuk mengkonversi dari heksadesimal; jikas
berisi karakter non-heksadesimal, ini akan mengembalikanNaN
. Karena ini falsy (dan output0
tidak pernah dapat diberikan karena prepended1
), kita dapat menggunakan||s
untuk mengembalikans
jika konversi hex gagal.Cuplikan tes
sumber
Python 2 , 44 byte
Mengambil input sebagai string yang dikutip. -2 byte terima kasih kepada Rod!
Karena kami dijamin bahwa input hanya akan berisi alfanumerik dan garis bawah, tidak ada cara untuk membuat Python yang valid setelah
0x1
selain memiliki string hex. Jika input lain, kesalahan diabaikan, dan dicetak seperti semula.Saya sepertinya tidak bisa membuat pertandingan regex lebih pendek dari
try/except
. Faktanya, regex ternyata sangat bertele-tele:sumber
a=int('1'+a,16)
denganexec'a=0x1'+a
(mungkin, perlu menguji)"+input()"
.()
diinput()
Perl 6 , 19 byte
Menguji
Diperluas:
sumber
Perl, 27 byte
-1 byte terima kasih kepada @ardnew .
26 byte kode +
-p
bendera.Masukkan input tanpa baris akhir final. Dengan
echo -n
misalnya:Penjelasan
Ini sangat mudah:
/[^0-9a-f]/i
benar jika input berisi karakter selain yang diizinkan di dalam angka heksadesimal. Jika salah,$_
(yang berisi input) diset ke nilai yang dikonversi (konversi dilakukan oleh builtinhex
).Dan
$_
dicetak secara tersirat berkat-p
bendera.sumber
$_=hex"1$_"if!/[^0-9a-f]/i
Pyth - 9 byte
Gagasan yang sama dengan jawaban fliptack . Coba konversi heksadesimal-desimal yang lain menghasilkan input.
Coba di sini!
sumber
Batch, 33 byte
Bagaimana itu bekerja
Sebuah string diteruskan sebagai argumen, 1 didahului dengan itu, dan string secara implisit dikonversi menjadi desimal dan dicetak. Jika string tidak heksadesimal, itu hanya ditampilkan.
Perlu dicatat bahwa karena matematika bets menggunakan bilangan bulat 32-bit yang ditandatangani, nama pengguna terbesar yang diizinkan adalah
FFFFFFF
.cmd /c
mengambil perintah berikutnya, menjalankannya di terminal baru, dan keluar.set /a
melakukan matematika dan secara implisit menampilkan hasilnya dalam desimal ketika tidak disimpan ke variabel.0x1%1
memberitahu set untuk menambahkan 1 ke argumen pertama (ini mudah karena semua variabel batch adalah string) dan menunjukkan bahwa string harus diperlakukan sebagai heksadesimal.2>nul
membungkam setiap kesalahan yang dihasilkan dari nomor heksadesimal yang tidak valid||
adalah OR logis dan melakukan perintah di sebelah kanan jika perintah di sebelah kiri tidak berhasil. Tanda kurung membuat semuanya hingga titik ini satu perintah.echo %1
cukup tampilkan argumen pertama.sumber
Common Lisp, 71
Tes
Tentukan fungsi
Kutip daftar input yang diharapkan, seperti yang diberikan oleh pertanyaan:
Parsing dan kumpulkan hasilnya
Periksa apakah output yang diharapkan cocok dengan yang sebenarnya:
sumber
C, 108 byte
Ini adalah fungsi yang mengambil string sebagai argumen dan mencetak hasilnya ke STDOUT.
sumber
int
:) implisitJavaScript:
4641 bytesumber
/[^0-9a-f]/i
0-9
oleh\d
, 3 byte dengan menambahkan flag case-insensitive (terima kasih @GilZ) dan 2 byte lebih banyak dengan menghapusF=
, yang tidak diperlukan. Terima kasih untuk sarannya.PHP, 42 byte
hex2bin () mengembalikan false jika input bukan string hex yang valid. Ini lebih pendek daripada menggunakan regex untuk mencari digit non hex, tetapi kita membutuhkan operator @ karena tidak diam ketika gagal.
sumber
hex2bin
gagal untuk string dengan panjang yang tidak rata. Masih dua byte lebih pendek dari denganpreg_match
meskipun:<?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;
untuk 57 byte.bash,
463531 byteSimpan sebagai skrip, dan berikan nama pengguna sebagai argumen.
sumber
Python 2 -
63,52,50, 46 BytesIni menggunakan Python
int()
yang mengubah string apa pun dengan basis yang sesuai menjadi basis 10. Dalam hal ini, string adalah angka 1 yang melekat pada input. Jika input tidak valid (memiliki karakter selain0123456789ABCDEF
(tidak peka huruf besar-kecil), ia mengembalikanValueError
:Coba di sini!
Terima kasih kepada @FlipTack karena telah menghemat 15 byte!
sumber
Ruby,
4744 byteAku bisa menghapus 3 byte dengan mengubahputs
untukp
, tapi aku merasa seperti output akan dianggap salah karena memiliki baris baru di akhir.Sunting: Diubah
puts
karenap
trailing newlines biasanya diterima, terima kasih @Mego.sumber
Japt , 11 byte
Cobalah secara Online!
Terima kasih banyak untuk produk ETH!
sumber
Dyalog APL , 37 byte
Tidak menggunakan validasi bawaan atau konversi hex-dec. Membutuhkan
⎕IO←0
yang default pada banyak sistem.Tidak Disatukan:
d ← ⎕D , 6 ↑ ⎕A
d mendapat D igits diikuti oleh 6 elemen pertama dari lfabet Au ← 1 (819⌶) ⍵
u mendapat argumen huruf besar (819 ≈ "Besar")∧/ u ∊ d:
jika semua elemen u adalah anggota d , maka:16 ⊥ 1 , d ⍳ u
cari indeks u dalam d , tambahkan 1, dan evaluasi sebagai basis 16⍵
lain: kembalikan argumen (tidak dimodifikasi)TryAPL online:
Set
⎕IO
ke nol, menentukan pengganti⌶
(dilarang di TryAPL untuk alasan keamanan), dan set⎕PP
( P etak P recision) ke 10 untuk hasil besarCoba semua test case
sumber
REXX,
4948 byteThe
signal on syntax
memberitahu juru bahasa untuk melompat ke labelsyntax
setiap kali kesalahan sintaksis terjadi. Program mencoba untuk menetapkan ulanga
dengan versi konversi hex-to-desimal dengan angka 1 terkemuka, tetapi melompat kesyntax
label jika gagal. Jika konversi tidak lulus, itu hanya mengabaikan label dan menampilkan variabel yang ditugaskan kembali.sumber
PowerShell , 35 byte
Cobalah online! atau Jalankan semua test case!
Penjelasan
$v
)0
) adalah hasil dari string yang berisi0x1$v
piped intoInvoke-Expression
(iex
), sementara secara bersamaan menetapkan nilai ini ke$h
. Jika konversi gagal,$h
akan tetap ada$null
.-not
dari$h
. Apa pun$h
yang akan dikonversi secara implisit menjadi[bool]
($null
dalam kasus konversi yang tidak valid akan menjadi$false
, bilangan bulat positif dalam kasus konversi yang berhasil menjadi$true
) sebelum dinegasikan, yang kemudian secara implisit dikonversi ke[int]
oleh pengindeks array[]
($true
akan1
,$false
akan menjadi0
), sehingga menghasilkan elemen pertama dari array (hasil konversi) dipilih jika konversi berhasil, dan elemen kedua dipilih jika konversi tidak berhasil.sumber
Scala, 40 byte
Pemakaian:
Penjelasan:
sumber
C #, 58 byte
Tidak disatukan dengan kasus uji:
Coba online
sumber
Dart, 51 byte
Coba di sini
Sebagian besar overhead berasal dari parameter bernama ... Oh well!
Setidaknya Dart memungkinkan Anda diketik secara dinamis, jika Anda ingin: D
sumber