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
İ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;
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.
Ş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.
|_\n|_
(küçük harft
) olarak yazılır