Kita semua pernah melakukannya, yah, mungkin tidak, tetapi membuat bahasa asing Anda sendiri dan sistem penomoran adalah pokok dari penulisan fantasi, tetapi sebagian besar hanya kegiatan yang menyenangkan.
Tugasnya sederhana, ambil dua input:
Input daftar yang diurutkan terdiri dari 10 [sepuluh] 'angka' unik (setiap karakter ASCII yang dapat dicetak) dan menafsirkannya, secara berurutan, sebagai nilai 0, 1, 2, 3, ..., 9
+ Ada pengecualian untuk apa yang bisa menjadi angka di sini. Operator aritmatika (+, -, *, /), Tanda kurung, dan spasi tidak dapat digunakan sebagai salah satu angka.
Masalah aritmatika hanya menggunakan 'angka'
Dan output hasil bilangan bulat setara dalam bentuk yang diberikan.
Ini sebuah contoh:
INPUT
abcdefghij
bcd + efg + hij
OUTPUT
bdgi
Dalam contoh, daftar input (Anda dapat memilih bentuk daftar) dari 'abcdefghij' yang sesuai dengan '0123456789' seperti 'hjkloiwdfp' juga akan sesuai 1 dengan 1 dengan '0123456789' di mana alih-alih 'a' yang dikaitkan dengan nol, 'h' tidak. Berikut aritmatika 'diterjemahkan' ke 123 + 456 + 789, yang sama dengan 1368. Ini kemudian harus dikeluarkan dalam bentuk yang kami berikan, jadi b (yang mewakili 1) d (untuk 2) g (untuk 6) dan i (untuk 8).
KASUS UJI
abcdefghij
abc + def - ghij
-gedc
qwertyuiop
qwerty / uiop
e
%y83l;[=9|
(83l * 9) + 8%
y9|8
LEBIH BANYAK ATURAN
- Lubang Standar dilarang!
- Ini kode golf, jadi jawaban tersingkat dalam byte menang.
- Harus berupa program atau fungsi lengkap yang mengambil input dan output dalam format apa pun yang paling cocok untuk Anda. (Tidak bisa menambahkan informasi tambahan dalam input, cukup 'angka' dan ekspresi.
- Gunakan bahasa apa pun yang Anda suka (asalkan sesuai dengan aturan lain)
sumber
q.ioiopewioyetqorw...
. Jika demikian, pembulatan seperti apa yang harus diterapkan?1
untuk5/3
, bukan2
, karena pembagian bilangan bulat (bukan pembulatan). Ini tidak membatalkan tantangan, tetapi Anda mungkin harus mengizinkan jawaban yang berbeda untuk kasus uji yang sama (lihat jawaban T-SQL saya di bawah).Jawaban:
05AB1E ,
109 byte(Sekarang) ditampilkan sebagai daftar karakter.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Versi baru dari build 05AB1E adalah build di Elixir . The
.E
fungsi akan memanggilcall_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)
, di manaCode.eval_string
adalah builtin Elixir .Perhatikan bahwa versi lawas 05AB1E tidak akan berfungsi untuk ini, karena ini dibangun dengan Python. Angka-angka dengan 0s depan tidak akan dievaluasi:
Lihat semua kasus uji dalam versi lawas (yang menggunakan versi 10-byte karena
Åв
builtin baru).sumber
R , 58 byte
Cobalah online!
Menggunakan terjemahan karakter
chartr
untuk menukar digit,parse
s daneval
ekspresi, laluchartr
kembali ke digit asli.Jika pembulatan ke bilangan bulat terdekat diperlukan, ini
R , 65 byte
Cobalah online!
sumber
[
sebagai nama pendek untuk fungsi dengan 3 parameter sangat cerdas. Sudah selesai dilakukan dengan baik.T-SQL, 117 byte
Jeda baris hanya untuk keterbacaan.
Input melalui tabel t yang sudah ada t dengan kolom teks c (karakter) dan e (persamaan), sesuai aturan IO kami .
Menggunakan fungsi SQL 2017
TRANSLATE
untuk beralih di antara karakter dan menghasilkan string yang tidak hanya berisi persamaan, tetapi kode untuk menerjemahkan kembali ke karakter asli:String ini kemudian dievaluasi menggunakan
EXEC()
.Mungkin ada beberapa karakter (seperti satu kutipan
'
) yang akan memecahkan kode ini; Saya belum menguji semua karakter ASCII yang mungkin.Per tantangan, saya mengevaluasi ekspresi seperti yang diberikan, tergantung pada bagaimana bahasa saya menafsirkan operator tersebut. Dengan demikian, test case kedua mengembalikan 1 (
w
), dan bukan 2 (e
), karena pembagian bilangan bulat.sumber
Perl 6 , 38 byte
Cobalah online!
Saya tidak yakin bagaimana pembulatan seharusnya bekerja. Jika putaran di akhir maka saya dapat menambahkan
.round
untuk 6 byte . Jika perilaku/
harus berbeda maka mungkin lebih lama. Membawa input seperti karif(arithmetic)(numerals)(arithmetic)
.Penjelasan:
sumber
Stax ,
746665 byteJalankan dan debug itu
Stax tidak bekerja dengan baik di sini, tidak memiliki instruksi "eval" yang sebenarnya. Ini memiliki satu yang disebut "eval" dalam dokumen, tetapi hanya bekerja pada nilai-nilai literal, bukan ekspresi penuh.
sumber
Bash, 97 byte
Bisa jadi lebih kecil jika kita bisa memotong, daripada bulat. Juga sulit untuk menangani angka nol di depan (seperti dalam kasus uji # 2) karena angka Bash diinterpretasikan dimulai dengan 0 sebagai oktal.
sumber
tr
adalah bagian dari coreutils, sementarabc
tidak. Meskipun demikian,bc
ini adalah alat yang sangat umum. Setiap perintah lain dalam jawaban ini adalah bash.$T
hanya satu byte lebih pendek dari0-9
, Anda hanya menggunakannya dua kali, dan Anda menghabiskan 8 byte untuk mendefinisikannya.Bean ,
9490 byteHexdump
JavaScript
Penjelasan
Program ini secara implisit menetapkan input baris pertama dan kedua sebagai string ke variabel
a
danb
masing - masing.Setiap karakter
c
pada barisb
diganti dengan indeks masing-masingi
karakter yang ditemukan pada barisa
, atau karakter itu sendiri jika tidak ditemukan.Kemudian ia menghapus setiap urutan satu atau lebih
0
yang didahului oleh batas dari string yang dihasilkan. Ini untuk mencegaheval()
dari mengevaluasi urutan angka yang dimulai dengan0
sebagai oktal literal.Setelah
eval()
danMath.round()
, hasilnya dipaksa kembali ke string dan setiap karakter digiti
diganti oleh karakter yang sesuai dari garisa
pada indeksi
.Uji Kasus
Demo
Demo
Demo
Demo
sumber
Perl 5
-p
, 63 byteCobalah online!
Mengambil ekspresi pada baris input pertama dan daftar terjemahan pada baris kedua.
sumber
Perl 5 , 130 byte
Cobalah online!
Mungkin double eval itu entah bagaimana bisa diubah menjadi
s/.../.../geer
.sumber
Arang , 14 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Catatan: Ekspresi dievaluasi sesuai dengan semantik Python 3, jadi misalnya memimpin nol pada angka bukan nol adalah ilegal. Penjelasan:
sumber
0
s terkemuka tidak bekerja di Python, yang ada dalam kasus uji.Python 3 , 137 byte
Pendekatan non-regex menggunakan
str.translate
danstr.maketrans
untuk mengganti karakter. Saya kehilangan banyak karakter pada pemangkasan nol terkemuka ...Cobalah online!
sumber
Python 3 , 167 byte
Cobalah online!
Kamar untuk perbaikan ...
sumber
Bahasa Wolfram (Mathematica) , 121 byte
Saya mendefinisikan fungsi murni dengan dua argumen. Karena beberapa fungsi diulang, saya menyimpannya dalam variabel untuk menyimpan beberapa karakter. Kode ini hanya melakukan beberapa penggantian string dan kemudian gunakan
ToExpression
untuk mengevaluasi ekspresi dengan kernel Wolfram.Cobalah online!
sumber
Lua ,
162151150 byteload
bukannyafunction(...) end
Cobalah online!
Bukan hal yang terpendek di dunia (Lua memaksa Anda untuk menjadi mewah cukup keras, terutama dengan kata kunci besar), tetapi cukup menyenangkan untuk dibuat. Program penuh mengambil input sebagai argumen dan hasil pencetakan.
Penjelasan
pengantar
Tetapkan nilai dari argumen ke variabel. Kamus kami adalah
l
dan ekspresip
.Ekspresi berikut ini cukup sulit untuk dipahami karena memiliki urutan eksekusi yang aneh, jadi saya akan menjelaskannya langkah demi langkah:
Mengonversi ke angka normal
Lakukan penggantian pada string ekspresi: ambil setiap simbol dan berikan fungsinya (
load
terbukti sendiri lebih pendek dari deklarasi normal di sini).Fungsi menemukan posisi kemunculan dalam string dict untuk simbol yang diteruskan menggunakan
find
....
adalah argumen pertama (dan satu-satunya) di sini karena kita berada dalam fungsi vaarg (salahload
satunya adalah) yang merupakan simbol kita saat ini. Argumen berikut diperlukan untuk membuatfind
abaikan simbol khusus (1
hanya nilai pendek yang mengevaluasitrue
ketika dikonversi ke boolean): posisi awal (satu default di sini) danplain
, yang sebenarnya menonaktifkan penanganan pola. Tanpa program tersebut gagal pada kasus uji ketiga karena%
menjadi istimewa.Jika kecocokan ditemukan, kurangi satu karena string Lua (dan array btw) berbasis 1. Jika tidak ada kecocokan yang ditemukan, itu tidak akan menghasilkan apa-apa, sehingga tidak ada penggantian yang dilakukan.
Memecahkan
Lanjutkan
return
ke ekspresi kami untuk membiarkannya mengembalikan hasil, menghitungnya dengan mengkompilasi sebagai fungsi Lua dan memanggilnya, melakukan pembulatan ( ini sebaliknya untuk membuatnya lebih pendek).Pada akhirnya kami mendapatkan solusi numerik untuk masalah kami, hanya mengubahnya kembali tetap.
Membuatnya gila lagi
Baris pertama adalah cara pendek untuk mengubah angka menjadi string, jadi sekarang kita dapat memanggil metode string dengan cara singkat. Ayo lakukan!
Sekarang
gsub
dipanggil lagi untuk mengganti semuanya kembali menjadi gila. Waktu%d
ini digunakan.
sebagai pengganti pola karena fungsi kami mungkin dan harus memproses hanya angka (.
akan mengakibatkan kesalahan pada angka negatif). Fungsi waktu ini (load
ed lagi untuk menyimpan byte) pertama-tama menambah1
ke vaargument pertama (dan satu-satunya), mengonversinya ke posisi dalam string dict, kemudian mengembalikan karakter darinya pada posisi itu.Hore, hampir sampai!
Final dramatis, atau Mengapa Masalah Kurung
Nah ... mengapa dua pasang kurung? Sudah waktunya untuk berbicara tentang kesetaraan ... eh, banyak kembali di Lua. Masalahnya adalah bahwa satu fungsi dapat mengembalikan beberapa nilai dari satu panggilan (lihat pertanyaan meta ini untuk lebih banyak contoh).
Di sini, yang terakhir
gsub
mengembalikan dua nilai: string jawaban yang kita butuhkan dan jumlah penggantian yang dilakukan (hitungan digit sebenarnya, tetapi siapa yang peduli). Jika bukan karena pasangan internal, baik string dan nomor akan dicetak, mengacaukan kami. Jadi di sini kita mengorbankan dua byte untuk menghilangkan hasil kedua dan akhirnya mencetak produk dari pabrik gila ini.Yah, saya senang menjelaskan hampir sebanyak bermain golf, semoga Anda tahu apa yang terjadi di sini.
sumber