โปรแกรม Acme Canine Decoder 2000 ของศาสตราจารย์ชวาร์ตมันมาน


31

บทนำ

เรา - โดยเฉพาะในหมู่พวกเราที่มีแนวโน้มที่จะเป็นแฟน - ทุกคนจำการ์ตูนเก่าแก่ของFar Side :

เฮ้!  เฮ้!  เฮ้!

เห็นได้ชัดว่าศาสตราจารย์ชวาร์ตซ์แมนสามารถแปรงทักษะการเขียนโปรแกรมของเขาได้อีกเล็กน้อยก่อนที่เขาจะใช้สิ่งประดิษฐ์ของเขา แต่คุณสามารถทำซ้ำด้วยตัวคุณเอง ... ใช้น้อยที่สุดเท่าที่เป็นไปได้?

ข้อมูลจำเพาะอินพุต

คุณต้องสร้างสคริปต์ที่แปลเสียงสุนัขให้เป็นเสียง "ไฮ" อย่างเหมาะสม นี่คือรหัสกอล์ฟบริสุทธิ์ จำนวนไบต์ต่ำสุดชนะ

ข้อมูลที่คุณป้อนจะประกอบด้วยโทเค็นต่อไปนี้รวมกัน:

  • Bark, Baark, Baaark, Baaaark... (นั่นคือB*rk มีอย่างน้อย 1 aแทนที่เครื่องหมายดอกจัน)
  • Woof, Wooof, Woooof... ( W*fอย่างน้อย2 o s เปลี่ยนเครื่องหมายดอกจัน)
  • Grr, Grrr, Grrrr, ... , ( Gตามมาด้วยอย่างน้อย2 r s)
  • จำนวนอักขระ.(จุด), !(เครื่องหมายอัศเจรีย์) และ / หรือ?(เครื่องหมายคำถาม) ซึ่งอาจเกิดขึ้นที่ใดก็ได้ในอินพุต

โปรดทราบอีกครั้งว่าโทเค็นพื้นฐานWoofและGrrเบสต้องการอีก อย่างน้อยสองo s และrs ตามลำดับ; WofและGrมีไม่ราชสกุลที่ถูกต้อง

ไม่มีการ จำกัด ระยะเวลาที่โทเค็นสามารถใช้ได้ (เช่นจำนวนของการทำซ้ำaที่สามารถมีได้ในBarkโทเค็น) อย่างไรก็ตามตัวถอดรหัสของคุณจะต้องทำงานอย่างถูกต้องสำหรับโทเค็นอินพุตที่มีจำนวนs, s หรือs ทั้งหมด10 รายการเพื่อให้ผ่านการท้าทายนี้aor

รายละเอียดผลผลิต

ด้วยความซื่อสัตย์ต่อการออกแบบของ Schwartzman โปรแกรมถอดรหัสสุนัขของคุณจะต้องประมวลผลเป็นข้อความเอาต์พุตดังนี้:

  • Bark, WoofและGrrกลายเป็นHey;
  • Baark, WooofและGrrrกลายเป็นHeyy;
  • Baaark, WoooofและGrrrrกลายเป็นHeyyy; เป็นต้น
  • สำหรับBarkโทเค็นที่ใช้ทั้งหมดจำนวนของys ในHeyโทเค็นเอาต์พุตที่ใช้จะต้องเท่ากับจำนวนของas
  • สำหรับทุกWoofราชสกุลชั่นจำนวนของys ในการส่งออกHeyเบสโทเค็นจะต้องเป็นหนึ่งในน้อยกว่าจำนวนของos;
  • สำหรับทุกGrrราชสกุลชั่นจำนวนของys ในการส่งออกHeyเบสโทเค็นจะต้องเป็นหนึ่งในน้อยกว่าจำนวนของrs;
  • เครื่องหมายวรรคตอนทั้งหมด ( ., !และ?) ไม่มีการเปลี่ยนแปลง

อย่าลืมดรอปหนึ่งอันyจากเอาต์พุตสำหรับWoofs และGrrs เท่านั้น! การป้อนข้อมูลBaaaaaaaark?ด้วย 8 aวินาทีจะกลายเป็นHeyyyyyyyy?กับชุดการจับคู่ของ 8 yวินาที อย่างไรก็ตามWoooooooof?จะกลายเป็นเพียงHeyyyyyyy?กับ 7 yวินาที

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

โทเค็นทั้งหมดBark-, Woof-, และGrr-based ในข้อมูลของคุณจะถือว่าเริ่มต้นด้วยตัวพิมพ์ใหญ่ ดังนั้นจึงไม่จำเป็นต้องจัดการกับการเปลี่ยนBark grrrเป็นHey heyyหรืออะไรที่คล้ายกัน

ตัวอย่างอินพุตและเอาต์พุต

    • การป้อนข้อมูล: Bark. Bark! Bark!!
    • เอาท์พุท: Hey. Hey! Hey!!
    • อินพุต: Baaaaaark?(หกวิa)
    • เอาท์พุท: Heyyyyyy?(หกys)
    • อินพุต: Grrrrrrrr...(แปดวิr)
    • เอาท์พุท: Heyyyyyyy...( เจ็ด y s)
    • การป้อนข้อมูล: ?...!
    • เอาท์พุท: ?...!
    • การป้อนข้อมูล: Wooof Woof? Grrrr. Baaaark Grr!
    • เอาท์พุท: Heyy Hey? Heyyy. Heyyyy Hey!

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


ขอบคุณสำหรับเคล็ดลับเกี่ยวกับกระบวนการยอมรับ ฉันกำลังวางแผนที่จะตรวจสอบรายการคำตอบทุกสองสามชั่วโมงและถ้าฉันสังเกตเห็นว่ามีคำตอบที่ดีกว่าให้ยอมรับ ขออภัยสำหรับทุกคนที่ฉันอาจปฏิเสธชื่อเสียงที่นี่
A. Mirabeau

5
@ A.Mirabeau นั้นเป็นเกียรติและมันจะทำงานได้อย่างสมบูรณ์แบบ แต่บางคนก็ไม่ได้ใส่ใจอย่างนั้นผู้ตอบส่วนใหญ่อาจคิดว่าผู้ชนะได้รับการคัดเลือกแล้ว ในขณะที่ไม่มีอะไรผิดปกติกับการเลือกผู้ชนะทันทีหากคุณวางแผนที่จะอัปเดตคุณมีแนวโน้มที่จะได้รับคำตอบน้อยลงเพราะมันมาพร้อมกับข้อร้องเรียนบางอย่างดังนั้นจึงเป็นเรื่องปกติที่จะรออย่างน้อยหนึ่งสัปดาห์
Martin Ender

คำตอบ:


16

Retina , 24 18 17 16 ไบต์

บันทึก 1 ไบต์ขึ้นอยู่กับแนวคิดในคำตอบของ MT0

\wf?k?
y
\byy
He

ลองออนไลน์!

คำอธิบาย

\wf?k?
y

สิ่งนี้จะเปลี่ยนเป็นตัวอักษรทั้งหมดyแต่ถ้าพวกเขาตามมาด้วยfหรือkเราจะแทนที่มันทันทีเช่นกัน โดยการลบfและkเรา "ปกติ" ความยาวของคำเพื่อให้ตอนนี้พวกเขาทั้งหมดมีสองyมากกว่าที่พวกเขาต้องการ

\byy
He

นี่จะเปลี่ยนสองyคำแรกของคำHeเป็นการแปลงให้เสร็จสิ้น


คำตอบที่มีประสิทธิภาพมากที่สุดทำได้ดีมาก ฉันยังไม่ยอมรับมัน แต่ฉันสามารถบอกคุณได้ว่าคุณสมควรได้รับ CAT FUD
A. Mirabeau

10

Perl, 51 41 39 ไบต์

s/(G.|[BW]..)(\w+)/He."y"x length$2/ge

การใช้

perl -pE 's/(G.|[BW]..)(\w+)/He."y"x length$2/ge'

อินพุต

Bark. Bark! Bark!!
Baaaaaark?
Grrrrrrrr...
?...!
Wooof Woof? Grrrr. Baaaark Grr!

เอาท์พุต

Hey. Hey! Hey!!
Heyyyyyy?
Heyyyyyyy...
?...!
Heyy Hey? Heyyy. Heyyyy Hey!

มันทำงานอย่างไร

การทดแทน regexp อย่างง่ายโดยใช้การพิมพ์อัตโนมัติ-pเพิ่ม 1 ไบต์ไปยังจำนวน /geรันการทดแทนสำหรับทุกรูปแบบและรันการแทนที่เป็นรหัส


เวอร์ชันเก่าใช้การตรวจจับสามทาง แต่Martin Enderสังเกตว่าฉันไม่ก้าวร้าวมากพอ

msh210แจ้งให้ฉันทราบว่าคุณไม่จำเป็นต้องมีเครื่องหมายคำพูดรอบสตริงHeช่วยประหยัดสองไบต์


2
ดีที่สุดจนถึงตอนนี้ขอแสดงความยินดี
A. Mirabeau

1
@ A.Mirabeau ขอบคุณมากเพราะฉันเพิ่งลงทะเบียนที่นี่เมื่อไม่กี่นาทีที่ผ่านมา!
ท่อ

การมีสามตัวแก้นั้นสร้างแรงบันดาลใจเมื่อฉันลงทะเบียนที่นี่เมื่อไม่กี่ชั่วโมงที่ผ่านมา
A. Mirabeau

1
Heคุณไม่จำเป็นต้องคำพูดที่อยู่รอบ ๆ
msh210

@ msh210 น่าสนใจไม่รู้ว่าคุณได้รับอนุญาตให้ละเว้นพวกเขาที่นั่น!
ท่อ

5

Python 106 ไบต์

f=lambda s,a="B,He,Gr,He,Wo,He,a,y,r,y,o,y,f,,yk,".split(","):s if a==[]else f(s.replace(a[0],a[1]),a[2:])

การสาธิต

https://repl.it/C6Rr


แม้ว่าจะไม่ใช่คำตอบที่ได้รับการยอมรับ แต่สิ่งนี้สมควรได้รับการกล่าวถึงอย่างน่ายกย่องว่าเป็นโซลูชันที่มีประสิทธิภาพมากที่สุดในไบต์ซึ่งเปลี่ยนเฉพาะคำหลักภาษาสุนัขสามคำที่จำเป็น
A. Mirabeau

4

JavaScript (ES6) - 57 55 52 51 ไบต์

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He')

ทดสอบ:

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He');

[
  'Bark. Bark! Bark!!',
  'Baaaaaark?',
  'Grrrrrrrr...',
  '?...!',
  'Wooof Woof? Grrrr. Baaaark Grr!'
].forEach( s=>{console.log( f(s) );} );

ขอบคุณ @MartinEnder สำหรับไบต์ 56 & 51 และเป็นแรงบันดาลใจให้กับชิ้นส่วนอื่น ๆ


4

Vimscript, 51 39 37 33 32 29 28 ไบต์

%s/\hk\?f\?/y/g|%s/\<yy/He/g

เครดิต Regex สำหรับการโกนอีก 9 ไบต์: MT0, Martin Ender, msh210

asciicast การสาธิต

คำอธิบาย:

                               1. Normalize words to same length & replace letters with ys 

%s                             Regex search and replace 
  /                            Regex search begin
   \hk\?f\?                    Find any letter (\h) optionally followed by k or f
           /                   Regex search end and replace start
            y                  Replace with y
             /                 Replace end
              g                Replace globally

               |               New command

                               2. Overwrite first two y of every word with He

                %s             Regex search and replace
                  /            Regex search begin
                   \<yy        Find yy at a word's beginning
                        /      Regex search end and replace start
                         He    replace with He
                           /   Replace end
                            g  Replace globally

1
ฉันไม่รู้จัก Vimscript แต่คุณสามารถใช้\<yyแทนได้\<\hyหรือไม่
msh210

@ msh210 ใช่มันเป็นไปได้และฉันได้ปรับปรุงวิธีแก้ปัญหาขอบคุณ
starcorder


2

Javascript, 72 66 64 ไบต์

f=
t=>t.replace(/k|f/g,'').replace(/\w/g,'y').replace(/\byy/g,'He')

แก้ไข: คั่นf=และฟังก์ชัน + ลดจำนวนไบต์


1
คุณไม่จำเป็นต้องใช้f=(เป็นค่าเริ่มต้นของ PPCG) ดังนั้น 64 ไบต์จึงใช้งานได้
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋเยี่ยมมากฉันไม่รู้เรื่องนี้
ดาราดัง


1

Python 3, 140 135 134 ไบต์

from re import*
f=lambda s:''.join('He'+'y'*len(x)+y for x,y in[(a+b+c,d)for a,b,c,d in findall('(?:Wo(o+)f|Gr(r+)|B(a+)rk)(\W+)',s)])

การใช้ regex เพื่อค้นหาอักขระที่สามารถแทนที่ได้

แก้ไข: Golfed 1 ไบต์ช่องว่างและ 4 ไบต์ในการรับค่าจากผล findall

แก้ไข 2: Golfed 1 byte (Bark's "a" ไม่นับอย่างถูกต้อง)

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