Kibrit Çöpleri Saymak


20

Buradaki çoğu insan, kibrit çöpü bulmacalarında da kullanılan yedi segment ekranına aşinadır. Aşağıda basamak vardır 0yoluyla 9ve mektuplar aaracılığıyla zhariç, k,m,t,v,wbu biçimde yazılmış.

 _        _   _         _    _    _    _    _
| |   |   _|  _|  |_|  |_   |_     |  |_|  |_|
|_|   |  |_   _|    |   _|  |_|    |  |_|   _|

 _       _      _  _  _                        _   _      _               _
|_| |_  |   _| |_ |_ |   |_  |   | |   _   _  |_| |_|  _ |_      |_| |_|  _|
| | |_| |_ |_| |_ |  |_| | | | |_| |_ | | |_| |     | |   _| |_| | |   | |_

Buradaki zorluk basit. Bir giriş dizesi verildiğinde, bu dizeyi temsil etmek için gereken eşleşme çubuklarının sayısını çıkarın. Dize yukarıdaki gösterimin dışında bir karakter içeriyorsa, yok sayın (0 olarak sayın).

Örneğin, giriş için 53, bir toplam 10kibrit gereklidir 5için 5ve 5için 3, bu nedenle çıkış 10.

Giriş helloiçin toplam 19kibrit çöpü gereklidir h (4), e (5), l (3), l (3), o (4), bu nedenle çıkış olur 19.

Anlaşılır olması için, her karakteri oluşturmak için gereken kibrit çubukları şunlardır:

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

Şimdi bükülme için ve iki tane var.

  • İlk giriş vaka olarak kabul edilir olmasıdır içinde hassas. Yani, Ave agerektiği için hem sayım 6kibrit çöpleri, hatta bir büyük harf gibi görsel sunum görünüyor olsa A.
  • Puanınız, kaynak kodunuzun bu algoritma üzerinden çalıştırılmasıdır, ayrıca kaynak kodunuzun uzunluğu bayt cinsinden daha düşüktür. Örneğin, kaynak kodunuz abc123olsaydı puanınız olurdu 6+5+4+2+5+5 = 27 + 6 = 33. Kaynak kodunuz #&@()*olsaydı puanınız olurdu 0 + 6 = 6.

Giriş / Çıkış Örnekleri

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

kurallar

  • Varsa, giriş / çıktının dilinizin yerel Tamsayı türüne uygun olacağını varsayabilirsiniz.
  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Standart boşluklar yasaktır.

2
T yaygın olarak |_\n|_(küçük harf t) olarak yazılır
12Me21

@ 12Me21 Böyle bir şey yapmayı düşündüm, ama mektuba yeterince yakın göründüğünü hissetmedim, bu yüzden dışarıda bıraktım.
AdmBorkBork

X harfine ne dersin? (iyi, şimdi bir cevap olması önemli değil.)
12Me21

Dışarıdaki karakterlerde [0-9a-z], 0 kibrit çöpü saymalıyız? Puanınızdan anladığım şey bu , kaynak kodunuzun bu algoritma üzerinden çalıştırılması ve kaynak kodunuzun bayt cinsinden uzunluğudur .
Outgolfer Erik

@EriktheOutgolfer Evet, doğru.
AdmBorkBork

Yanıtlar:


8

Python 2 , 97 bayt + 237 maç = 334

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

Çevrimiçi deneyin!

Bu, oluşturulabilir her karakterin, o karakteri oluşturmak için gereken miktarda eşleşme çubuğu görüntülediği bir dize oluşturarak çalışır


Bir karakter ile kaydedilebilir +'069a8'*6+'8')yerine +'069a'*6+'8'*7).
xbarbie

@xbarbie gerçekten, ama bu maç sayısını artıracak +3 sonuç
Rod

6

Perl 5 ile -pF95 byte + 14 109

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

Bu şuna eşittir:

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

ancak ~operatörü kullanarak baytlardan ödün vermeden yüksek baytlık karakterler kullanabilir ve birçok karakterden kaçınabiliriz.

Hala yardım bile Ton puanından bir yol!

Çevrimiçi deneyin!

Bu çözüm yazdırılamaz içeriyor, bu nedenle bayt sayısını doğrulamak için geri dönüşümlü bir altıgen dökümü var:

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    ............"}{

Neden }{? Bırakın ve -nseçenek. Ayrıca :-) +lcyerine lc()
unutmaya

@TonHospel Goddammit! Hatta her iki yazıya da baktım ve hangi yazı üzerinde gördüğümü hatırlayamadım ve +hemen akla gelmiyor! Makineme ihtiyacım nvar ve bırakabileceğimi unut!
Dom Hastings

Üzgünüm, yanlış yazdım. Ben "drop geliyordu }{ve -p" (ve bunu değiştirmek -niçin perl hala gerekiyorsa Bugünlerde neyse sayılmaz.)
Ton Hospel

@TonHospel Kodumu en son sürüme güncellememiştim, ayy ...
Dom Hastings

6

JavaScript (ES6), 198 (102 bayt + 96 kibrit çöpü)

@ L4m2 sayesinde 5 puan kaydedildi

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

Çevrimiçi deneyin!

Nasıl?

Kibrit çöpü sayılarını kodlamak için ceza eklemeyen karakterlerin ASCII kod modulo 9'unu kullanıyoruz.

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

Davayla ilgili endişelenmemiz gerekmiyor çünkü parseInt()büyük / küçük harfe duyarlı değil.

Eşleşmeyen karakterler için [0-9A-Za-z] , parseInt()iadeler NaNve dize arama sonuçlarında undefined. Bir dizeye zorla sonra, "undefined".charCodeAt()ASCII kodunu döndürür "u"olduğunu 117 . Uygun şekilde, 117 modulo 9 beklendiği gibi 0 verir .


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

5

Jöle , 42 bayt + 0 kibrit çöpü = 42 puan

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

@JonathanAllan'a -2 puan için teşekkürler!

Çevrimiçi deneyin!

Nasıl çalışır

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

Bölme ile başlayan ve biten değişmez değerler , kalan karakterleri Jelly'in kod sayfasındaki 1 tabanlı dizinlerle değiştirir, ardından 250 temelli sayıdan tamsayıya dönüştürür.

Bu özel değişmez kodlama

[3096734725226860846495, 211369264881118657055472842435156679693648].

×/ çarparak azalır, verim verir

654554542403034552503005456545545424030345525030054562554563760

(Bu tamsayıyı doğrudan kodlamak 6 bayt tasarruf eder, ancak 28 eşleşme maliyetine neden olur.)

ṚṚiki kez tersine döner; ilk çağrı, basamak dizisine bir tamsayıyı yükseltir. Bu,

[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$giriş dizesindeki "A ... Za ... z0 ... 9_" ( ) 'nin ċher ( Ѐ) karakterinin oluşumunu ( ) sayar .ØW

Son olarak æ.nokta ürünü alır, her karakter sayısını kibrit çöplerinde karşılık gelen maliyetle çarpıp toplamı alır.


Bir bayt ve baz dekompresyonu kaydetmek için büyük sayının çarpanlarına ayırma ve Ddiğerini kaydetmek yerine modulo kullanın . Çevrimiçi deneyin
Jonathan Allan

bayt ... err noktası :)
Jonathan Allan

1
Ve bir tane daha Ɗ. Teşekkürler!
Dennis

3

Perl 5 -p , 90 64 kod + 9 eval koşum takımı + 14 kibrit çöpü = 87

Onaltılı kodları , talep edilen puan için değişmez 1 bayt varyantlarıyla değiştirin ( TIO'nun denediği gibi UTF-8 değil )

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"}{

Çevrimiçi deneyin!

Tamamlayıcı dizenin içindeki kod:

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

3

Jöle , 34 bayt + 3 maç = 37

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

Karakter listesini kabul eden ve bir tamsayı döndüren monadik bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

Dennis'in Jelly cevabına benzer şekilde çalışır, ancak başka bir cevap gerektirdiğini hissetmek için yeterince çaba harcadım. Temel fark, üç eşleşme maliyetinin ( Œlan içerir l) girişini küçük harflerle ifade etmesidir, bu da maliyet dizisini oluşturmak için çok daha küçük bir sayının kullanılmasına izin verir. Zor bit, özlü kalırken eşleşmeden bu sayıyı inşa etmenin bir yolunu buluyordu.

ØWverimleri "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"sayım alt kasalı giriş oluşumuyla bu nedenle her zaman 26 sıfır ile başlar. Bunu tersine çevirebiliriz ve 63 uzunluktan biri yerine 37 uzunluk dizisine sahip bir nokta ürünü gerçekleştirebiliriz.

⁽[ɱד®-&]Ṙṙ£⁺ÐĊṂⱮɼ ’‘ḤṚæ.Œ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

2

PHP 176 bayt = 397 puan

<?$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;

Çevrimiçi deneyin!


1
PPCG'ye Hoşgeldiniz!
AdmBorkBork



1

Yakut , 125 bayt + 87 kibrit çöpü = 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}

Çevrimiçi deneyin!

Arnauld'un Javascript cevabından büyük ölçüde ilham aldı .

Normalde lambda'yı sadece iki kez kullanacağını ilan etmenin maliyeti buna değmez, ancak kibrit çöpü ağırlığı " scanap" .scan(/./).mapbunu değiştirdi. Bu eğlenceli bir mücadeleydi!

->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
}


1

R, 112 bayt + 319 maç = 431 puan

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

Çevrimiçi deneyin!

Bu gelişmeyi ortaya çıkaran Giuseppe için şeref .

Eski versiyon, 143 bayt + 454 maç = 597 puan

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

Yapmak için el()TIO fonksiyon çalışmalarını, kullanılan gerekir library(methods).

Tanrım, R ayrıntılı!


TIO, hangi nedenle olursa olsun, methodspaketi otomatik olarak yüklemez , ancak bir basepaket olduğundan, her zaman üstbilgiye ittim ve bayt sayısı için saymadım. readlineetkileşimli bir oturum olmadığından TIO'da da çalışmaz. Bu kesinlikle golf edilebilir olsa da.
Giuseppe


^ boşluk içeren girdi etrafında tırnak gerekiyor.
Giuseppe

Ayrıca, R golfing için bir sohbet odası başlattım ! ! Son zamanlarda R'de birçok farklı kullanıcı tarafından birçok cevap gördüm, bu oldukça cesaret verici :)
Giuseppe

@Giuseppe Bence cevabını ayrı ayrı göndermelisin. Prensipte farklıdır ve benimkinden çok daha üstündür.
Andreï Kostyrka

1

Perl 6 , 87 bayt + 26 kibrit çöpü = 113

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

Çevrimiçi deneyin!

Bazı ASCII olmayan Unicode karakterler kullanır. Arama tablosu bir Unicode dizesinde kodlanmıştır:

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

Karakterler, Arap-Hint rakamları kullanılarak base-36 dönüşümü ile endekslere dönüştürülür:

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

1

sed, 367 (kaynak kod bayt) + 532 (kaynak kod için kibrit çöpü miktarı) = 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

Çevrimiçi Deneyin

Çok satırlı sürüm:

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

Açıklama:

Yukarıdaki komut dosyası, standart girdi satır satır okur (kalıp boşluğuna - her zamanki "sed yolu") ve her satır için, o satırdaki kibrit çöpü ile temsil edilebilir tüm karakterleri temsil etmek için gereken kibrit sopalarının miktarını verir. Her girdi satırı için hesaplamalar aşağıdaki gibi gerçekleşir:


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

İlk olarak, karşılık gelen bir kibrit çöpü temsiline sahip olmadığımız her karakteri (soruda verildiği gibi) desen alanından kaldırırız. Yani, "0" ile "9" arasında sayı olmayan her karakteri, "a" ile "j", "n" - "s", "l", "u" harflerini kaldırıyoruz. "x", "y" veya "z". Büyük ve küçük harfler aynı şekilde işlenir.

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

Boş bir desen alanı ile bitirirsek, 0 yazdırırız (otomatik olarak ardından yeni bir satır gelir, örneğin sed'e özel bir bayrak geçirmedikçe her zaman yaptığı gibi), komut dosyasının tüm arka çizgilerini atlar ve bir sonraki "sed döngüsüne" ( yani, bir sonraki girdi satırını okuyun ve işlenecek başka girdi satırı kalmayıncaya kadar işlemi ilk komuttan itibaren tekrarlayın).

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

Aksi takdirde, desen alanı boş değilse, şimdi noktalı virgülle ayrılmış iki "alt boşluğa" böleriz: ilk olarak , önce desen boşluğundan sonra kaldırılmayan tüm karakterler tarafından oluşturulan giriş alanı gelir . hat 1'in yürütülmesi; sonra noktalı virgül gelir ve daha sonra harita alanı gelir .

Harita alanı, her bir ilgili alfasayısal karakteri temsil etmek için 1'in yanında kaç tane kibrit çöpü gerektiğini gösterir. Harita alanındaki herhangi bir alfasayısal karakteri temsil etmek için kaç tane kibrit çöpünün gerekli olduğunu bilmek istiyorsak, o karakterin solundaki bitişik% 'lerin ilk sırasını ararız ve cevap%' s Yani, sekans artı 1. Örneğin, bir "b" yi temsil etmek için gerekli kibrit sopalarının sayısı 4 + 1 = 5'tir; bir "4" ü temsil etmek için, 3 + 1 = 4, bir "y" yi temsil etmek için, 3 + 1 = 4; ve bunun gibi.

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

Bu bir döngü. Şimdi, giriş alanındaki her karakteri, bu karakteri temsil etmek için gerekli miktarda kibrit çöpü miktarını gösteren% 'ın (tam) dizisiyle değiştireceğiz ve bu diziyi bir beyaz boşluk karakteriyle (tekrar, büyük ve küçük harfler) aynı tedavi verildi). Döngünün bitip bitmeyeceğini belirleme kriteri, desen uzayındaki noktalı virgülün hemen solunda bir beyaz boşluk karakteri olup olmadığını kontrol etmektir: bu koşul devam ederse, döngüyü sonlandırır ve bir sonraki satıra devam ederiz.

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

Bu iki çizgi, noktalı virgül ve arkasından gelen her şeyi desen uzayından kaldırır ve ardından desen uzayının başına virgül ve noktalı virgül ekler. Şimdi desen alanı bir kez daha iki yeni alt uzaya bölünmüştür: noktalı virgül öncesi analog sonuç alanı ve arkasından analog giriş alanı .

Analog giriş alanı, daha önce "giriş alanı" olarak adlandırdığımız şeydir, ancak farklı bir biçimde: şimdi% 'nin beyaz boşlukla ayrılmış dizilerini içerir. Analog giriş alanındaki bu tür% 'lerin toplam sayısı, ilk giriş karakter dizesini temsil etmek için gereken aynı sayıda eşleşme çubuğudur, yani bu sayı sonuçtur. Ancak bu sonucu yüzde işaretleri dizisi olarak değil, ondalık gösterimle yazdırmalıyız. Analog sonuç uzayının amacı, sonucun her bir basamağının analog bir gösterimini tutmakken, bu sonucu, analog giriş alanındaki% 'lerin her bitişik sırasını tek tek toplayarak hesaplamaktır. Bir sonraki döngü bu toplamı gerçekleştirir:

:2
s/(;[^%]*)(%+)/\2\1/
    :3
    s/,%{10}/%,/
    s/^%/,&/
    /%{10}/b3
/;.*%/b2
  1. İlk olarak, etiket 2'den sonra, noktalı virgülden sonraki% 'lerin sonraki bitişik sırasını analog giriş uzayından noktalı virgülün hemen soluna, analog sonuç alanında hareket ettiririz;

  2. Ardından, aşağıdaki hesaplamaları yapan bir alt döngüye (etiket 3 ) adım atıyoruz :

    • Analog sonuç alanında virgülden sonra% 10'luk bitişik bir sıra varsa, bu% 'leri kaldırırız ve virgülün hemen soluna tek bir% koyarız. Basitçe söylemek gerekirse, sonuçtaki ondalık basamaklardan birinin 9'dan fazla birim aldığını gösterir, bu nedenle o ondalık yerden 10 birim alır ve bir sonraki daha büyük ondalık yere 1 birim ekleriz;

    • Desen uzayındaki ilk karakter "%" ise, hemen önüne yeni bir virgül koyarız. Bu, toplamın ondalık gösterimi solda önceki değerden bir ondalık basamağa daha sahip bir değere ulaştığını gösterir;

    • Analog sonuç alanında hala% 10'luk bitişik bir dizi varsa, etiket 3'e geri döner ve bu işlemi tekrar ederiz. Aksi takdirde, bu alt döngüden çıkıp bir sonraki satıra geçiyoruz.

  3. Şimdi, analog giriş alanında hala herhangi bir "%" varsa (yani noktalı virgülden sonra), toplam toplamına hala eklenecek bazı eşleşme çubukları olduğu anlamına gelir - bu nedenle etiket 2'ye geri döneriz .

Toplam tamamlandığında, kodun son döngüsüne geçeriz:

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

Burada, solda virgül ve sağda noktalı virgül veya virgülle oluşturulan her karakter çiftini kontrol ediyoruz. Tüm bu karakter çiftlerini iki virgül içindeki "0" ile değiştiriyoruz.

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

Yukarıdaki kod parçası oldukça basittir: Analog sonuç alanındaki her% s bitişik dizisini, her belirli dizideki% 'lerin sayısına karşılık gelen bir ondalık basamak karakteriyle değiştiririz.

s/[^0-9]//g

Son olarak, sayısal olmayan her karakteri desen uzayından kaldırırız ve geriye kalan, tanıdık ondalık gösterimin nihai sonucudur. Bu değer standart çıkışa yazdırılır ve işlenecek başka giriş satırı varsa bir sonraki sed döngüsü başlar.


1

C (gcc) , 134 bayt + 38 kibrit çöpü = 172

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

Çevrimiçi deneyin!



1

Java 10, 452 432 416 404 puanı (145 bayt + 259 maç)

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;}

Açıklama:

Çevrimiçi deneyin.

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
  • $ραετHarfler yerine değişken isimler kullanılır. EDIT: Değişken isimleri kmtvwartık kullanılıyor, çünkü meydan okuma açıklamasına göre eşleşmelerle oluşturulamıyorlar.
  • ''yerine (yazdırılamaz) kullanılır 6.
  • m-mve t-tyerine kullanılmaktadır 0.
  • (char)(w|32)+""karakter dizisi girişi yerine w.toLowerCase()Dize dizisi girişi kullanılır .

0

AutoHotkey , 148 bayt + 345 kibrit çöpü = 493

Bu, kısaltmak için biraz zorlayıcıydı.

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

0

Python 3 , 123 bayt + 65 maç = 188

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

Dizeyi kabul eden ve bir tamsayı döndüren adsız bir işlev.

Yazdırılamayan birçok karakter içeriyor (özellikle bir ila sekiz bayt).

Çevrimiçi deneyin!


0

Kömür , 48 bayt + 3 = 51

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

IΣEθ

Her birinin kibrit çöpü sayısını hesaplayarak girdinin karakterleri üzerinde döngü yapın, ardından sonucu toplayın, dizeye dönüştürün ve dolaylı olarak yazdırın.

⎇№α↥ι

Eğer bir mektupsa ...

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

Sıkıştırılmış dizede kibrit çöpü sayısını arayın 65455454240303455250300545.

∧№IX²φι

Else değeri görünürse 2 ** 1000...

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

Sıkıştırılmış dizede kibrit çöpü sayısını arayın 6255456376.


0

PHP, 98 + 253 = 351

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

Pipo ile çalıştırın -nrveya çevrimiçi deneyin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.