HexaGolf: Wordagons


25

Xem thêm: Rotatagons

Thử thách

Cho một chuỗi làm đầu vào, xuất ra wordagon của nó.

Lời nói

Một wordagon là một cách biểu diễn một chuỗi trong một hình lục giác. Bây giờ, hãy tạo một wordagon từ chuỗi hexa:

Đầu tiên, bạn bắt đầu với ký tự đầu tiên trong chuỗi một vị trí ở giữa:

h

Sau đó, bạn lấy ký tự tiếp theo trong chuỗi và thêm một lớp lục giác:

 e e
e h e
 e e

Sau đó, thêm lớp tiếp theo:

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

Cuối cùng, thêm lớp cuối cùng:

   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

Và bây giờ bạn có wordagon cho chuỗi hexa.

Ví dụ

Đây là một số tôi đã chuẩn bị trước đó:

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 )
    ) ) ) ) )

Lưu ý rằng dấu vết và / hoặc dòng mới hàng đầu được cho phép.

Chiến thắng

Mã ngắn nhất tính bằng byte thắng.


14
Điểm thưởng nếu ai đó làm điều này trong Hexagony? ;)
Kevin Cruijssen

Chuỗi đầu vào có thể chứa các nguồn cấp dữ liệu không? Tôi không nghĩ rằng nó sẽ gây ra bất kỳ vấn đề triển khai nào, chỉ tạo ra các từ không hợp lệ
Aaron

@Aaron Không, chuỗi đầu vào sẽ không bao giờ bao gồm các dòng mới
Beta Decay

Có ổn không nếu đầu ra là một chuỗi với các dòng mới được trả về từ một hàm?
Daniel

2
À. Tôi thất vọng vì tôi đã đọc tiêu đề là "những con rồng từ" ...
mbomb007

Câu trả lời:



19

Python 2, 83 byte

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

In wordagon và sau đó gặp sự cố (chỉ in thành STDERR).

Thí dụ:

% 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 lưu 5 byte. Cảm ơn!


2
Giải pháp thanh lịch.
DavidC

1
Bạn có thể lặp qua các ybằng cách thực hiện n=len(s)\nwhile 1:n-=1;y=abs(n);...và chấm dứt với lỗi.
xnor

10

Vim, 92 byte

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

Chữ được khoanh tròn đại diện cho Control+ chữ cái; Là thoát.

asciicast


3
Điều này sẽ không được tính là tổ hợp phím?
Soren

1
@moo_we_all_do Không. Đây là mã golf (trái ngược với trình soạn thảo golf), vì vậy tất cả các câu trả lời phải được tính bằng byte.
Martin Ender

Thứ hai @qgây ra một vòng lặp vô hạn cho tôi. Nó hoạt động hoàn hảo nếu nó bị loại bỏ.
MTCoster

6

Toán học 100 219 byte

Nếu ASCII-Art không cần là Terminal-Art thì điều này sẽ hợp lệ.

Trình trước đó của tôi đã vẽ nhầm một ngôi sao chứ không phải là một hình lục giác. Tôi không thể thấy tôi đã nghỉ như thế nào!

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 trả về các đỉnh của một hình lục giác đơn vị, giả sử rằng tâm nằm ở gốc.

Subdivideing tọa độ cho các đỉnh lân cận tìm thấy các vị trí cách đều nhau dọc theo cạnh tương ứng.

Bộ đếm từ 1 đến StringLength -1chuỗi đầu vào cho phép mỗi lớp của wordagon được xử lý riêng.
Khi ntăng, khoảng cách tương ứng của mỗi đỉnh từ gốc.

Text[s~StringPart~1,{0,0}] in chữ cái đầu tiên của đầu vào ở gốc.


f @ "Wordagon"

chữ


Đối với những người tò mò, đây là những gì phiên bản sao trông giống như. Tôi biết, đó là cách ra khỏi nhãn hiệu. Nó chỉ hiển thị các chữ cái ở đỉnh của hình lục giác.

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

lục giác


5
Bạn có thể đăng những gì ngôi sao trông như thế nào? : D
Beta Decay

Chắc chắn rồi. Bây giờ nó đã được đăng.
DavidC

2
Ồ, đó là một ngôi sao đẹp
Beta Decay

3

Ruby, 82 byte

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

lặp đi lặp lại 1-n..n-1theo cả hai hướng i = y và j = x. Không có khoảng trắng hàng đầu trên mỗi dòng, đầu ra trông giống như bên dưới, là kết quả của việc chọn một ký tự từ s chỉ mục [[i.abs+j,i.abs,-j].max]. Thêm không gian hàng đầu tạo thành hình lục giác cần thiết.

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 trong chương trình thử nghiệm

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]

Sản lượng tiêu biểu

   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 byte

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`

Trường hợp \nđại diện cho nhân vật dòng chữ mới. Dựa trên câu trả lời của tôi cho thử thách nghệ thuật Hexplosive ASCII mặc dù các phần của giải pháp giống với câu trả lời Ruby của @ LevelRiverSt. Các thành phần khác nhau của Math.maxsản xuất đầu ra sau đây cho 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 - - - - - -

Giá trị tối đa được lấy và các giá trị lớn hơn lbị loại bỏ, do đó tạo ra hình lục giác, trong khi các giá trị còn lại ánh xạ tới các ký tự từ chuỗi:

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 byte

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

Giải trình

Sử dụng tính đối xứng để chỉ tạo ra phần trên cùng của hình lục giác,
sau đó phản chiếu điều đó để tạo thành phần dưới.

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

Hãy thử trực tuyến!


0

Python 2, 104 byte

def f(s):
 for n in range(len(s)*2-1):x=abs(n-len(s)+1);print' '*x+' '.join(s[x+1:][::-1]+s[x]*x+s[x:])

0

PHP - 202 byte

$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);}

Sử dụng từ dòng lệnh:

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

ví dụ:

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"

Phòng thử nghiệm .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.