Diamondize ข้อความบางส่วน


20

กำหนดสตริงอินพุตที่มีความยาว2หรือนานกว่าซึ่งประกอบด้วยอักขระตัวอักษรเท่านั้น[A-Z]หรือ[a-z](ตัวเลือกของคุณหากเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กทั้งหมด) ส่งออกสตริงอักขระต่อเนื่องที่สร้างรูปแบบเพชรคู่

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

นั่นเป็นคำพูดเล็ก ๆ น้อย ๆ และมันก็เป็นตัวอย่างที่ดีกว่า:

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

ดูวิธีการYOUเริ่มต้นที่เส้นกึ่งกลางและติดตามลงและไปทางขวาจากนั้นขึ้นและไปทางขวา ฯลฯ จนกว่าจะวนกลับไปที่จุดเริ่มต้น โดยเฉพาะอย่างยิ่งโปรดทราบว่าส่วนที่Yอยู่ด้านบนและซ้ายเป็น "ด้านหลัง" Oและไม่แสดง

ตัวอย่างเพิ่มเติม:

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

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

ไม่แน่ใจว่ามันสำคัญจริง ๆ แต่ทำไมบัตรที่สอง (ซ้ายขึ้น) กลับไปด้านหลังบัตรแรก (ขวาขึ้น) ทำให้ความรู้สึกที่ใช้งานง่ายลดลงและน่ารำคาญเล็กน้อยที่จะข้ามหรือวาดตัวอักษรนั้นซ้ำอีกครั้ง
BradC

2
@BradC ฉันกำลังเล่นกับแถบMöbiusที่โต๊ะทำงานของฉันเมื่อฉันพบกับความท้าทาย ไม่มีเหตุผลอื่น
AdmBorkBork

อาจเป็นแนวคิดที่จะรวม "ภาพวาด" ของเส้นทางโดยใช้อักขระลูกศรเพื่อช่วยให้เราเห็นภาพ
Shaggy

@Shaggy เพิ่มรูปวาด
AdmBorkBork

Nice one, อันนี้ท้าทายมากขึ้นแล้วลองมอง
ดูก่อน

คำตอบ:


10

ถ่าน 17 ไบต์

GH<↗↘>↖↙LθθGH<Lθθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

GH

วาดตามเส้นทาง

<↗↘>↖↙

วาดในทิศทาง↘↗↗↘↙↖↖↙ ( <และ>มีการจดชวเลขสำหรับคู่เหล่านั้น แต่คู่อื่น ๆ ไม่มีชวเลข)

Lθ

แต่ละส่วนของเส้นทางมีความยาวเท่ากันรวมถึงส่วนท้ายของความยาวของอินพุต

θ

ใช้อินพุตเป็นข้อความที่จะเขียนตามแนวเส้นทาง

GH<Lθθ

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


3
ความท้าทายนี้ดูเหมือนจะถูกสร้างขึ้นสำหรับ Charcoal
Jonah

@Jonah น่าเศร้าที่คำสั่งเส้นทางข้อความไม่ได้วาดตัวอักษรตัวสุดท้ายหากปิดเส้นทางดังนั้นคุณไม่สามารถใช้เคล็ดลับการวาดกลับที่นี่ (แม้ว่าจะเป็นเช่นนั้นก็จะนับเป็นจำนวนไบต์เดียวกันต่อไปเนื่องจากการหมุนสตริงมีค่าใช้จ่าย 6 ไบต์)
Neil

9

05AB1E , 12 ไบต์

gIR7._•Íη•Λ

ลองออนไลน์!

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 

คุณหมายถึง1, 3, 3, 1, 7, 5, 5, 7อะไร
Neil

โอ้คุณพูดถูก ฉันผสมตัวเลขกันเล็กน้อย
โดเรียน

6

JavaScript (ES6),  157 155  154 ไบต์

ส่งคืนเมทริกซ์ของอักขระ

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

ลองออนไลน์!

อย่างไร?

nw×h

  • w=4n3
  • h=2n1

(0,n1)

ดัชนีที่ใช้ 0 ของอักขระกึ่งกลางที่ต้องถูกข้ามในรูปเพชรคือ:

p=6n6

n=4

ป้อนคำอธิบายรูปภาพที่นี่

แสดงความคิดเห็น

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)

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

@ Neil คุณควรโพสต์มันเป็นคำตอบใหม่
Arnauld

3

JavaScript (ES6), 136 ไบต์

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

ส่งคืนอาร์เรย์สองมิติ ทำงานโดยการวาดสตริงลงในอาร์เรย์โดยคำนวณพิกัดปลายทางโดยตรงทำงานย้อนกลับจากจุดสิ้นสุดเพื่อให้เซลล์กึ่งกลางถูกเขียนทับโดยอัตโนมัติ คำอธิบาย:

(s

สตริงอินพุต

,l=s.length-1

ระยะห่างระหว่าง "ตีกลับ" ก็ครึ่งดัชนีแถวสุดท้ายและหนึ่งน้อยกว่าความยาว

,z=l*4

ดัชนีคอลัมน์สุดท้ายและครึ่งหนึ่งของความยาวของข้อความที่จะวาด

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

อาร์เรย์ของช่องว่าง

,g=x=>x--

นับถอยหลังจากเซลล์สุดท้ายจนถึงเซลล์แรก

  ?g(x

เรียกซ้ำเพื่อประมวลผลเซลล์ที่เหลืออยู่

    ,a[a[y=(x+l)%z]?y:z-y]

คำนวณแถวของเซลล์นี้

      [x>z?z+z-x:x]=s[x%-~l])

คำนวณคอลัมน์ของเซลล์นี้และตัวละครที่อยู่ในนั้น

  :a

เสร็จสิ้นโดยส่งคืนอาร์เรย์

)=>g(z+z)

เริ่มต้นที่ส่วนท้ายของข้อความ


นั่นเป็นสิ่งที่ดี +1
Ver Nick พูดว่า Reinstate Monica



0

Python 2 , 137 ไบต์

s=input();n=len(s);m=2*n-2
for r in range(m+1):print''.join([s[[x,-8-x][(x<=m)==(m>2*r)]%n],' '][r!=(x+1-n)%m!=m-r]for x in range(4*n-3))

ลองออนไลน์!

โปรแกรมเต็มรูปแบบที่รับสตริงเป็นอินพุตตามที่พิมพ์ในเวอร์ชันไดมอนด์

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