Kaç güç kelimesi bağırdım?


10

Skyrim'de oyuncu karakteri hedeflerine ulaşmak için güçlü büyü sesleri (Perşembe) kullanabilir. Her not üç kelimeden oluşur, ancak oyuncu aynı etkiyi daha az güçle ancak daha kısa bir bekleme süresinde elde etmek için ilk bir veya iki kelimeyi kullanabilir.

Noktalama işaretleri veya boşluklar olmadan küçük ASCII Thu'um deyimi verildiğinde , kaç tane güç kelimesi içerdiğini döndürün .

Misal:

fusrodah   -> 3
dur        -> 1
kaandrem   -> 2
odah       -> 2
vengaarnos -> 3

Giriş her zaman aşağıdaki notlardan birini alarak, o nottan ilk 1, 2 veya 3 kelimeyi seçerek ve kelimeleri sırayla birleştirerek oluşan küçük ASCII dizgisi olacaktır .

dur neh viir
faas ru maar
feim zii gron
fo krah diin
fus ro dah
gaan lah haas
gol hah dov
hun kaal zoor
iiz slen nus
joor zah frul
kaan drem ov
krii lun aus
laas yah nir
lok vah koor
mid vur shaan
mul qah diiv
od ah viing
raan mir tah
rii vaaz zol
strun bah qo
su grah dun
tiid klo ul
ven gaar nos
wuld nah kest
yol toor shul
zul mey gut
zun haal viik

Yani fus, fusrove fusrodahhepsi geçerli girdilerdir, ancak fusroviirkarışık bağırışlardan kelimeler kullandığından rodahdeğil, bağırmanın öneki olmadığı için değildir. Ayrıca boş dize girişini işlemeniz gerekmez.


Bayt cinsinden en kısa kod kazanır.


1
İlk kişi için bu algoritmayı Dragonborn Şarkısının her satırında ( plebs tarafından "skyrim teması" olarak bilinir) çalıştıran bir çerez vereceğim
Cyoce

Yanıtlar:


17

Retina, 78 42 15 14 bayt

ul
xo
[aeiou]+

Çevrimiçi deneyin

tiidkloul , yazdırılması gereken sayı ile aynı sayıda sesli harf dizisine sahip olmayan tek kelimedir. Bu nedenle, kelimeye ekstra bir sesli harf dizisi vermek için eşleşmemiz gerekiyor. ousadece tiidkl ou l ile eşleşir ve ou ekstra diziyi oluşturan okso ile değiştirebiliriz .

İlk yaklaşımım bu kadar basit değildi, ama tüm ünsüzlerin kaldırılması, daha sonra birkaç sesli harf dizisinin ( ai|ii|aa|...) kaldırılması ve son olarak harflerin sayılarının sayılması üzerine inşa edildi . Ama sayesinde @Martin Büttner düşünme için [aeiou]+yerine.


Açıkça geçersiz girdi olarak listelenen fusroviir için 3 değerini döndürür.
atk

1
@atk OP'ye geçersiz giriş olup olmayacağını sordum. Cevap hayırdı.
andlrc

1

Retina , 313 bayt

ah|aus|bah|d(ah|ii[nv]|ov|rem|u[nr])|[fhl]aas|f(eim|o|rul|us)|g(aa[nr]|ol|rah|ron|ut)|haal|hah|hun|iiz|joor|k(aa[ln]|est|lo|oor|rah|rii)|lah|lok|lun|m(aar|ey|i[dr]|ul)|n[ae]h|nir|n[ou]s|od|ov|qah|qo|r(aan|ii|o|u)|s(haan|hul|len|trun|u)|tah|tiid|toor|ul|v(aaz|ah|en|iin?[gkr]|ur)|wuld|yah|yol|z(ah|ii|[ou][ln]|oor)

Çevrimiçi deneyin!

Birkaç basit gözlemden yola çıkarak:

  • Konumlarına bakılmaksızın tüm kelimeler benzersizdir.
  • Hiçbir kelime, başka bir kelimenin önekidir.
  • Girişin geçerli olduğu garanti edilmektedir.

Bu, dizede üst üste binmeden kaç kelime göründüğünü sayabileceğimiz anlamına gelir. Tam bir normal ifade böyle yapar. Regex sadece |(351 bayt olurdu) ile tüm kelimeleri bitiştirmek ötesinde biraz sıkıştırma denedim , ama bu optimal olmaktan eminim. Başlangıç ​​olarak, tüm ortak parçalardan en iyi şekilde yararlanmadım. Ancak daha da önemlisi, geçerli bir kelimenin bir kısmı ile eşleşemediği sürece (çünkü o zaman asla eşleştirilmeyecekleri sürece), dizeyi geçerli kelimelerden daha fazla dizeyle eşleştirerek daha da sıkıştırmak mümkündür. Eminim ki optimum olduğundan emin olmak için sıkıştırmayı otomatikleştirmek zorunda kalacaktır.


2
Martin Büttner geride bırakıldı mı? Herkes sığınaklara girer, son hemen hemen biter!
Cyoce

4
@Çok iyi, diğer üçte iki cevap verdim. ;)
Martin Ender

1

Perl 5, 28 bayt

Bayt sayısı için bir tane içerir -p.

s/ou/oxo/;$_=()=/[aeiou]+/g

Doğrudan dev- null'dan çalındı . (Teşekkürler dev-null!)

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.