แฉทุกทิศทาง


14

การป้อนข้อมูล:

สตริง

เอาท์พุท:

1) อันดับแรกเราจะลบตัวอักษรที่ส่วนท้ายของอินพุต - สตริงจนกว่าเราจะเหลือความยาวที่เป็นรูปสี่เหลี่ยม (เช่น 1, 4, 9, 16, 25, 36, ฯลฯ )
ดังนั้นabcdefghijklmnopqrstuvwxyz(ความยาว 26) จะกลายเป็นabcdefghijklmnopqrstuvwxy( ความยาว 25)

2) จากนั้นเราใส่มันลงในช่องสี่เหลี่ยมทีละบรรทัดจากซ้ายไปขวา:

abcde
fghij
klmno
pqrst
uvwxy

3) เราพับมันในทั้งสี่ทิศทางเช่นนี้ (เรายังคงตีแผ่จนกระทั่ง 'บล็อก' ด้านนอกที่พับไว้ไม่มีตัวอักษรภายในที่จะคลี่ออกอีกต่อไป):

      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

บางสิ่งที่ควรสังเกตเมื่อเราพับออกไปด้านนอกเรามักทำสิ่งนี้เช่นกัน (ตัวเลขที่เพิ่มเข้ามาเพื่อความกระจ่างซึ่งหมายถึง 'ดัชนี' ในตัวอย่างเหล่านี้):

เมื่อเราพับด้านซ้ายออก:

 123    to:   321 123
fghij         ihgf   j

เมื่อเราพับด้านขวา:

 123    to:    123 321
fghij         f   jihg

เมื่อเราพับขึ้นไป:

            3q
            2l
            1g
  b   to:    b
 1g         1
 2l         2
 3q         3
  v          v

เมื่อเราพับลง:

 b          b
1g         1
2l         2
3q         3
 v   to:    v
           3q
           2l
           1g

กฏท้าทาย:

  • คุณสามารถสมมติว่าอินพุตจะมีอักขระอย่างน้อย 1 ตัวเสมอ (ซึ่งจะเป็นเอาต์พุต)
  • รูปแบบเอาต์พุตมีความยืดหยุ่นดังนั้นคุณสามารถพิมพ์ไปที่ STDOUT หรือ STDERR; กลับมาเป็น string-array / list หรือ character 2D-array; สตริงเดี่ยวที่มีบรรทัดใหม่; เป็นต้น
  • ข้อมูลที่ป้อนจะมีเพียงตัวอักษรและตัวเลข ( a-zA-Z0-9)
  • นอกจากนี้คุณยังสามารถใช้เป็นตัวละครที่ไม่ใช่ตัวเลขที่จะเติมช่องว่างในและ / หรือการส่งออกทั่ว ASCII .ศิลปะเช่นจุด
  • ช่องว่างต่อท้ายและบรรทัดใหม่ต่อท้ายบรรทัดเดียวเป็นตัวเลือก
  • เราดำเนินการตีแผ่ต่อไปจนกระทั่ง 'บล็อก' ที่พับด้านนอกไม่มีศูนย์ที่ต้องเปิดอีก

กฎทั่วไป:

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

กรณีทดสอบ:

Input: abcdefghijklmnopqrstuvwxy
Output:
      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Input: A
Ouput:
A

Input: ThisIsATest
Output:
  I
 Thi
Is sI
 ATe
  I

Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:

               An
               ch
              xamp
              i  I
              o  E
              quar
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
            HowAbout
      oLyreVA      noLyreV
  xampl    Eg      el    Examp
hci  Is    hW      As    hi  Ihc
nAo  Ev    sl      ev    so  EnA
  quare    Sn      Ie    Squar
      Odaetsn      fOdaets
            OddOneAn
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
              xamp
              i  I
              o  E
              quar
               An
               ch

Input: Lenght7
Output:
Le
ng

Input: abc
Output:
a

มีข้อผิดพลาดในการทดสอบสำหรับ "HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExOneAndExceeds64Chars": 'h' -> 'i' ใกล้ด้านล่างของผลลัพธ์
ngn 26'17 น

คำตอบ:


5

SOGL V0.12 , 75 ไบต์

l√u²m√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚

ลองที่นี่!

สิ่งนี้คาดว่าอินพุตจะอยู่ในสแต็กดังนั้นเพื่อความสะดวกในการใช้งานฉันเพิ่ม,เมื่อเริ่มต้น ที่อาจทำให้เกิดปัญหาหากการป้อนข้อมูลมีเพียงตัวเลขดังนั้นนี่ คือ aa ชุดทดสอบสำหรับที่

70 ไบต์ใช้√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚งานได้เช่นกัน แต่เมื่อฉันนำไปใช้กับสตริงเท่านั้นและเอกสารไม่ได้กล่าวถึงว่าจะเพิ่มความยาวฉันจะไม่นับ

คำอธิบาย:

creating a square from the input

l       get the length of the input
 √      get its square root
  u     floor that
   ²    square it
    m   mold the input to that length
     √  convert it to a square

creating the unfoldings of the square - the idea is to cut out the inner squares to a new array

lH»{                              } (length-1)//2 times do
    ā;                                push an empty array below ToS
      l⁾                              push ToS.length - 2 (ToS here is the square or the previous unfolding)
        :A                            save a copy of that in the variable A
          ∫B                    }     repeat that amount of times, saving iteration on B - cutting the inner square to the empty array
            a{                 }        variable A times do
              bIw                         get the b+1th row of the previous unfolding
                 FIW                      get the (current loops iteration + 1)th character of that
                    h                     swap the 2 items below ToS - so the stack now is [..., prevUnfolding, newArray, character]
                     Fbž                  at [current loops iteration; b] insert that character in the array
                        ;                 swap the top 2 items - the stack now is [..., newArray, prevUnfolding]
                         FIbI@ž           at [current loops iteration+1; b+1] insert a space
                                 ;    get the now not empty array ontop of the stack

add the horizontal unfoldings

¹                    wrap the stack in an array
 K                   push the 1st item of that, which will function as the canvas
  ⁴{              }  iterate over a copy of the remaining items
    ē2\⌡               repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        ±                reverse the array horizontally
         e{  }         repeat e times
           @Κ            add a space before ToS
              ;⁴┼┼     add that horizontally before and after the canvas

add the veertical unfoldings

;                get the copy of the foldings above the canvas
 0E              reset the variable E to 0
   {         }   iterate the copy of the foldings
    ē2\⌡           repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        №            reverse the array vertically
         :h++      add that vertically before and after the canvas
              ╚  center the canvas vertically

รุ่นไบต์ของคุณ 70 ที่ถูกต้องเป็นที่ไม่ใช่การแข่งขันไม่ได้เป็นสิ่งอีกต่อไป
Shaggy

@Shaggy รุ่น 75 ไบต์มีผลบังคับใช้เนื่องจากก่อนหน้านี้ความท้าทายนี้ใช้กับตัวเลขเท่านั้น เหตุผลที่ฉันไม่นับรุ่น 75 ไบต์เป็นเพราะฉันรู้สึกเหมือนตกอยู่ภายใต้ช่องโหว่ของการเพิ่มตัวในเพื่อความท้าทาย
dzaima

4

ถ่าน , 120 109 ไบต์

AI§⪪IXLθ⁰·⁵.⁰ηFη⊞υ✂θ×ιηF⁴«AυεJ⁰¦⁰F÷⁺¹η²«F⁴«F⁻η⁺κꧧεκ⁺μκ↷A⮌EεEε§ξν嶻A⎇﹪ι²Eε⮌λ⮌εεA⎇‹ι²⁻⁺²⁺κκη⁻η⁺κκκ¿﹪ι²Mκ¹M¹κ

ลองออนไลน์! โปรดทราบว่าตั้งแต่นั้นมาถูกเปลี่ยนเป็นและลิงก์แสดงถึงสิ่งนี้ คำอธิบาย:

       θ          Input string
      L           Length
     X  ⁰·⁵       Raise to the power 0.5
    I             Cast to string
   ⪪       .      Split on the decimal point
  §         ⁰     Take the first element (integer part)
 I                Cast to integer
A            η    Assign to h

h = int(sqrt(len(q)))คำนวณ ( Floorยังไม่ได้ใช้งาน ... )

Fη⊞υ✂θ×ιη

แยกhส่วนของความยาวhออกจากอินพุต (ที่จริงฉันไม่รำคาญตัดทอนชิ้นความยาวh.) ฉันใช้forห่วงมากกว่าMapเพราะผมต้องAssignผลมาจากการที่ใดที่หนึ่งและนี่คือขี้ปะติ๋วเมื่อจัดการกับMapSlice

F⁴«

การแฉเกิดขึ้น 4 ครั้งหนึ่งครั้งสำหรับแต่ละทิศทาง (ลง, ขวา, ขึ้น, ซ้ายตามรหัส) iตัวแปรห่วงสำหรับวงนี้อยู่

   Aυε

คัดลอกสตริงที่แบ่งส่วน

   J⁰¦⁰

กระโดดกลับไปที่จุดเริ่มต้นของผืนผ้าใบเพื่อให้แต่ละคนเริ่มแฉกับh-by- hตารางในสถานที่เดียวกัน

   F÷⁺¹η²«

ทำซ้ำ(h+1)/2ครั้ง; หนึ่งครั้งสำหรับแต่ละแฉและอีกหนึ่งสแควร์ดั้งเดิม kตัวแปรห่วงสำหรับวงนี้อยู่

          F⁴«

ทำซ้ำ 4 ครั้งหนึ่งครั้งสำหรับแต่ละด้านของตารางที่กางออก (ฉันไม่ได้ใช้ตัวแปรลูปl)

             F⁻η⁺κκ         Loop h-2k times, loop variable `m`
                    §εκ     Take the `k`th row
                   §   ⁺μκ  Take the `k+m`th column
                            Implicitly print the character

พิมพ์ด้านหนึ่งของช่องสี่เหลี่ยมที่กางออก ตั้งแต่นี้เป็นต้นไปkแฉด้านของสแควร์เป็นh-2kและนำตัวละครkออกไปจากขอบของสแควร์เดิม

Pivot พร้อมที่จะพิมพ์ด้านถัดไปของสี่เหลี่ยม

               Eε       Map over the array (element `m`, index `n`)
                 Eε     Map over the array (element `x`, index `p`)
                   §ξν  Take the `n`th element of `x`
              ⮌         Reverse
             A        ε Replace the array with the result

หมุนสตริงที่หั่นแล้ว (ใช่นั่นคือ a ξ. ฉันไม่ได้ใช้บ่อยเลย!) Eηก็ใช้ได้กับตัวนอกด้วยMapด้วย การหมุนยังมีผลข้างเคียงที่สะดวกในการตัดความกว้างของอาร์เรย์ให้hเป็น

             ¶»

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

            ﹪ι²         Take `i` modulo 2
           ⎇            Choose either
                   ⮌ε   Reverse the array
               Eε       Map over the array (element `l`, index `m`)
                 ⮌λ     Reverse each element
          A          ε  Replace the array with the result

พลิกสี่เหลี่ยมในแนวตั้งหรือแนวนอนตามความเหมาะสม

           ⎇‹ι²                 If `i` < 2
                  ⁺κκ           Double `k`
                ⁺²              Add 2
               ⁻     η          Subtract `h`
                        ⁺κκ     Else double `k`
                      ⁻η        Subtract from `h`
          ≔                κ    Assign back to `k`.

คำนวณการกระจัดเป็นแฉต่อไป

           ﹪ι²          Take `i` modulo 2
          ¿             If not zero
              Mκ¹       `k` across and 1 down
                 M¹κ    Else 1 across and `k` down

ย้ายในแนวนอนหรือแนวตั้งไปยังถัดไปแฉตามความเหมาะสม

นี่คือลิงค์ไปยังรุ่น 97- ไบต์ที่ได้รับโดยการใช้ประโยชน์จากคุณสมบัติล่าสุดของ Charcoal รวมถึงFloor: ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด


คุณแน่ใจเหรอ TIO ดูเหมือนว่าจะเกิดข้อผิดพลาด
LyricLy

@LyricLy Bah ฉันคิดว่าฉันฉลาด แต่ล้มเหลวในการตรวจสอบว่ามันใช้งานได้จริง ฉันจะยกเลิกการเปลี่ยนแปลง
Neil

1
อึลืมที่จะทำให้ลอยทำงานเป็นชิ้นโอ๊ะ ๆ
ASCII เท่านั้น

@ ASCII- เท่านั้นไม่ช่วยฉันฉันต้องตัดทอนเป็นจำนวนเต็มก่อนทำการคูณ
Neil

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