ฉันตะโกนด้วยพลังกี่คำ?


10

ใน Skyrim ตัวละครผู้เล่นสามารถใช้เวทมนต์ตะโกนอันทรงพลัง (Thu'ums) เพื่อบรรลุเป้าหมาย ทุกเสียงร้องประกอบด้วยสามคำอย่างไรก็ตามผู้เล่นสามารถใช้หนึ่งหรือสองคำแรกเพื่อให้ได้เอฟเฟกต์เดียวกันโดยใช้พลังงานน้อยลง แต่ใช้คูลดาวน์ที่สั้นกว่า

ด้วยวลี ASCII Thu'um ตัวพิมพ์เล็กโดยไม่มีเครื่องหมายวรรคตอนหรือช่องว่างให้คืนค่าจำนวนคำที่มีอยู่

ตัวอย่าง:

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

การป้อนข้อมูลจะเสมอเป็นสตริงตัวพิมพ์เล็ก ASCII ที่เกิดขึ้นจากการหนึ่งตะโกนดังต่อไปนี้การเลือกครั้งแรก 1, 2, 3 หรือคำจากตะโกนนั้นและเชื่อมโยงคำพูดในการสั่งซื้อ

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

ดังนั้นfus, fusroและfusrodahมีทั้งหมดปัจจัยการผลิตที่ถูกต้อง แต่fusroviirไม่ได้เพราะมันใช้คำจากตะโกนผสมและrodahไม่ได้เพราะมันไม่ได้เป็นคำนำหน้าของตะโกน คุณไม่ต้องจัดการกับอินพุตสตริงว่าง


รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


1
ฉันจะให้คุกกี้สำหรับบุคคลแรกที่เรียกใช้อัลกอริทึมนี้ในแต่ละบรรทัดของเพลง Dragonborn (เรียกว่า "ชุดรูปแบบ skyrim" โดย plebs)
Cyoce

คำตอบ:


17

เรติน่า, 78 42 15 14 ไบต์

ul
xo
[aeiou]+

ลองออนไลน์

tiidkloulเป็นคำเดียวที่ไม่มีลำดับเสียงสระในจำนวนเท่ากันกับจำนวนที่ควรจะพิมพ์ ดังนั้นเราจำเป็นต้องจับคู่คำเพื่อให้มีลำดับเสียงสระเพิ่มเติม ouจะจับคู่ tiidkl ou l เท่านั้นและเราสามารถแทนที่ouด้วยoxoซึ่งสร้างลำดับพิเศษ

วิธีการเริ่มต้นของฉันไม่ง่าย แต่สร้างโดยการพยัญชนะทั้งหมดจากนั้นลบเสียงสระของสระ ( ai|ii|aa|...) จากนั้นจึงนับจำนวนตัวอักษรในที่สุด แต่ต้องขอบคุณ@Martin Büttnerที่คิด[aeiou]+แทน


ส่งคืน 3 สำหรับ fusroviir ซึ่งมีการระบุอย่างชัดเจนว่าเป็นอินพุตที่ไม่ถูกต้อง
atk

1
@ atk ฉันถาม OP ว่าพวกเขาจะใส่ไม่ถูกต้อง คำตอบคือไม่
andlrc

1

เรติน่า 313 ไบต์

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)

ลองออนไลน์!

ตามการสังเกตง่ายๆสองสามประการ:

  • ทุกคำมีความเป็นเอกลักษณ์ไม่ว่าจะอยู่ในตำแหน่งใด
  • ไม่มีคำใดเป็นคำนำหน้าของคำอื่น
  • อินพุตรับประกันว่าถูกต้อง

นั่นหมายความว่าเราสามารถนับจำนวนคำที่ปรากฏในสตริงได้โดยไม่ทับซ้อนกัน นั่นคือสิ่งที่ regex ทำ ฉันได้ลองบีบอัด regex เกินกว่าเพียงแค่เชื่อมคำทั้งหมดด้วย|(ซึ่งจะเป็น 351 bytes) แต่ฉันแน่ใจว่ามันไม่เหมาะสม สำหรับการเริ่มต้นฉันไม่ได้ใช้ประโยชน์จากชิ้นส่วนทั่วไปทั้งหมดอย่างเหมาะสมที่สุด แต่ที่สำคัญกว่านั้นเป็นไปได้ที่จะบีบอัดสตริงให้ดียิ่งขึ้นโดยทำให้ตรงกับสตริงมากกว่าคำที่ถูกต้องตราบใดที่คำเหล่านั้นไม่สามารถจับคู่คำที่ถูกต้องได้โดยไม่ตั้งใจ (เพราะจะไม่มีการจับคู่) ฉันค่อนข้างมั่นใจว่าจะต้องทำการบีบอัดโดยอัตโนมัติเพื่อให้แน่ใจว่าเหมาะสมที่สุด


2
มาร์ตินBüttnerได้รับ outgolfed? ทุกคนเข้าไปในบังเกอร์ท้ายที่สุดใกล้แล้ว!
Cyoce

4
@ ฉันไม่เป็นไรฉันเล่นกอล์ฟสองในสามของคำตอบอื่น ๆ ;)
Martin Ender

1

Perl 5, 28 ไบต์

-pนับไบต์รวมถึงหนึ่งสำหรับ

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

ขโมยมาจากdev-nullโดยตรง (ขอบคุณ dev-null!)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.