“ ฟ็อกซ์บราวน์ด่วน” กระตือรือร้น“ กระโดด” พร้อมกับเกลียว Groovy


12

บทนำ

เขียนโปรแกรมเพื่อเอาท์พุทเกลียวออกของ pangram ที่มีชื่อเสียงตามกฎที่กำหนด

ท้าทาย

แกรมเป็นประโยคที่ใช้ตัวอักษรทุกตัวอักษรที่กำหนดอย่างน้อยหนึ่งครั้ง หนึ่งใน pangrams ที่มีชื่อเสียงที่สุดคืออันที่ใช้อย่างกว้างขวางในโปรแกรมดูฟอนต์ของ Windows นั่นคือ " สุนัขจิ้งจอกสีน้ำตาลอย่างรวดเร็วกระโดดข้ามสุนัขขี้เกียจ " ความท้าทายคือการส่งออกเกลียวตามข้อความนี้

งานของคุณส่งออกข้อความที่แน่นอนนี้:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

นี่คือวิธีการสร้าง

  • มีสุนัขจิ้งจอกที่กระตือรือร้นที่ชอบ pangram "สุนัขจิ้งจอกสีน้ำตาลอย่างรวดเร็วกระโดดข้ามสุนัขขี้เกียจ" อยู่มาวันหนึ่งเขาอยู่ในใจกลางของเกลียวออกไปด้านนอกและตัดสินใจที่จะกระโดดเข้าไปในนั้นและทาสีตาม
  • เขาต้องการที่จะผ่าน pangram ตั้งแต่ต้นจนจบและถ้าตัวอักษรเป็นตัวอักษรตัวที่ n ในตัวอักษรเขาต้องการที่จะวาดมันครั้ง n
  • อย่างไรก็ตามสุนัขจิ้งจอกยังไม่เก่งในการเปลี่ยนมุมดังนั้นเมื่อถึงแต่ละมุมเขาก็ต้องหยุดและสลับไปที่จดหมายฉบับถัดไป
  • นอกจากนี้เขายังตัดสินใจที่จะทำซ้ำสามครั้งแกรมเพื่อเน้นว่าเขาเป็นสุนัขจิ้งจอกสีน้ำตาลอย่างรวดเร็ว
  • งานของคุณคือแสดงให้เห็นว่าเกลียวจะดูแลอย่างไรหลังจากที่สุนัขจิ้งจอกวาดตัวอักษรเหล่านั้นทั้งหมด

(เวอร์ชั่นธรรมดาไม่มีการเล่าเรื่อง)

  • pangram ที่มีชื่อเสียง "สุนัขจิ้งจอกสีน้ำตาลอย่างรวดเร็วกระโดดข้ามสุนัขขี้เกียจ" ซ้ำสามครั้งด้วยการลบช่องว่างและตัวอักษรทั้งหมดในตัวพิมพ์เล็กเพื่อสร้าง

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • เกลียวเริ่มต้นจากศูนย์กลางและเริ่มต้นด้วยตัวอักษร "t" มันเริ่มต้นจากการไปทางขวาและไปตามเข็มนาฬิกาออกไปด้านนอก หากตัวละครปัจจุบันเป็นตัวอักษรตัวที่ n ในตัวอักษรมันจะเปลี่ยนเป็นตัวอักษรตัวถัดไปทุกครั้ง

    • เกลียวถึงมุมหนึ่งหรือ
    • ตัวอักษรปัจจุบันจะถูกพิมพ์อย่างแน่นอน n ครั้ง

เพื่ออธิบายให้ดีขึ้นฉันจะอธิบายว่าเกลียวเกี่ยวข้องกับคำสามคำแรก "thequickbrown" อย่างไร

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

สุนัขจิ้งจอกเริ่มจาก "t" ไปทางขวาไปถึงมุมที่ 1 วาดด้วย "t" แล้วสลับไปที่ "h" แล้วลงไปถึงมุมที่ 2 เปลี่ยนเป็น "e" และไปทางซ้ายไปถึง มุมที่ 3 เปลี่ยนเป็น "q" และขึ้นไปถึงมุมที่ 4 สลับไปที่ "u" และไปทางขวาถึงมุมและสลับไปที่ "i" ลงไปถึงมุมและสลับเป็น "c" ซ้ายสำเร็จสี 3 "c" s ก่อนถึงมุมถัดไปสลับเป็น "k" และไปทางซ้ายถึงมุมทันทีสลับไปที่ "b" และขึ้นไปวาด 2 "b" sก่อนถึง มุมถัดไปเปลี่ยนเป็น "r"และ ไปด้านบนขึ้นไปถึงมุมแล้วเปลี่ยนเป็น "o" ไปทางขวาจากนั้น "w" ลงล่าง "n" ทางซ้าย

รายละเอียด

  • คุณสามารถรับอินพุตเพิ่มเติมที่มีรูปแบบมาตรฐานของสตริงได้

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • ผลลัพธ์ของคุณจะต้องจัดรูปแบบเป็นสตริงและต้องไปที่ STDOUT แทนไฟล์หรือ STDERR โดยวางบรรทัดใหม่อย่างถูกต้อง หัวเรื่องและลากเส้นบรรทัดว่างเปล่าไม่สำคัญ อนุญาตให้ใช้หัวเรื่องและช่องว่างต่อท้ายในแต่ละบรรทัดได้ แต่ต้องสอดคล้องกัน ดังนั้นหากคุณเพิ่ม 5 ช่องว่างก่อนหนึ่งบรรทัดของข้อความที่กำหนดคุณจะต้องเพิ่มช่องว่าง 5 ช่องก่อนแต่ละบรรทัดเพื่อให้เกลียวมีลักษณะเหมือนกัน

  • นี่คือจำนวนไบต์ต่ำสุดชนะ

  • ตามปกติช่องโหว่เริ่มต้นจะมีผลที่นี่


ยินดีต้อนรับคำอธิบายแม้ว่าจะไม่จำเป็น

แก้ไขชื่อเพื่อให้เป็น pangram ต่อความคิดเห็นโดย caird coinheringaahing

สุนัขขี้เกียจขี้เกียจเกินไปที่จะปรากฏในเรื่อง

ฉันตั้งเป้าหมายที่จะสร้างความท้าทายเกี่ยวกับสตริงซึ่งไม่สามารถคำนวณตัวอักษรไปยังเอาต์พุตด้วยฟังก์ชันอย่างง่ายของพิกัด


2
มันเป็นความอัปยศที่ชื่อนั้นไม่ใช่
pangram

@cairdcoinheringaahing จุดที่ดีฉันจะลองคิดดู ข้อเสนอแนะใด ๆ
Weijun Zhou

4
@cairdcoinheringaahing อัปเดต
Weijun Zhou

จุดรอง: ไม่ควร 'h' ในครั้งแรก 'the' ซ้ำสองครั้งไม่ใช่ 't'
mudkip201

@ mudkip201 มุมถูกวาดด้วยตัวอักษรต้นฉบับก่อนที่จะเปลี่ยนไปใช้ตัวอักษรตัวต่อไป บางทีฉันควรชี้แจง
Weijun Zhou

คำตอบ:


5

Stax , 35 34 33 32 ไบต์

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์

Stax เป็นภาษาที่ฉันใช้งานมาประมาณ 6 เดือน นี่คือการเล่นกอล์ฟสาธารณะครั้งแรกกับมัน มาลงมือทำธุรกิจกันเถอะ

โดยปกติ Stax จะถูกเขียนในชุดอักขระ ASCII ที่พิมพ์ได้ 34 การส่งไบต์นี้บรรจุในชุดของชุดอักขระ CP437 ตัวแทน ASCII ที่สอดคล้องกันคือ

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax เป็นภาษาที่ใช้สแต็ก แต่มีสองสแต็คข้อมูล "หลัก" และ "อินพุต" การดำเนินการส่วนใหญ่ใช้สแต็กหลัก แต่อินพุตเริ่มต้นในสแต็กอินพุต คำแนะนำ Stax ส่วนใหญ่เป็นลำดับ ASCII หนึ่งหรือสองตัวอักษร ส่วนใหญ่ของพวกเขามากเกินไปหมายถึงพฤติกรรมของพวกเขาจะถูกกำหนดโดยค่าน้อยที่สุดในกอง (s)

ในระดับสูงโปรแกรมนี้สร้างกริดโดยการต่อท้ายสตริงเข้ากับแถวสุดท้ายซ้ำ ๆ เมื่อแถวสุดท้ายเติมขึ้นจะหมุนตารางตามเข็มนาฬิกา ในตอนท้ายมันสะท้อนตารางในแนวนอน รายละเอียดเพิ่มเติมโปรแกรมทำงานเช่นนี้

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row

ว้าวฉันประหลาดใจจริงๆที่ความท้าทายจะได้เห็นการปรากฏตัวครั้งแรกของสาธารณชนในการเล่นกอล์ฟเพื่อใช้ภาษากอล์ฟ ขอบคุณมากสำหรับการสนับสนุนของคุณ! สนใจในภาษาของเดือนหรือไม่ ฉันหวังว่าจะเห็นผู้ใช้จำนวนมากใช้งานและจะปรากฏในรายชื่อผู้สมัครเร็ว ๆ นี้!
Weijun Zhou

@WeijunZhou: คุณหมายถึงนี้เหรอ? ฉันไม่รู้ว่ามันเป็นเรื่องจนกระทั่งบัดนี้ ฉันจะไม่รังเกียจการเสนอชื่อ ดูเหมือนว่ามันอาจจะเหมาะสมกับภาษาที่จัดตั้งขึ้น แต่ฉันไม่คัดค้าน
เรียกซ้ำ

ใช่. ฉันอาจเสนอชื่อเมื่อมีการจัดตั้งที่ดีขึ้นตามที่คุณพูด ฉันหวังว่ามันจะไม่นาน
Weijun Zhou

เนื่องจาก "พื้นที่ส่วนหัวในแต่ละบรรทัดไม่สำคัญตราบใดที่มีความสอดคล้องกัน" คุณสามารถบันทึกไบต์อื่นได้หากต้องการ
Weijun Zhou

1
ฉันเพิ่งส่งเรื่องโดยใช้ Stax คุณอาจให้คำแนะนำเกี่ยวกับเรื่องนี้หากคุณต้องการ แก้ไข: ช่างเป็นเรื่องบังเอิญ ฉันจะพยายามเรียนรู้จากการส่งของคุณ
Weijun Zhou

11

ถ่าน , 66 40 36 ไบต์

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: บันทึก 16 ไบต์โดยการป้อนข้อความเป็นอินพุต คำอธิบาย:

≔²η

เริ่มต้นด้วย 2 tวินาทีด้วยเหตุผลบางอย่าง

FS«

วนตัวอักษรทั้งหมดใน pangram

F¬η«

พวกเรามาถึงมุมแล้วหรือยัง?

เลื่อนลง (หรือทิศทางถัดไปจะเป็นอะไรก็ได้) หนึ่งบรรทัด

หมุนทิศทางการพิมพ์ 90 °ตามเข็มนาฬิกา

⊞υη≔⊕÷Lυ²η

คำนวณความยาวของด้านถัดไป

¶»

สิ้นสุดการกำหนดตำแหน่งเคอร์เซอร์ (ถ่านจะต้องการด้านที่จะสิ้นสุดก่อนมุมเพื่อให้คุณหมุนมุมเอง)

F⊕⌕βι

วนซ้ำหลาย ๆ ครั้งตามตำแหน่งของตัวอักษรปัจจุบันในตัวอักษร

¿η«

ถ้าเรายังไม่ถึงมุม

≦⊖ηι

ลดจำนวนและพิมพ์ตัวอักษรปัจจุบัน


ขอบคุณ. เยี่ยมมากและอธิบายได้ดี พิมพ์ผิดขนาดเล็ก: มีครั้ง -> สามครั้ง
Weijun Zhou

43 ไบต์รุ่นนี้ยังเป็นที่ยอมรับตามข้อกำหนด tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/...
Weijun โจว

1
@ WeijunZhou ขอบคุณฉันไม่ได้สังเกตข้อนั้นในคำถามก่อน
Neil

2

Ruby , 217 212 209 208 ไบต์

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

ลองออนไลน์!

ใช้เวลาพอสมควรในการจัดการพอยน์เตอร์ดังนั้นอาจมีห้องสำหรับเล่นกอล์ฟเพิ่ม

-5 ไบต์: pangram สามเท่าก่อนที่จะป้อน ขอขอบคุณที่Weijun โจว

-3 ไบต์: แพดสตริงอินพุตและตัดแต่งเลกสุดท้ายแทนการสร้างเลกสุดท้ายจากศูนย์

-1 ไบต์: ใช้&&แทนโอเปอเรเตอร์ที่ประกอบไปด้วยค่าการโยนทิ้ง

คำอธิบาย:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}

1
การส่งที่ดีและอธิบายอย่างชัดเจน ฉันขอขอบคุณการใช้งานrและllambdas จากคำตอบปัจจุบันเลกตัวสุดท้ายดูเหมือนจะเป็นผู้สร้างปัญหาแม้ว่าจะไม่ใช่ตอนที่ฉันเขียนตัวอย่าง C ของฉันเพื่อสร้างผลลัพธ์ตัวอย่าง ...
Weijun Zhou

1
ดูเหมือนว่าคุณสามารถบันทึกs*=3ทั้งหมดและละเว้น0ในตัว?:ดำเนินการ tio.run/…
Weijun Zhou

1
@ WeijunZhou Ahh ขอบคุณสำหรับเคล็ดลับ ฉันต้องการสิ่งนั้น0แม้ว่าหรือ Ruby จะดึงขึ้นมาc+=1จากบรรทัดถัดไปและรันเฉพาะเวลาส่วนใหญ่ และความท้าทายที่ดี!
benj2240

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