Kebanyakan orang di sini terbiasa dengan tujuh tampilan segmen, yang juga digunakan dalam puzzle batang korek api. Di bawah ini adalah digit 0
melalui 9
dan surat a
melalui z
, kecuali k,m,t,v,w
, yang ditulis dalam format ini.
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
_ _ _ _ _ _ _ _ _
|_| |_ | _| |_ |_ | |_ | | | _ _ |_| |_| _ |_ |_| |_| _|
| | |_| |_ |_| |_ | |_| | | | |_| |_ | | |_| | | | _| |_| | | | |_
Tantangannya di sini sederhana. Diberikan string input, output jumlah korek api yang diperlukan untuk mewakili string itu. Jika string berisi karakter di luar representasi di atas, abaikan saja (hitung sebagai 0).
Misalnya, untuk input 53
, total 10
korek api diperlukan, 5
untuk 5
dan 5
untuk 3
, jadi hasilnya adalah 10
.
Untuk input hello
total 19
diperlukan korek api h (4), e (5), l (3), l (3), o (4)
, sehingga hasilnya adalah 19
.
Untuk kejelasan, berikut adalah korek api yang diperlukan untuk membangun setiap karakter:
0 -> 6
1 -> 2
2 -> 5
3 -> 5
4 -> 4
5 -> 5
6 -> 6
7 -> 3
8 -> 7
9 -> 6
a -> 6
b -> 5
c -> 4
d -> 5
e -> 5
f -> 4
g -> 5
h -> 4
i -> 2
j -> 4
l -> 3
n -> 3
o -> 4
p -> 5
q -> 5
r -> 2
s -> 5
u -> 3
x -> 5
y -> 4
z -> 5
Sekarang untuk twist, dan ada dua dari mereka.
- Yang pertama adalah bahwa input dianggap case- in sensitive. Yaitu,
A
dana
keduanya harus dihitung untuk6
korek api, meskipun representasi visualnya terlihat seperti huruf besarA
. - Skor Anda adalah kode sumber Anda yang dijalankan melalui algoritma ini, ditambah panjang kode sumber Anda dalam byte, lebih rendah lebih baik. Misalnya, jika kode sumber
abc123
Anda, skor Anda akan menjadi6+5+4+2+5+5 = 27 + 6 = 33
. Jika kode sumber Anda#&@()*
, skor Anda akan menjadi0 + 6 = 6
.
Contoh Input / Output
0 -> 6
53 -> 10
111 -> 6
112 -> 9
8888 -> 28
hello -> 19
PPCG -> 19
Programming Puzzles & Code Golf -> 99
#&()mt!!~ -> 0
*DḌƤÆE%Ḅċ0 -> 16
Aturan
- Jika berlaku, Anda dapat mengasumsikan bahwa input / output akan sesuai dengan tipe Integer asli bahasa Anda.
- Input dan output dapat diberikan dengan metode apa pun yang mudah .
- Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
- Celah standar dilarang.
sumber
|_\n|_
(huruf kecilt
)[0-9a-z]
, haruskah kita menghitung 0 batang korek api? Itulah yang saya mengerti dari skor Anda adalah kode sumber Anda dijalankan melalui algoritma ini , ditambah panjang kode sumber Anda dalam byte .Jawaban:
Python 2 , 97 byte + 237 pertandingan = 334
Cobalah online!
Ini berfungsi dengan membuat string di mana setiap karakter yang dapat dibangun muncul jumlah korek api yang sama yang diperlukan untuk membangun karakter itu
sumber
+'069a8'*6+'8')
alih - alih+'069a'*6+'8'*7)
.Perl 5 dengan
-pF
, 95 byte + 14, 109Ini setara dengan:
tetapi dengan menggunakan
~
operator kita dapat menggunakan karakter byte tinggi dan menghindari banyak karakter tanpa benar-benar mengorbankan byte.Masih jauh dari skor Ton, bahkan dengan bantuan!
Cobalah online!
Solusi ini mengandung unsintables jadi inilah dump hex reversibel untuk memverifikasi byte-count:
sumber
}{
? Jatuhkan dan-n
pilihannya. Anda juga tetap lupa+lc
bukannyalc()
:-)+
tidak langsung terlintas dalam pikiran! Saya membutuhkann
mesin saya dan lupa saya bisa menjatuhkannya!}{
and-p
" (dan ganti dengan-n
perl Anda masih membutuhkannya. Saat ini tidak dihitung lagi)JavaScript (ES6), 198 (102 byte + 96 korek api)
Disimpan 5 poin berkat @ l4m2
Cobalah online!
Bagaimana?
Kami menggunakan modulo 9 kode ASCII karakter yang tidak menambahkan hukuman apa pun untuk menyandikan jumlah korek api.
Kami tidak perlu khawatir tentang kasus ini karena
parseInt()
tidak peka terhadap huruf besar-kecil.Untuk karakter yang tidak cocok dengan [0-9A-Za-z] ,
parseInt()
mengembalikanNaN
dan hasil pencarian string masukundefined
. Setelah dipaksa ke string,"undefined".charCodeAt()
mengembalikan kode ASCII"u"
, yaitu 117 . Dengan mudah, 117 modulo 9 memberikan 0 seperti yang diharapkan.sumber
v=>[...v].map(w=>t+='~{w__^_{]|{{_^__^_^w^~]~]^__w_~]~~_^_'.charCodeAt(1+parseInt(w,36))%9,t=+[])|t
1 kurangJelly , 42 byte + 0 batang korek api = 42 poin
Terima kasih kepada @JonathanAllan untuk -2 poin!
Cobalah online!
Bagaimana itu bekerja
Literal yang dimulai dengan
“
dan diakhiri dengan’
split on“
, ganti karakter yang tersisa dengan indeks berbasis 1 mereka di halaman kode Jelly, lalu konversikan dari basis bijective 250 ke integer.Ini mengkode literal khusus
×/
berkurang dengan multiplikasi, menghasilkan(Pengkodean integer ini secara langsung akan menghemat 6 byte, tetapi biayanya sebesar 28 batang korek api.)
ṚṚ
membalikkan dua kali; panggilan pertama mempromosikan integer ke array digitnya. Ini menghasilkanċЀØW$
menghitung (ċ
) kemunculan setiapЀ
karakter ( ) dari "A ... Za ... z0 ... 9_" (ØW
) dalam string input.Akhirnya
æ.
mengambil produk titik, mengalikan setiap jumlah karakter dengan biaya yang sesuai dalam korek api, lalu mengambil jumlahnya.sumber
D
menyimpan yang lain. Cobalah onlineƊ
. Terima kasih!Perl 5
-p
,9064 kode + 9 eval harness + 14 batang korek api = 87Ganti kode hex dengan varian liter 1 literalnya ( bukan UTF-8 ketika TIO mencoba) untuk skor yang diklaim
Cobalah online!
Kode di dalam string yang dilengkapi:
sumber
Jelly , 34 byte + 3 pertandingan = 37
Tautan monadik yang menerima daftar karakter dan mengembalikan integer.
Cobalah online!
Bagaimana?
Bekerja dengan cara yang mirip dengan jawaban Jelly Dennis tetapi butuh usaha yang cukup sehingga saya merasa perlu jawaban lain. Perbedaan intinya adalah bahwa ia menurunkan huruf besar-kecil input untuk biaya tiga kecocokan (
Œl
mengandung al
) yang kemudian memungkinkan sejumlah yang jauh lebih kecil untuk digunakan untuk membuat array biaya. Bagian yang sulit adalah menemukan cara untuk membangun nomor itu tanpa korek api sambil tetap singkat.ØW
menghasilkan"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
sehingga penghitungan kejadian input yang lebih rendah selalu dimulai dengan 26 nol. Kita dapat membalikkan ini dan melakukan dot-produk dengan array yang panjang 37 bukannya satu yang panjang 63.sumber
PHP 176 byte = 397 skor
Cobalah online!
sumber
SOGL V0.12 , 34 byte + 18 = 52
Coba Di Sini!
Bermain golf, tetapi tidak banyak mencetak :
sumber
Python 3 , 138 + 265 = 403 byte
Cobalah online!
sumber
Ruby , 125 byte + 87 batang korek api = 212
Cobalah online!
Sangat terinspirasi oleh jawaban Javascript Arnauld .
Biasanya biaya menyatakan lambda untuk digunakan hanya dua kali tidak sepadan, tetapi berat batang korek "
scanap
" di.scan(/./).map
mengubahnya. Ini adalah tantangan yang menyenangkan!sumber
MATL , skor
166156Panjang kode 41 + keluaran untuk kode yang digunakan sebagai input 115.
Cobalah online!
sumber
R, 112 byte + 319 pertandingan = 431 skor
Cobalah online!
Kudos to Giuseppe yang datang dengan perbaikan ini.
Versi lama, 143 byte + 454 pertandingan = 597 skor
Untuk membuat
el()
fungsi berfungsi pada TIO, Anda harus menggunakanlibrary(methods)
.Astaga, itu R verbose!
sumber
methods
paket, tetapi karena ini adalahbase
paket, saya selalu mendorongnya di header dan tidak menghitungnya untuk byte-count.readline
juga tidak akan berfungsi pada TIO karena ini bukan sesi interaktif. Ini jelas golfable.Perl 6 , 87 byte + 26 batang korek api = 113
Cobalah online!
Menggunakan beberapa karakter Unicode non-ASCII. Tabel pencarian dikodekan dalam string Unicode:
Karakter dikonversi ke indeks dengan konversi base-36 menggunakan angka Arab-Indic:
sumber
sed, 367 (byte kode sumber) + 532 (jumlah batang korek api untuk kode sumber) = 899
Cobalah secara Online
Versi multi-baris:
Penjelasan:
Script di atas membaca input standar baris demi baris (ke dalam ruang pola - "cara sed" yang biasa) dan, untuk setiap baris, output jumlah korek api yang diperlukan untuk mewakili semua karakter yang dapat diwakili batang korek api di baris itu. Perhitungan untuk setiap jalur input terjadi sebagai berikut:
Pertama, kami menghapus setiap karakter yang kami tidak memiliki representasi batang korek api yang sesuai (seperti yang diberikan pada pertanyaan) dari ruang pola. Yaitu, kami menghapus setiap karakter yang bukan merupakan angka dari "0" hingga "9", surat dari "a" ke "j", "n" ke "s", "l", "u", "x", "y" atau "z". Huruf besar dan kecil diperlakukan sama.
Jika kita berakhir dengan ruang pola kosong, kita mencetak 0 (secara otomatis diikuti oleh baris baru, seperti yang selalu dilakukan kecuali Anda melewati bendera khusus untuk itu), lewati semua garis posterior naskah dan lanjutkan ke "siklus sed" berikutnya ( yaitu, baca baris input berikutnya dan ulangi pemrosesan lagi dari perintah pertama hingga tidak ada lagi baris input yang akan diproses).
Jika tidak, jika ruang pola tidak kosong, kami sekarang membaginya menjadi dua "sub-ruang" yang dipisahkan oleh tanda titik koma: pertama muncul ruang input , yang awalnya dibentuk oleh semua karakter yang tidak dihapus dari ruang pola setelah pelaksanaan baris 1; selanjutnya adalah titik koma, dan setelah itu ruang peta .
Ruang peta memberi tahu kami berapa korek api di sebelah 1 yang diperlukan untuk mewakili setiap karakter alfanumerik yang relevan. Jika kami ingin tahu berapa banyak korek api yang diperlukan untuk mewakili karakter alfanumerik di ruang peta, kami mencari urutan pertama dari% yang berdekatan di sebelah kiri karakter itu, dan jawabannya akan menjadi jumlah% di urutan itu ditambah 1. Jadi, misalnya, jumlah korek api yang diperlukan untuk mewakili "b" adalah 4 + 1 = 5; untuk mewakili "4", 3 + 1 = 4, untuk mewakili "y", 3 + 1 = 4; dan seterusnya.
Ini sebuah loop. Sekarang kita akan mengganti setiap karakter dalam ruang input dengan urutan (lengkap) dari% 's yang jumlahnya menunjukkan jumlah korek api yang diperlukan untuk mewakili karakter itu, dan mengikuti urutan itu dengan karakter spasi putih (sekali lagi, huruf besar dan huruf kecil adalah diberikan perlakuan yang sama). Kriteria untuk menentukan apakah loop harus diakhiri adalah untuk memeriksa apakah ada karakter spasi putih di sebelah kiri langsung titik koma dalam ruang pola: jika kondisi itu berlaku, kami mengakhiri loop dan melanjutkan ke baris berikutnya.
Kedua garis menghapus titik koma dan semuanya setelahnya dari ruang pola dan kemudian memasukkan koma dan titik koma ke awal ruang pola. Kami sekarang memiliki ruang pola dibagi lagi menjadi dua sub-ruang baru: ruang hasil analog sebelum titik koma, dan ruang input analog setelah itu.
Ruang input analog adalah apa yang sebelumnya kita sebut "ruang input", tetapi dalam bentuk yang berbeda: sekarang berisi urutan% yang dipisahkan oleh ruang putih. Jumlah total% seperti itu dalam ruang input analog adalah jumlah korek api yang sama yang diperlukan untuk merepresentasikan string karakter input awal, yaitu angka tersebut adalah hasilnya. Tetapi kita harus mencetak yang menghasilkan notasi desimal, bukan sebagai urutan tanda persen. Tujuan dari ruang hasil analog adalah untuk memegang representasi analog dari setiap digit hasil sementara kami menghitung hasilnya dengan menjumlahkan setiap urutan yang berdekatan dari% di ruang input analog satu per satu. Loop berikutnya melakukan penjumlahan itu:
Pertama, setelah label 2 , kami memindahkan urutan berdekatan berikutnya dari% setelah titik koma dari ruang input analog ke kiri langsung dari titik koma, dalam ruang hasil analog;
Selanjutnya, kami melangkah ke sub-loop (label 3 ) yang melakukan perhitungan berikut:
Jika ada urutan yang berdekatan dari sepuluh% setelah koma di ruang hasil analog, kami menghapus% itu dan menempatkan% tunggal segera di sebelah kiri koma. Sederhananya, ini menunjukkan bahwa salah satu tempat desimal dalam hasil telah memperoleh lebih dari 9 unit, jadi kami mengambil 10 unit dari tempat desimal itu dan menambahkan 1 unit ke tempat desimal yang lebih besar berikutnya;
Jika "%" adalah karakter pertama dalam ruang pola, kami menyisipkan koma baru tepat sebelum itu. Ini menunjukkan bahwa jumlah telah mencapai nilai yang representasi desimalnya memiliki satu tempat desimal lebih di sebelah kiri daripada nilai sebelumnya;
Jika masih ada urutan yang berdekatan dari sepuluh% di ruang hasil analog, kami kembali ke label 3 dan ulangi proses ini. Kalau tidak, kita keluar dari sub-loop ini dan melangkah ke baris berikutnya.
Sekarang, jika masih ada "%" di ruang input analog (yaitu, setelah titik koma), itu berarti bahwa masih ada beberapa jumlah korek api yang akan ditambahkan ke jumlah total - jadi kami kembali ke label 2 .
Setelah penjumlahan selesai, kita masuk ke loop terakhir dari kode:
Di sini, kami memeriksa setiap pasangan karakter yang dibentuk oleh koma di sebelah kiri dan baik titik koma atau koma di sebelah kanan. Kami mengganti semua pasangan karakter dengan "0" di dalam dua koma.
Sepotong kode di atas cukup sederhana: kami mengganti setiap urutan berdekatan dari% di ruang hasil analog dengan karakter angka desimal yang sesuai dengan jumlah% di setiap urutan tertentu.
Akhirnya, kami menghapus setiap karakter non-angka dari ruang pola dan yang tersisa adalah hasil akhir dalam notasi desimal yang sudah dikenal. Nilai itu dicetak pada output standar dan siklus sed berikutnya dimulai, jika ada lagi jalur input yang akan diproses.
sumber
C (gcc) , 134 byte + 38 batang korek api = 172
Cobalah online!
sumber
05AB1E , 30 byte + 70 pertandingan = 100 skor
Cobalah online!
-5 Terima kasih kepada Emgina
sumber
Al
=A
. Anda juga tidak perlu}
.Java 10,
452432416404 skor (145 byte + 259 pertandingan)Penjelasan:
Cobalah online.
Nama variabelSunting: Nama$ραετ
digunakan sebagai ganti huruf.kmtvw
- nama variabel sekarang digunakan sebagai gantinya, karena mereka tidak dapat dibentuk oleh pertandingan sesuai dengan deskripsi tantangan.''
(tidak dicetak) digunakan sebagai gantinya6
.m-m
dant-t
digunakan sebagai ganti0
.(char)(w|32)+""
dengan input karakter-array yang digunakan alih-alihw.toLowerCase()
dengan input String-array.sumber
AutoHotkey , 148 byte + 345 batang korek api = 493
Yang ini sedikit tantangan untuk dipersingkat.
sumber
Python 3 , 123 byte + 65 pertandingan = 188
Fungsi yang tidak disebutkan namanya menerima string dan mengembalikan integer.
Berisi banyak karakter yang tidak dapat dicetak (khususnya byte satu hingga delapan).
Cobalah online!
sumber
Arang , 48 byte + 3 = 51
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Ulangi karakter input, hitung jumlah korek api masing-masing, kemudian jumlah hasilnya, konversikan ke string, dan cetak secara implisit.
Jika itu surat ...
Cari jumlah korek api dalam string terkompresi
65455454240303455250300545
.Lain jika muncul dalam nilai
2 ** 1000
...Cari jumlah korek api dalam string terkompresi
6255456376
.sumber
PHP, 98 + 253 = 351
Jalankan sebagai pipa dengan
-nr
atau coba online .sumber