การทำคำแปดเหลี่ยม


14

เมื่อวันพฤหัสบดีที่ผู้ใช้@SpookyGengarความยินดีกับเราด้วย / เธอท้าทายแรกของเขาเกี่ยวกับการทำคำ Squared ถ้าเราเพิ่มจำนวนของด้านเป็นสองเท่าล่ะ

ความท้าทาย

รับสตริงเป็นอินพุตในรูปแบบที่สมเหตุสมผลใด ๆ ที่คุณต้องการ ( string, charอาร์เรย์ ... ) และเอาท์พุทการแสดงรูปแปดเหลี่ยมของอินพุต (เช่นเดียวกับในรูปแบบที่สมเหตุสมผล: string, รายการของstrings, charเมทริกซ์ ... ) ดังตัวอย่างต่อไปนี้:

Input: golf
Output:

   golf
  o    l
 l      o
f        g
l        o
o        l
g        f
 o      l
  l    o
   flog


Input: HelloWorld
Output:

         HelloWorld
        e          l
       l            r
      l              o
     o                W
    W                  o
   o                    l
  r                      l
 l                        e
d                          H
l                          e
r                          l
o                          l
W                          o
o                          W
l                          o
l                          r
e                          l
H                          d
 e                        l
  l                      r
   l                    o
    o                  W
     W                o
      o              l
       r            l
        l          e
         dlroWolleH


Input: a
Output:

a


Input: ab
Output:

 ab
b  a
a  b
 ba


Input: code golf
Output:

        code golf
       o         l
      d           o
     e             g

   g                 e
  o                   d
 l                     o
f                       c
l                       o
o                       d
g                       e

e                       g
d                       o
o                       l
c                       f
 o                     l
  d                   o
   e                 g

     g             e
      o           d
       l         o
        flog edoc

หมายเหตุ

  • ข้อมูลที่ป้อนจะประกอบด้วยอักขระ ASCII ที่พิมพ์ได้เท่านั้น
  • ช่องว่างนำหน้าและ / หรือช่องว่างต่อท้ายและบรรทัดใหม่ที่ได้รับอนุญาตตราบใดที่ยังคงรักษารูปทรงแปดเหลี่ยมไว้
  • นี่คือดังนั้นโปรแกรม / ฟังก์ชั่นที่ใช้งานได้ดีที่สุดสำหรับแต่ละภาษาจะชนะ!

5
"ถ้าเราเป็นสองเท่าของจำนวนด้านล่ะ" <- จากนั้นถ่านก็ยังชนะ
Leun Nun

ตัวอย่างที่แนะนำ:code golf
Leun Nun

@LeakyNun <Space>ถือว่าพิมพ์ได้หรือไม่
V. Courtois

2
@ V.Courtois ใช่
Nun

@LeakyNun เพิ่มกรณีทดสอบ
Charlie

คำตอบ:


10

Charcoal , 16 ไบต์ (ไม่ใช่ 10 ไบต์)

F⁸«✂θ⁰±¹↷¹A⮌θθ»θ

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

F⁸«                 Repeat for each side of the octagon
   ✂θ⁰±    ¹        Print the input except the last character
        ↷¹          Rotate 45° clockwise
          A⮌θθ      Reverse the input string
              »θ    Print the input again, to handle the length 1 case

ทางเลือกที่ 1 ความยาวแก้ไข 16 ไบต์เช่น: รุ่น verbose

PθF⁸«✂θ⁰±¹↷¹A⮌θθ

Charfix bugfix หมายความว่าขณะนี้โค้ด 10 ไบต์ต่อไปนี้ใช้งานได้: เวอร์ชั่น Verbose

F⁴«θ←↘⮌θ↖⟲

ดูเหมือนว่ามันควรจะทำ Lol
Magic Octopus Urn

1
อืมฉันไม่คิดว่าcode golfงานจะทำเหรอ?
Erik the Outgolfer

โอ้และนี่เป็นความจริง 16 ไบต์ (แทนที่θθθด้วยθθ»θ)
Erik the Outgolfer

@EriktheOutgolfer โอ๊ะโอขอโทษด้วยฉันไม่คิดว่าจะทดสอบตัวแก้ไขความยาว 1 ราย ... บันทึกการทดสอบของฉันในคำถามยังไม่ดีเท่านี้ใช่ไหม?
Neil

@ Neil แต่สิ่งที่เกี่ยวกับปัญหาด้วยcode golfหรือไม่ ฉันคิดว่ามันเกี่ยวข้องกับวิธีการที่ Charcoal นำเข้ามาซึ่งน่าเสียดายที่ตัดสิทธิ์โดยสิ้นเชิงจากการท้าทายนี้เนื่องจากไม่สามารถหลีกเลี่ยงได้
Erik the Outgolfer

5

JavaScript (ES6), 156 ไบต์

f=
s=>[...Array((l=s.length-1)*3+1)].map((_,i,a)=>a.map((_,j)=>s[i+j-l?l*5-i-j?i+l*2-j?j+l*2-i?i%(l*3)?j%(l*3)?-1:j?i-l:l+l-i:i?l+l-j:j-l:j:l-i:l*3-i:i]||` `))
<input oninput=o.textContent=this.value?f(this.value).map(function(a){return(a.join``)}).join`\n`:``><pre id=o>

ส่งคืนอาร์เรย์อักขระ


1
ดูเหมือนว่าจะทำงานเฉพาะกับสายยาว 4
ชาร์ลี

1
@CarlosAlejo ขออภัยตรวจสอบไม่ดีพอ สะดวกสบายแก้ไขการบันทึก 2 ไบต์!
Neil

โอ้ฉันเป็นสิ่งที่ประกอบไปด้วยจำนวนมาก?:!
Erik the Outgolfer

@EriktheOutgolfer สิ่งที่ดีไม่ใช่งูหลามหรือว่าจะเป็น verbose จริง ๆ : P
Stephen

3

Mathematica ขนาด 247 ไบต์

(T=Table;k=Length[s=Characters@#];If[k==1,#,Column[Flatten@{#,T[""<>{s[[i]],T["  ",k/2-2+i],s[[-i]]},{i,2,k}],T[""<>{s[[-i]],T["  ",k+k/2-2],s[[i]]},{i,2,k}],T[""<>{s[[i]],T["  ",3k/2-1-i],s[[-i]]},{i,2,k-1}],StringReverse@#},Alignment->Center]])&

คุณไม่ต้องการAlignmentและคุณจะได้รับการบันทึกไบต์โดยใช้ delayset ( :=) เพื่อลดการซ้ำซ้อนของs[[i]]และs[[-i]]คุณได้รับถึง 224 ไบต์ด้วยแนวคิดเหล่านี้: (T = ตาราง; q: = s [[i]]; r: = s [[- i]]; k = ความยาว [s = ตัวอักษร @ #] ถ้า [k == 1, #, คอลัมน์ [แผ่แบน @ {#, T ["" <> {q, T ["", k / 2-2 + i], r}, {i, 2, k}], T ["" <> {r, T ["", k + k / 2-2], q}, {}, 2, k}], T ["" <> {q, T ["", 3k / 2-1-i], r}, {i, 2, k-1}], StringReverse @ #}, กลาง] ]) & นอกจากนี้ฉันมีโซลูชันสำรองที่มีขนาด 145 ไบต์เท่านั้นในขณะที่ความคิดเห็นนี้
Mark S.


2

Japt , 84 79 ไบต์

-5 ไบต์ขอบคุณ @ETHproductions


Ål
VoA{A?(UÅw +Uê)£Y¥V*2+AªY¥V-A?X:SÃ:Vç +U+Vç
Wf cU¬£V?(V*3 ç hUg~Y)+X:XÃcWz2

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

ลองออนไลน์! ด้วยการ-Rตั้งค่าสถานะเพื่อเข้าร่วมอาร์เรย์ผลลัพธ์ด้วยการขึ้นบรรทัดใหม่

ไม่ใช่งานที่ภาคภูมิใจที่สุดของฉัน แต่อย่างน้อยก็ลดลงมาจาก ~ 100 ไบต์อย่างน้อย ความคิดของฉันที่นี่คือการสร้างชิ้นส่วนบนและชิ้นกลางจากนั้นจึงเพิ่มส่วนบนหมุน 180 องศา


ดี ฉันไม่เห็นจำนวนมากของการปรับปรุงทันที แต่คุณอาจจะเปลี่ยนUl ÉไปUÅlและสวิทช์ V และ W เพื่อประหยัด 2 ไบต์เพิ่มเติมได้ที่: codepen.io/justinm53/full/...
ETHproductions

นอกจากนี้AnV ?-> V-A?และUq £->U¬£
ETHproductions

@ETHproductions ยอดเยี่ยมขอบคุณ! ไม่อยากจะเชื่อเลยว่าฉันลืมไป¬แล้ว
Justin Mariner

1

Python 2 , 220 213 ไบต์

  • น่าแปลกที่นานกว่าที่ฉันจินตนาการไว้
a=input()
l=len(a)
r=range(l)
print'\n'.join(p.center(l*3-2)for p in[a]+(l>1)*([a[i]+(2*i-2+l)*' '+a[~i]for i in r[1:-1]]+[a[~i]+(l*3-4)*' '+a[i]for i in r]+[a[i]+(3*l-2*i-4)*' '+a[~i]for i in r[1:-1]]+[a[::-1]]))

ลองออนไลน์!


1

PHP 7.1, 230 156 155 ไบต์

for($x=$e=strlen($s=$argn)-1;$n<9;$r[$y][$x+=$n+1&3?$n&4?-1:1:0]=$s[$i],$i+=($n+=!$i||$i==$e)&1?:-1)$r[$y+=$n-1&3?$n<6?:-1:0]=$r[$y]?:"";echo join("
",$r);

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

ชำรุด

for($x=$e=strlen($s=$argn)-1;   # import to $s, set $e to length-1, init $x
    $n<9;                       # loop through 8 repetitions of string
    $r[$y][
        $x+=$n+1&3?$n&4?-1:1:0      # 3. increment/decrement $x depending on $n
    ]=$s[$i],                       # 4. copy character to current position
    $i+=(
        $n+=!$i||$i==$e             # 5. if first or last character of string, increment $n
    )&1?:-1                         # 6. if odd repetition next, else previous character
)
    $r[
        $y+=$n-1&3?$n<6?:-1:0       # 1. increment/decrement $y depending on $n
    ]=$r[$y]?:"";                   # 2. if empty, init row to string
echo join("\n",$r);             # output

1

Mathematica, 168 166 147 127 ไบต์

(n=Length@#;b=Array[" "&,3{n,n}-2];Do[l={{1,n+k-1},{k,n-k+1}};l=Join[l,Cross/@l];b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,n}];b)&

นี่ใช้รายการของสตริงหนึ่งอักขระและเมทริกซ์เอาต์พุตของสตริงหนึ่งอักขระ

ฉันบันทึก 18 ไบต์โดยการใช้ประโยชน์จากสัดส่วนการใช้-lและCross/@lซึ่งจะนำสิ่งที่ต้องการข้ามผลิตภัณฑ์ของแต่ละสองเวกเตอร์ 2D เดียวที่จะใช้ในการ{x,y} {-y,x}โดยทั่วไปทั้งสองทิศทางเริ่มต้นคือตะวันออก (ขอบบน) และตะวันตกเฉียงใต้ (ขอบบนขวา) จากนั้นเราเพิ่มทวนเข็มนาฬิกาทวนเข็มนาฬิกา 90 องศาด้วยCross : ทิศเหนือสำหรับขอบซ้ายและตะวันออกเฉียงใต้สำหรับขอบล่างซ้าย จากนั้นเราเพิ่มอีกสี่ชิ้นที่ใช้-lในการพลิกสี่ชิ้นที่เราครอบคลุม

คุณสามารถทดสอบกับแซนด์บ็อกซ์ได้ดังนี้:

(n=Length@#;b=Array[" "&,3{n,n}-2];Do[l={{1,n+k-1},{k,n-k+1}};l=Join[l,Cross/@l];b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,n}];b)&[{"H","e","l","l","o"," ","G","o","l","f"}]//MatrixForm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.