HexaGolf: Wordagons


25

ดูเพิ่มเติม: Rotatagons

ท้าทาย

รับสตริงเป็นอินพุตเอาต์พุต wordagon

Wordagons

รูปหกเหลี่ยมเป็นวิธีการแสดงสตริงในรูปหกเหลี่ยม ตอนนี้เรามาสร้าง wordagon จาก string hexa:

ประการแรกคุณเริ่มต้นด้วยอักขระตัวแรกในสตริงที่วางไว้ตรงกลาง:

h

จากนั้นคุณใช้อักขระตัวถัดไปในสตริงและเพิ่มเลเยอร์หกเหลี่ยม:

 e e
e h e
 e e

จากนั้นเพิ่มเลเยอร์ถัดไป:

  x x x
 x e e x
x e h e x
 x e e x
  x x x

ในที่สุดเพิ่มเลเยอร์สุดท้าย:

   a a a a
  a x x x a
 a x e e x a
a x e h e x a
 a x e e x a
  a x x x a
   a a a a

และตอนนี้คุณมี wordagon hexaสำหรับสตริง

ตัวอย่าง

นี่คือบางส่วนที่ฉันเตรียมไว้ก่อนหน้านี้:

hello

    o o o o o
   o l l l l o
  o l l l l l o
 o l l e e l l o
o l l e h e l l o
 o l l e e l l o
  o l l l l l o
   o l l l l o
    o o o o o

PPcg

   g g g g
  g c c c g
 g c P P c g
g c P P P c g
 g c P P c g
  g c c c g
   g g g g

o *

  * * *
 *     *
*   o   *
 *     *
  * * *

(T_T)

    ) ) ) ) )
   ) T T T T )
  ) T _ _ _ T )
 ) T _ T T _ T )
) T _ T ( T _ T )
 ) T _ T T _ T )
  ) T _ _ _ T )
   ) T T T T )
    ) ) ) ) )

โปรดทราบว่าอนุญาตให้ขึ้นบรรทัดใหม่ต่อท้ายและ / หรือนำขึ้นบรรทัดใหม่

การชนะ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


14
คะแนนโบนัสหากมีคนทำสิ่งนี้ใน Hexagony ;)
Kevin Cruijssen

สตริงอินพุตสามารถมี linefeeds ได้หรือไม่? ฉันไม่คิดว่ามันจะมีปัญหาในการติดตั้งเพียงสร้าง wordagons ที่ไม่ถูกต้อง
Aaron

@Aaron ไม่สตริงป้อนข้อมูลจะไม่รวมบรรทัดใหม่
Beta Decay

มันจะโอเคไหมถ้าเอาต์พุตเป็นสตริงที่มีบรรทัดใหม่ที่ส่งคืนจากฟังก์ชัน?
Daniel

2
Aww ฉันผิดหวังเพราะฉันอ่านชื่อเป็น "word-dragons" ...
mbomb007

คำตอบ:



19

Python 2, 83 ไบต์

s=input()
l=len(s)
while 1:l-=1;y=abs(l);print' '*y+' '.join(s[:y:-1]+s[y]*y+s[y:])

พิมพ์ตัวอักษรคำแล้วเกิดความผิดพลาด (ซึ่งพิมพ์เป็น STDERR เท่านั้น)

ตัวอย่าง:

% python2.7 wordagon.py <<<'"abcde"' 2&>/dev/null
    e e e e e
   e d d d d e
  e d c c c d e
 e d c b b c d e
e d c b a b c d e
 e d c b b c d e
  e d c c c d e
   e d d d d e
    e e e e e

xnor บันทึก 5 ไบต์ ขอบคุณ!


2
ทางออกที่สง่างาม
DavidC

1
คุณสามารถวนซ้ำผ่านการyทำn=len(s)\nwhile 1:n-=1;y=abs(n);...และสิ้นสุดด้วยข้อผิดพลาด
xnor

10

เป็นกลุ่ม, 92 ไบต์

:se ri|s/./ &/g
ⓋCⓇ"Ⓓ␛$vpmlmrqqYpi ␛`ljxxhmlylv`rjlmr:s/\%V\(.\)./Ⓡ" /g
@qq@qVdy2G:g/^/m0
Gp

ตัวอักษรที่มีวงกลมแสดงถึงตัวอักษรControl+ ␛กำลังหลบหนี

asciicast


3
สิ่งนี้จะไม่ถูกนับเป็นการกดแป้นพิมพ์หรือไม่
Soren

1
@moo_we_all_do ไม่นี่คือโค้ดกอล์ฟ (ตรงข้ามกับโปรแกรมแก้ไขกอล์ฟ) ดังนั้นคำตอบทั้งหมดควรทำคะแนนเป็นไบต์
Martin Ender

ประการที่สอง@qทำให้เกิดการวนซ้ำไม่สิ้นสุดสำหรับฉัน มันทำงานได้อย่างสมบูรณ์แบบถ้ามันถูกลบออก
MTCoster

6

Mathematica 100 219 ไบต์

หาก ASCII-Art ไม่จำเป็นต้องเป็นเทอร์มินัลอาร์ทควรจะถูกต้อง

การส่งก่อนหน้าของฉันดึงดาวโดยไม่ตั้งใจแทนที่จะเป็นรูปหกเหลี่ยม ฉันไม่เห็นว่าฉันเป็นอย่างไร!

c = CirclePoints@6;
f@s_:=Graphics[{Text[s~StringPart~1,{0,0}],Flatten@Table[Text[StringPart[s,n+1],#]&/@Subdivide[Sequence@@#,n]&/@Partition[Riffle[(n)CirclePoints@6,RotateLeft[n CirclePoints@6]],2],{n,1,StringLength@s-1}]},BaseStyle->20]

CirclePoints@6 ส่งกลับจุดยอดของหน่วยหกเหลี่ยมโดยสมมติว่าจุดศูนย์กลางอยู่ที่จุดกำเนิด

Subdivideในการหาค่าพิกัดสำหรับจุดยอดที่อยู่ใกล้เคียงจะพบตำแหน่งที่เว้นระยะเท่ากันตามขอบที่เกี่ยวข้อง

ตัวนับจาก 1 ถึงStringLength -1สตริงอินพุตอนุญาตให้แต่ละชั้นของ wordagon จัดการแยกกัน
เมื่อnระยะทางเพิ่มขึ้นตามจุดยอดของแต่ละจุดกำเนิด

Text[s~StringPart~1,{0,0}] พิมพ์ตัวอักษรตัวแรกของอินพุตที่จุดกำเนิด


ฉ @ "Wordagon"

wordagon


สำหรับสิ่งที่อยากรู้อยากเห็นนี่คือสิ่งที่รุ่นดาราดูเหมือน ฉันรู้ว่ามันเป็นวิธีปิดเครื่องหมาย มันแสดงตัวอักษรที่จุดยอดหกเหลี่ยมเท่านั้น

Graphics@Table[Text[Style[StringPart[#, r + 1], 54], r {Cos@t, Sin@t}], {t, 0, 2π, π/3}, {r, 0, StringLength@# - 1}] &["Hexa"]

เฮกซ่า


5
คุณช่วยโพสต์รูปดาวที่เป็นอย่างไร : D
เบต้าสลายตัว

แน่ใจ ตอนนี้มันถูกโพสต์
DavidC

2
ว้าวนั่นเป็นดาวที่ดี
เบต้าผุ

3

Ruby, 82 ไบต์

->s{n=s.size-1
(r=-n..n).map{|i|(" "*k=i.abs)+r.map{|j|s[[k+j,k,-j].max]}*" "}*$/}

วนซ้ำ1-n..n-1ทั้งในทิศทาง i = y และ j = x โดยไม่ต้องเว้นวรรคชั้นนำในแต่ละบรรทัดลักษณะการส่งออกต้องการด้านล่างเป็นผลมาจากการเลือกตัวละครจากกับดัชนีs [[i.abs+j,i.abs,-j].max]การเพิ่มช่องว่างนำในรูปหกเหลี่ยมที่จำเป็น

f f f f
f l l l f
f l o o l f
f l o G o l f
f l o o l f
f l l l f
f f f f

Ungolfed ในโปรแกรมทดสอบ

f=->s{
  n=s.size-1             n=string length - 1
  (r=-n..n).map{|i|      iterate from -n to n, build an array of lines
    (" "*k=i.abs)+       k=i.abs. Start each line with k spaces.
    r.map{|j|            iterate from -n to n, build an array of characters.
      s[[k+j,k,-j].max]  select character from s (store null string in array if index past end of string)
    }*" "                concatenate the array of characters into a line, separated by spaces
  }*$/                   concatenate the array of lines into a single string, separate by newlines
}

puts f[gets.chomp]

เอาท์พุททั่วไป

   f f f f
  f l l l f
 f l o o l f
f l o G o l f
 f l o o l f
  f l l l f
   f f f f

3

JavaScript (ES6), 118 ไบต์

s=>[...Array((l=s.length-1)*2+1)].map((_,i,a)=>a.map((_,j)=>s[Math.max(i-l,l-i,j-l,i-j,l+l-i-j)]||``).join` `).join`\n`

ไหน\nหมายถึงอักขระ newline ที่แท้จริง จากคำตอบของฉันต่อความท้าทาย ASCII ของ Hexplosiveถึงแม้ว่าส่วนต่าง ๆ ของโซลูชันจะคล้ายกับคำตอบ Ruby ของ LevelRiverStore ส่วนประกอบต่าง ๆ ของการMath.maxผลิตผลผลิตต่อไปนี้สำหรับl=3:

    i - l           l - i           j - l            i - j        l + l - i - j
- - - - - - -   3 3 3 3 3 3 3   - - - 0 1 2 3    0 - - - - - -    6 5 4 3 2 1 0
- - - - - - -   2 2 2 2 2 2 2   - - - 0 1 2 3    1 0 - - - - -    5 4 3 2 1 0 -
- - - - - - -   1 1 1 1 1 1 1   - - - 0 1 2 3    2 1 0 - - - -    4 3 2 1 0 - -
0 0 0 0 0 0 0   0 0 0 0 0 0 0   - - - 0 1 2 3    3 2 1 0 - - -    3 2 1 0 - - -
1 1 1 1 1 1 1   - - - - - - -   - - - 0 1 2 3    4 3 2 1 0 - -    2 1 0 - - - -
2 2 2 2 2 2 2   - - - - - - -   - - - 0 1 2 3    5 4 3 2 1 0 -    1 0 - - - - -
3 3 3 3 3 3 3   - - - - - - -   - - - 0 1 2 3    6 5 4 3 2 1 0    0 - - - - - -

ค่าสูงสุดจะถูกนำมาใช้และค่าที่มากกว่าlจะถูกลบออกดังนั้นการสร้างรูปทรงหกเหลี่ยมในขณะที่ค่าที่เหลือจะจับคู่กับอักขระจากสตริง:

6 5 4 3 3 3 3      3 3 3 3          a a a a
5 4 3 2 2 2 3     3 2 2 2 3        a x x x a
4 3 2 1 1 2 3    3 2 1 1 2 3      a x e e x a
3 2 1 0 1 2 3   3 2 1 0 1 2 3    a x e h e x a
4 3 2 1 1 2 3    3 2 1 1 2 3      a x e e x a
5 4 3 2 2 2 3     3 2 2 2 3        a x x x a
6 5 4 3 3 3 3      3 3 3 3          a a a a

1

05AB1E , 31 ไบต์

R.pvy`¹gN-©×NFs.ø}Sðý®ð×ì})¦«»

คำอธิบาย

การใช้ความสมมาตรเพื่อสร้างส่วนบนของรูปหกเหลี่ยมเท่านั้น
จากนั้นทำมิรเรอร์ให้เป็นส่วนล่าง

R.pv                     }       # for each prefix of the reversed string
                                 # ['f', 'fl', 'flo', 'floG']
    y`                           # split into chars, ex: 'f', 'l', 'o'
      ¹gN-©×                     # repeat the last char len(input)-N times, 
                                 # where N is the 0-based list index of the current prefix
                                 # ex: 'oo'
            NF   }               # N times do
              s.ø                # surround current char with the next char on stack
                                 # ex: 'floolf'
                  Sðý            # insert spaces between each letter, ex: 'f l o o l f'
                     ®ð×ì        # prefix string with len(input)-N spaces
                                 # ex: '  f l o o l f'
                          )      # wrap all strings in a list
                           ¦    # create a reversed copy of the list and 
                                 # remove the first item (as we only need the middle once)
                             «»  # concatenate the lists and merge with newlines

ลองออนไลน์!



0

PHP - 202 ไบต์

$w=$argv[1];$l=$i=$a=strlen($w)-1;while(-$l<=$i){$s=join(" ",str_split(str_repeat($w[$l],($a-1)/2).substr($w,$a?$a:1,$l+1),1));echo str_pad("",$a).strrev($s).($a%2?" ":" {$w[$a]} ")."$s
";$a=abs(--$i);}

การใช้งานจากบรรทัดคำสั่ง:

php.exe -r "put the escaped code here" "put your desired word here"

ตัวอย่างเช่น:

php.exe -r "$w=$argv[1];$l=$i=$a=strlen($w)-1;while(-$l<=$i){$s=join(\" \",str_split(str_repeat($w[$l],($a-1)/2).substr($w,$a?$a:1,$l+1),1));echo str_pad(\"\",$a).strrev($s).($a%2?\" \":\" {$w[$a]} \").\"$s\n\";$a=abs(--$i);}" "example"

Test Suite

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