HexaGolf : Wordagons


25

참조 : 로타 타곤

도전

문자열이 입력으로 주어지면 그 단어를 출력하십시오.

단어

단어는 육각형으로 문자열을 나타내는 방법입니다. 이제 문자열에서 단어를 만들어 봅시다 hexa:

먼저 문자열의 첫 번째 문자로 시작하여 중앙에 위치시킵니다.

h

그런 다음 문자열에서 다음 문자를 가져와 6 각형 레이어를 추가합니다.

 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

그리고 이제 문자열에 대한 단어가 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

입력 문자열에 줄 바꿈이 포함될 수 있습니까? 구현에 문제가 있다고 생각하지 않고, 잘못된 단어를 만들어냅니다
Aaron

아니 @Aaron, 입력 문자열은 줄 바꿈을 포함하지 않습니다
베타 붕괴

출력이 함수에서 개행 문자가 반환 된 문자열이면 괜찮습니까?
다니엘

2
앗 나는 "워드 용"등의 제목을 읽을 수 있기 때문에 나는 ... 실망
mbomb007

답변:



19

파이썬 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

Vim, 92 바이트

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

동그라미 문자는 Control+ 문자를 나타냅니다 . ␛는 탈출이다.

아스키 캐스트


3
이것이 키 스트로크로 계산되지 않습니까?
Soren

1
@moo_we_all_do 아니요. 이것은 편집 골프와는 달리 코드 골프 이므로 모든 답은 바이트 단위로 점수가 매겨 져야합니다.
마틴 엔더

두 번째 @q는 무한 루프를 유발합니다. 제거하면 완벽하게 작동합니다.
MTCoster

6

매스 매 티카 (100) 219 바이트

ASCII-Art가 Terminal-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인접 정점의 좌표를 계산하면 각 모서리를 따라 동일한 간격의 위치를 ​​찾습니다.

StringLength -1입력 문자열의 1부터 끝까지 의 카운터를 사용하면 단어의 각 레이어를 개별적으로 처리 할 수 ​​있습니다. 증가
함에 n따라 원점에서 각 정점의 각 거리 도 증가합니다.

Text[s~StringPart~1,{0,0}] 원점에서 입력의 첫 글자를 인쇄합니다.


f @ "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
와우, 그것은 좋은 스타입니다
Beta Decay

3

루비, 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-1i = y 및 j = x 방향으로 반복합니다 . 각 줄에 선행 공백이 없으면 s index 로 문자를 선택하면 다음과 같이 출력 [[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

테스트 프로그램에서 언 골프

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

자바 스크립트 (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리터럴 개행 문자를 나타냅니다. 솔루션의 일부가 @LevelRiverSt의 Ruby 답변과 비슷하지만 Hexplosive ASCII-art challenge 에 대한 나의 대답을 기반으로 합니다. 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

파이썬 2, 104 바이트

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 바이트

$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"

테스트 스위트 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.