Hitung Matchsticks

20

Kebanyakan orang di sini terbiasa dengan tujuh tampilan segmen, yang juga digunakan dalam puzzle batang korek api. Di bawah ini adalah digit 0melalui 9dan surat amelalui 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 10korek api diperlukan, 5untuk 5dan 5untuk 3, jadi hasilnya adalah 10.

Untuk input hellototal 19diperlukan 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, Adan akeduanya harus dihitung untuk 6korek api, meskipun representasi visualnya terlihat seperti huruf besar A.
  • 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 abc123Anda, skor Anda akan menjadi 6+5+4+2+5+5 = 27 + 6 = 33. Jika kode sumber Anda #&@()*, skor Anda akan menjadi 0 + 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.
AdmBorkBork
sumber
2
T umumnya ditulis sebagai |_\n|_(huruf kecil t)
12Me21
@ 12Me21 Saya telah merenungkan melakukan sesuatu seperti itu, tetapi saya tidak merasa itu terlihat cukup dekat dengan surat itu, jadi saya meninggalkannya.
AdmBorkBork
Bagaimana dengan huruf X (H) Anda? (well, saya tidak masalah sekarang karena ada jawaban.)
12Me21
Untuk karakter di luar [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 .
Erik the Outgolfer
@EriktheOutgolfer Ya, itu benar.
AdmBorkBork

Jawaban:

8

Python 2 , 97 byte + 237 pertandingan = 334

lambda w:sum(map(('1ir'*2+'7lnu'*3+'4cfhjoy'*4+'235bdegpqsxz'*5+'069a'*6+'8'*7).count,w.lower()))

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

tongkat
sumber
Satu karakter dapat disimpan dengan +'069a8'*6+'8')alih - alih +'069a'*6+'8'*7).
xbarbie
@xbarbie memang, tetapi itu akan meningkatkan jumlah pertandingan, menghasilkan poin +3
Rod
6

Perl 5 dengan -pF, 95 byte + 14, 109

eval~"Û£Ô„…ÊÏÉÎÍÍÊÌÊËËÊÊÉÉÈÌÇÈÆÉžÉʜ˛ʚʙ˘ʗ˖͕˓̑ÌËÊŽÊ͌ʊ̇ʆËÂÐÑИ‚ÒÁ„Ô“œ‚™¿¹"}{

Ini setara dengan:

$\+={z506122535445566738796a6b5c4d5e5f4g5h4i2j4l3n3o4p5q5r2s5u3x5y4=~/./g}->{+lc}for@F

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:

00000000: 6576 616c 7e22 dba3 d4c2 8485 cacf c9ce  eval~"..........
00000010: cdcd cacc cacb cbca cac9 c9c8 ccc7 c8c6  ................
00000020: c99e c99d ca9c cb9b ca9a ca99 cb98 ca97  ................
00000030: cb96 cd95 cb93 cc91 cc90 cb8f ca8e ca8d  ................
00000040: cd8c ca8a cc87 ca86 cbc2 81d0 d1d0 9882  ................
00000050: d2c1 84d4 939c 8299 908d bfb9 227d 7b    ............"}{
Dom Hastings
sumber
Mengapa }{? Jatuhkan dan -npilihannya. Anda juga tetap lupa +lcbukannya lc():-)
Ton Hospel
@TonHospel Goddammit! Saya bahkan melihat melalui kedua posting kami dan saya tidak dapat mengingat posting apa yang telah saya lihat dan +tidak langsung terlintas dalam pikiran! Saya membutuhkan nmesin saya dan lupa saya bisa menjatuhkannya!
Dom Hastings
Maaf, saya salah bicara. Maksud saya "drop the }{and -p" (dan ganti dengan -nperl Anda masih membutuhkannya. Saat ini tidak dihitung lagi)
Ton Hospel
@TonHospel Saya belum memperbarui kode saya ke yang terbaru, oops ...
Dom Hastings
6

JavaScript (ES6), 198 (102 byte + 96 korek api)

Disimpan 5 poin berkat @ l4m2

v=>[...v].map(w=>t+=('{w__^_{]|{{_^__^_^w^~]~]^__w_~]~~_^_'[parseInt(w,36)]+v).charCodeAt()%9,t=+[])|t

Cobalah online!

Bagaimana?

Kami menggunakan modulo 9 kode ASCII karakter yang tidak menambahkan hukuman apa pun untuk menyandikan jumlah korek api.

 char. | code | modulo 9
-------+------+-----------------
   ~   |  126 |   0
   v   |  118 |   1  (not used)
   w   |  119 |   2
   ]   |   93 |   3
   ^   |   94 |   4
   _   |   95 |   5
   {   |  123 |   6
   |   |  124 |   7

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()mengembalikan NaNdan hasil pencarian string masuk undefined. Setelah dipaksa ke string, "undefined".charCodeAt()mengembalikan kode ASCII "u", yaitu 117 . Dengan mudah, 117 modulo 9 memberikan 0 seperti yang diharapkan.

Arnauld
sumber
v=>[...v].map(w=>t+='~{w__^_{]|{{_^__^_^w^~]~]^__w_~]~~_^_'.charCodeAt(1+parseInt(w,36))%9,t=+[])|t1 kurang
14m2
5

Jelly , 42 byte + 0 batang korek api = 42 poin

“ṄḟṭkɗØæ⁶ṡ“£ƈṠ¤żȥṬ}ė$t¿ƬⱮȷ|çƓ’×/ṚṚæ.ċЀØW$

Terima kasih kepada @JonathanAllan untuk -2 poin!

Cobalah online!

Bagaimana itu bekerja

“ṄḟṭkɗØæ⁶ṡ“£ƈṠ¤żȥṬ}ė$t¿ƬⱮȷ|çƓ’

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

[3096734725226860846495, 211369264881118657055472842435156679693648].

×/ berkurang dengan multiplikasi, menghasilkan

654554542403034552503005456545545424030345525030054562554563760

(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

[6, 5, 4, 5, 5, 4, 5, 4, 2, 4, 0, 3, 0, 3, 4, 5, 5, 2, 5, 0, 3, 0, 0, 5, 4, 5, 6, 5, 4, 5, 5, 4, 5, 4, 2, 4, 0, 3, 0, 3, 4, 5, 5, 2, 5, 0, 3, 0, 0, 5, 4, 5, 6, 2, 5, 5, 4, 5, 6, 3, 7, 6, 0]

ċЀØ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.

Dennis
sumber
Gunakan factorisation dari angka besar untuk menyimpan satu byte dan dekompresi basis dan modulo alih-alih Dmenyimpan yang lain. Cobalah online
Jonathan Allan
byte ... err point :)
Jonathan Allan
1
Dan satu lagi dengan Ɗ. Terima kasih!
Dennis
3

Perl 5 -p , 90 64 kode + 9 eval harness + 14 batang korek api = 87

Ganti kode hex dengan varian liter 1 literalnya ( bukan UTF-8 ketika TIO mencoba) untuk skor yang diklaim

eval~"\xdb\xa3\xd4\xc2\x86\xd0\xcf\xd2\xc6\x9e\xd2\x85\xd0\xc9\xcd\xca\xca\xcb\xca\xc9\xcc\xc8\xc9\xc9\xca\xcb\xca\xca\xcb\xca\xcb\xcd\xcb\xcf\xcc\xcf\xcc\xcb\xca\xca\xcd\xca\xcf\xcc\xcf\xcf\xca\xcb\xca\xd0\x8d\x99\x90\x8d\xdf\x93\x9c\xc2\x81\xd0\xd1\xc0\xd0\x98"}{

Cobalah online!

Kode di dalam string yang dilengkapi:

$\+=y/0-9a-z/625545637665455454240303455250300545/rfor lc=~/.?/g
Ton Hospel
sumber
3

Jelly , 34 byte + 3 pertandingan = 37

⁽[ɱד®-&]Ṙṙ£⁺ÐĊṂⱮɼ ’‘ḤṚæ.ŒlċЀØWṚƊ

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 ( Œlmengandung a l) 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.

ØWmenghasilkan "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.

⁽[ɱד®-&]Ṙṙ£⁺ÐĊṂⱮɼ ’‘ḤṚæ.ŒlċЀØWṚƊ - Link: list of characters
⁽[ɱ                                - literal                                     23913
    “®-&]Ṙṙ£⁺ÐĊṂⱮɼ ’               - literal         136861653160003879166772353166783
   ×                               - multiply  = 3272772712015172762515027281277281879
                    ‘              - increment = 3272772712015172762515027281277281880
                     Ḥ             - double    = 6545545424030345525030054562554563760
                      Ṛ            - reverse (implicit decimal list) -> [0,6,7,3,6,5,4,5,5,2,6,5,4,5,0,0,3,0,5,2,5,5,4,3,0,3,0,4,2,4,5,4,5,5,4,5,6]
                                   -                     (to align with: _ 9 8 7 6 5 4 3 2 1 0 z y x w v u t s r q p o n m l k j i h g f e d c b a)
                                 Ɗ - last four links as a monad:
                         Œl        -   lower-case (the input)
                              ØW   -   word -> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
                            Ѐ     -   map across right:
                           ċ       -     count (right character in lower-cased input)
                                Ṛ  -   reverse (to align with the values as shown above)
                       æ.          - dot-product
Jonathan Allan
sumber
2

PHP 176 byte = 397 skor

<?$n="6255456376";$l="065455454240303455250300545";$a=strtolower($argv[1]);for($i=0;$i<strlen($a);$i++)$t+=(is_numeric($a[$i])?$n[$a[$i]]:$l[max((ord($a[$i])-96),0)]);echo$t;

Cobalah online!

Dave
sumber
1
Selamat datang di PPCG!
AdmBorkBork
1

Python 3 , 138 + 265 = 403 byte

k='0123456789abcdefghijlnopqrsuxyz'
m=lambda t:sum([ord(''[k.index(v)])if v in k else 0for v in t.lower()])

Cobalah online!

Dat
sumber
1

Ruby , 125 byte + 87 batang korek api = 212

->m{v=->w,k{w.scan(/./).map &k};v[m,->t{v["!#&&;&=$(==&;&&;&;#;!$!$;&&#&!$!!&;&",->k{k.ord%11}][t.to_i 36].to_i+(t==?0?6:0)}].sum}

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(/./).mapmengubahnya. Ini adalah tantangan yang menyenangkan!

->m{
  v=->w,k{w.scan(/./).map &k};                # v is a lambda taking a string and a block
  v[m,->t{                                    # Transform each char t of the input:
    v["!#&&;&=$(==&;&&;&;#;!$!$;&&#&!$!!&;&", # Transform each char of this magic string
      ->k{k.ord%11}                           #  into a matchstick count ([0,2,5,5,4,5...])
    ][t.to_i 36]+                             # Parse t as a base 36 index into the counts
    (t==?0?6:0)                               # If t was "0", add 6 matchsticks
  }].sum                                      # Add the counts for all characters
}
benj2240
sumber
1

MATL , skor 166 156

Panjang kode 41 + keluaran untuk kode yang digunakan sebagai input 115.

'%p#21jgyDT7o?pe}['TIW:qZajk4Y22Y2h&mXz)s

Cobalah online!

Luis Mendo
sumber
1

R, 112 byte + 319 pertandingan = 431 skor

sum(strtoi(el(strsplit(chartr("0-9a-z","625545637665455454240303455250300545",tolower(scan(,""))),""))),na.rm=T)

Cobalah online!

Kudos to Giuseppe yang datang dengan perbaikan ini.

Versi lama, 143 byte + 454 pertandingan = 597 skor

b=el(strsplit(chartr("0123456789abcdefghijlnopqrsuxyz","6255456376654554542433455253545",tolower(readline())),""))
sum(as.numeric(b[b%in%0:9]))

Untuk membuat el()fungsi berfungsi pada TIO, Anda harus menggunakan library(methods).

Astaga, itu R verbose!

Andreï Kostyrka
sumber
TIO, untuk alasan apa pun, tidak secara otomatis memuat methodspaket, tetapi karena ini adalah basepaket, saya selalu mendorongnya di header dan tidak menghitungnya untuk byte-count. readlinejuga tidak akan berfungsi pada TIO karena ini bukan sesi interaktif. Ini jelas golfable.
Giuseppe
^ membutuhkan kutipan di sekitar input yang berisi spasi.
Giuseppe
Juga, saya baru saja memulai ruang obrolan untuk bermain golf R! ! Saya telah melihat banyak jawaban di R akhir-akhir ini oleh banyak pengguna yang berbeda, yang cukup menggembirakan :)
Giuseppe
@ Giuseppe Saya pikir Anda harus memposting jawaban Anda secara terpisah. Prinsipnya berbeda dan jauh lebih unggul dari saya.
Andreï Kostyrka
1

Perl 6 , 87 byte + 26 batang korek api = 113

{+[+] (~'򘮉򛫡񯌞𺪯񯉒񉘁'.ords~~m:g/\w/)[m:g/<[/..{]-[\W_]>/>>.&{:٣٦(~$_)}]}

Cobalah online!

Menggunakan beberapa karakter Unicode non-ASCII. Tabel pencarian dikodekan dalam string Unicode:

say '򘮉򛫡񯌞𺪯񯉒񉘁'.ords;
# (625545 637665 455454 240303 455250 300545)

Karakter dikonversi ke indeks dengan konversi base-36 menggunakan angka Arab-Indic:

:٣٦('z'); # is equivalent to
:36('z');
nwellnhof
sumber
1

sed, 367 (byte kode sumber) + 532 (jumlah batang korek api untuk kode sumber) = 899

s/[^0-9a-jln-suxyz]//Ig;/^$/{s/.*/0/;b};s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/;:1;s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I;/ ;/!b1;s/;.+//;s/^/,;/;:2;s/(;[^%]*)(%+)/\2\1/;:3;s/,%{10}/%,/;s/^%/,&/;/%{10}/b3;/;.*%/b2;:4;s/,[;,]/,0,/;/,[;,]/b4;s/%{9}/9/g;s/%{8}/8/g;s/%{7}/7/g;s/%{6}/6/g;s/%{5}/5/g;s/%%%%/4/g;s/%%%/3/g;s/%%/2/g;s/%/1/g;s/[^0-9]//g

Cobalah secara Online

Versi multi-baris:

s/[^0-9a-jln-suxyz]//Ig
/^$/{s/.*/0/;b}
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
s/;.+//
s/^/,;/
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
:4
s/,[;,]/,0,/
/,[;,]/b4
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
s/[^0-9]//g

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:


s/[^0-9a-jln-suxyz]//Ig

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.

/^$/{s/.*/0/;b}

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).

s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/

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.

:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1

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.

s/;.+//
s/^/,;/

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:

:2
s/(;[^%]*)(%+)/\2\1/
    :3
    s/,%{10}/%,/
    s/^%/,&/
    /%{10}/b3
/;.*%/b2
  1. 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;

  2. 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.

  3. 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:

:4
s/,[;,]/,0,/
/,[;,]/b4

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.

s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g

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.

s/[^0-9]//g

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.

lucasb
sumber
1

C (gcc) , 134 byte + 38 batang korek api = 172

v(t,w)char*t;{t=(w=*t++)?v(t)+(isalnum(w|=w>'@'&w<'['?' ':!w)?")%(('()&*))('(('('%'#&#&'((%(#&##('("[w-=w>'`'?'W':'_'-'/']-'#':!w):w;}

Cobalah online!

gastropner
sumber
1

05AB1E , 30 byte + 70 pertandingan = 100 skor

žLÃlv•Ƶγ¤и©X´≠Ø&c3Íεç•žhA«ykèO

Cobalah online!


-5 Terima kasih kepada Emgina

Guci Gurita Ajaib
sumber
Al= A. Anda juga tidak perlu }.
Emigna
1

Java 10, 452 432 416 404 skor (145 byte + 259 pertandingan)

k->{int m=0,t;for(var w:k)for(t=m-m;t<'';)m+="1ir 7lnu 4cfhjoy 235bdegpqsxz 069a 8".split(" ")[t++].contains((char)(w|32)+"")?-~t:t-t;return m;}

Penjelasan:

Cobalah online.

k->{                   // Method with character-array parameter and int return-type
  int m=0,             //  Result-integer, starting at 0
      t;               //  Index-integer
  for(var w:k)         //  Loop over the input String-array
    for(t=m-m;t<'';)   //   Inner loop over the parts array with index [0,6)
      m+="1ir 7lnu 4cfhjoy 235bdegpqsxz 069a 8".split(" ")[t++]
                       //     If the current part ordered by amount of matches (2-8)
         .contains((char)(w|32)+"")?
                       //     contains the current (lowercase) letter
          -~t          //      Increase the result by the index + 2
         :             //     Else:
          t-t;         //      The result remains the same by adding 0
  return m;}           //  Return the result
  • Nama variabel $ραετdigunakan sebagai ganti huruf. Sunting: Nama kmtvw- nama variabel sekarang digunakan sebagai gantinya, karena mereka tidak dapat dibentuk oleh pertandingan sesuai dengan deskripsi tantangan.
  • ''(tidak dicetak) digunakan sebagai gantinya 6.
  • m-mdan t-tdigunakan sebagai ganti 0.
  • (char)(w|32)+""dengan input karakter-array yang digunakan alih-alih w.toLowerCase()dengan input String-array.
Kevin Cruijssen
sumber
0

AutoHotkey , 148 byte + 345 batang korek api = 493

Yang ini sedikit tantangan untuk dipersingkat.

n:=["1ir","7lnu","4cfhjoy","235bdegpqsxz","09a5",7+1]
Loop Parse,i
{r:=A_LoopField
Loop % n.Length()
{l:=A_Index
if InStr(n[l],r)
u+=l+1
}}
send % u
nelsontruran
sumber
0

Python 3 , 123 byte + 65 pertandingan = 188

lambda w,m='',t='',k=ord:sum(~-k((m+t+m+''+t)[k(v)%77])*('/'<v<'{')for v in w)

Fungsi yang tidak disebutkan namanya menerima string dan mengembalikan integer.

Berisi banyak karakter yang tidak dapat dicetak (khususnya byte satu hingga delapan).

Cobalah online!

Jonathan Allan
sumber
0

Arang , 48 byte + 3 = 51

IΣEθ⎇№α↥ιI§”)➙⊞←!Σw➙⊙↘⁴↘”⌕α↥ι∧№IX²φιI§”)⧴u↑$◨”Iι

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

IΣEθ

Ulangi karakter input, hitung jumlah korek api masing-masing, kemudian jumlah hasilnya, konversikan ke string, dan cetak secara implisit.

⎇№α↥ι

Jika itu surat ...

I§”)➙⊞←!Σw➙⊙↘⁴↘”⌕α↥ι

Cari jumlah korek api dalam string terkompresi 65455454240303455250300545.

∧№IX²φι

Lain jika muncul dalam nilai 2 ** 1000...

I§”)⧴u↑$◨”Iι

Cari jumlah korek api dalam string terkompresi 6255456376.

Neil
sumber
0

PHP, 98 + 253 = 351

for(;$k=ord($argn[$v++]);)$m+=$k>64?_65455454240303455250300545[$k&31]:_6255456376[$k-47];print$m;

Jalankan sebagai pipa dengan -nratau coba online .

Titus
sumber