팔각형 단어 만들기


14

지난 목요일 사용자 @SpookyGengar는 제곱 단어 만들기 에 대한 첫 번째 도전으로 우리를 기쁘게했습니다 . 면의 수를 두 배로 늘리면 어떻게됩니까?

도전

문자열을 필요한 합리적인 형식 ( 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
"면의 수를 두 배로 늘리면 어떨까요?" <-그러면 숯이 여전히 이길 것입니다
Leaky Nun

제안 된 테스트 사례 :code golf
Leaky Nun

@LeakyNun은 <Space>인쇄 가능한 것으로 간주됩니까?
V. Courtois

2
@ V.Courtois yes
Leaky Nun

@LeakyNun은 테스트 케이스를 추가했습니다.
Charlie

답변:


10

, 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 바이트 : 상세 버전.

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

목탄 버그 수정은 다음 10 바이트 코드가 작동 함을 의미합니다. 상세 버전.

F⁴«θ←↘⮌θ↖⟲

그냥 이렇게 해야하는 것 같습니다. 롤
매직 문어 Urn

1
음, 나는 그것이 code golf효과가 있다고 생각 하지 않습니까?
Outgolfer Erik

아, 그리고이 사실은 16 바이트 (교체입니다 θθθ함께 θθ»θ).
Outgolfer Erik

@EriktheOutgolfer 죄송합니다. 죄송합니다. 길이 1 건에 대한 수정을 테스트하지 않았다고 생각합니다. 질문에 대한 테스트 기록이 좋지 않았습니다.
Neil

@Neil 그러나 문제는 code golf어떻습니까? 나는 이것이 숯이 어떻게 입력을 받는지와 관련이 있다고 생각합니다. 불행히도, 우회 할 수 없기 때문에이 도전으로부터 완전히 자격을 상실합니다.
Outgolfer Erik

5

자바 스크립트 (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 인 문자열에서만 작동하는 것 같습니다.
Charlie

1
@CarlosAlejo 죄송합니다. 충분히 신중하게 확인하지 않았습니다. 편리하게, 저장된 2 바이트를 수정하십시오!
Neil

오, 그거 많은 삼항입니다 ?:!
Outgolfer Erik

@EriktheOutgolfer 좋은 점은 파이썬이 아니거나 정말 장황 할 것입니다 : 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]])&

필요하지 않고 Alignmentdelayedset ( :=)을 사용하여 s[[i]]및 의 반복을 줄임으로써 바이트를 절약 할 수 있습니다. 그리고 s[[-i]]다음 아이디어로 224 바이트 로 줄어 듭니다 . = s [[-i]]; k = 길이 [s = 문자 @ #]; If [k == 1, #, 열 [Flatten @ {#, T [ ""<> {q, T [ "", k / 2-2 + i], r}, {i, 2, k}], T [ ""<> {r, T [ "", k + k / 2-2], q}, {i, 2, k}], T [ ""<> {q, T [ "", 3k / 2-1-i], r}, {i, 2, k-1}], StringReverse @ #}, 중앙] ]) & 또한 이 의견을 제출할 당시 145 바이트에 불과한 대체 솔루션 이 있습니다.
Mark S.


2

apt , 84 79 바이트

@ETHproductions 덕분에 -5 바이트


Å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ÅlV와 W를 전환하여 2 바이트를 더 절약 할 수 있습니다 . codepen.io/justinm53/full/…
ETHproductions

또한, AnV ?-> V-A?Uq £->U¬£
ETHproductions

@ETHproductions 굉장합니다, 감사합니다! 내가 잊어 버린 것을 믿을 수 없다 ¬.
Justin Mariner

1

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

매쓰, 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)&

1 문자열의 목록을 가져와 1 문자열의 행렬을 출력합니다.

내가 사용하는 대칭을 이용하여 18 바이트를 저장 -l하고 Cross/@l있는 소요 크로스 제품과 같이 취할 수있는 두 개의 단일 2D 벡터의 각의 {x,y}에를 {-y,x}. 기본적으로 두 가지 초기 방향은 동쪽 (위쪽 가장자리)과 남서쪽 (오른쪽 위 가장자리)입니다. 그런 다음 Cross왼쪽 가장자리는 북쪽, 왼쪽 아래 가장자리는 남동쪽으로 시계 반대 방향으로 90도 회전합니다 . 그런 다음 우리 -l가 덮은 4 개 를 뒤집기 위해 다른 4 개 조각을 추가합니다 .

다음과 같이 샌드 박스 에서 테스트 할 수 있습니다 .

(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.