제곱 단어 만들기


38

도전

당신의 작업은 주어진 문자열 입력을 취하고 입력을 제곱 형식으로 출력하는 프로그램을 만드는 것입니다. 빈 문자열은 빈 문자열을 반환해야합니다.

주어진 입력 :

golf

프로그램은 다음을 출력해야합니다 :

golf
o  l
l  o
flog

입력:

123

산출:

123
2 2
321

입력:

a

산출:

a

입력:

Hello, world!

출력 (와 w 사이의 간격에 주목하십시오-간격은 개행 문자가 아닙니다) :

Hello, world!
e           d
l           l
l           r
o           o
,           w

w           ,
o           o
r           l
l           l
d           e
!dlrow ,olleH

채점

이것은 이므로 각 언어에서 가장 짧은 답변이 이깁니다.


@DJMcMayhem 예, 저의 사과를 추가하는 것을 잊어 버렸습니다.
SpookyGengar

2
걱정하지 말고 다시 확인하십시오. 멋진 첫 도전 BTW! 사이트에 오신 것을 환영합니다 :)
DJMcMayhem

@SpookyGengar 1 글자 입력에 대한 테스트 케이스를 추가 하시겠습니까?
musicman523

@ musicman523 아직 없어? 문자 'a'만 포함 된 세 번째 예입니다.
SpookyGengar

1
@SpookyGengar 내 나쁜, 분명히 맹인
musicman523

답변:


17

, 7 5 바이트

θ‖O↙↘

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : @CarlosAlejo 덕분에 2 바이트가 절약되었습니다. 설명:

θ       Print the input string, making the top row
 ‖O     Reflect with overlap...
   ↙    ... down and left, to create the left side
    ↘   ... down and right, to create the bottom and right sides

(반사 명령의 여러 방향은 동시에가 아니라 연속적으로 실행됩니다.)


와우, 예수, 나는 여전히 숯이 가장 멋진에 솔랑 아이디어라고 생각합니다.
매직 문어 Urn

1
입력 문자열을 인쇄하여 왼쪽과 오른쪽으로 반영하면 2 바이트를 절약 할 수 있습니다 θ‖B↙↘. 온라인으로 사용해보십시오!
Charlie

이제 생각해 보니 문자 뒤집기를 피하기 위해 ReflectOverlap대신 사용해야했을 것입니다 ReflectButterfly. :-)
Charlie

1
이것은 난해한 언어로 된 골프 답변이 인기있는 범용 언어의 풀 버전 버전보다 읽고 이해하기 쉬운 드문 경우 중 하나입니다.
Caleb

당신의 대답은 여기에 또한 4 바이트 작동합니다.
Oliver

10

MATL , 20 16 11 바이트

otYTO6Lt&(c

MATL 온라인 에서 사용해보십시오 !

편집 : 코드는 릴리스 20.2.1에서 작동하며 문제가 있습니다. 링크는 해당 릴리스를 사용합니다. (20.2.2에서는 코드가 짧아 지지만 도전 과제를 게시합니다).

설명

o     % Implicitly input a string. Convert chars to ASCII codes
t     % Duplicate
YT    % 2-input Toeplitz matrix
O     % Push 0
6L    % Push predefined literal [2, -1+1j]. When used as an index, this is
      % interpreted as 2:end-1 (indexing is 1-based)
t     % Duplicate
&(    % 4-input assignment indexing. This writes 0 at the square formed by
      % rows 2:end-1 and columns 2:end-1 
c     % Convert to char. Char 0 is shown as space. Implicitly display

매우 인상적! :) 모든 출력의 맨 아래에서 빈 줄을 제거 할 수 있습니까, 아니면 기능에 필요한가요?
SpookyGengar

2
@SpookyGengar 하나의 후행 줄 바꿈을 허용하는 것은 매우 일반적인 요청입니다.
Jonathan Allan

@SpookyGengar 감사합니다! MATL은 항상 후행 줄 바꿈을 표시합니다. Jonathan이 말했듯이, 일반적으로 허용됩니다
Luis Mendo

1
@LuisMendo 매일 새로운 것을 배웁니다. :) 제출해 주셔서 감사합니다-확실히 지금까지 최고!
SpookyGengar

6

젤리 ,  29 22  17 바이트

이 점수를 깎아 내고

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY

문자 목록을 가져오고 리턴하는 모나드 링크; 또는 결과를 인쇄하는 전체 프로그램.

온라인으로 사용해보십시오!

어떻게?

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY - Link: list of characters, w     e.g. "whole"
 ⁶                - literal space character              ' '
J                 - range(length(w))                     [1,2,3,4,5]
  ẋ               - repeat                               [" ","  ","   ","    ","     "]
         Ṛ        - reverse w                            "elohw"
        "         - zip with:
       ¦          -   sparse application of:
   a              -     and (vectorises)
    0,1           -     to indexes: [0,1] (last and 1st) ["e","ll","o o","h  h","w   w"]
            $     - last two links as a monad:
          Ṛ       -   reverse                            ["w   w","h  h","o o","ll","e"]
           ;      -   concatenate                        ["w   w","h  h","o o","ll","e","e","ll","o o","h  h","w   w"]
             Ṗ    - pop (remove last entry)              ["w   w","h  h","o o","ll","e","e","ll","o o","h  h"]
              ŒḌ  - reconstruct matrix from diagonals    ["whole","h   l","o   o","l   h","elohw"]
                Y - join with newlines                   "whole\nh   l\no   o\nl   h\nelohw"
                  - if running as a full program implicit print

아주 멋지다! 지금까지 가장 짧은 솔루션이지만 단일 문자 입력 및 숫자로 구성된 문자열 (예 : '123')에서는 작동하지 않습니다.
SpookyGengar

아, 나는 단일 문자 가장자리를 처리해야합니다. 숫자 문자열로 작동하며 프로그램 입력은 실제로 'Hello'"Spooky 's" 등과 같이 인용해야합니다 "123"(Python은 입력을 해석하는 데 사용됨).
Jonathan Allan

@SpookyGengar-1 자 케이스로 수정했습니다.
Jonathan Allan

좋은 길이 감소!
Luis Mendo

2
당신은 숯에 대해 옳습니다.
Neil

3

C, 109 바이트

i,j;f(char*s){for(i=j=printf("%s\n",s)-2;1[++s];)printf("%c%*c\n",*s,i,s[j-=2]);for(;*s*~i--;)putchar(*s--);}

온라인으로 사용해보십시오!

주목할만한 트릭 :

  • 바이트를 낭비하는 대신 strlen첫 번째 줄을 인쇄하면서 동시에 문자열의 길이를 가져옵니다.

    i=j=printf("%s\n",s)-2

    printf작성된 바이트 수를 반환 하기 때문에 작동 합니다.

  • 가운데 줄의 경우 문자열을 반복해야하지만 첫 번째 문자와 마지막 문자를 모두 제외해야합니다. 이것은 조건으로 달성됩니다

    1[++s]

    (보다 짧은 (++s)[1]) ++는 조건에 있기 때문에 첫 번째 문자를 건너 뛰고 현재 문자를 지나는 문자가 '\0'( 에서 멈추는 대신) 중지하면 마지막 문자를 건너 뜁니다 '\0'.

  • 첫 번째 루프의 본문에서

    printf("%c%*c\n",*s,i,s[j-=2])

    우리는 그 다음의 현재 글자 "미러"적당한 인쇄 (함께 추적하는 자 j, 네거티브 들어가는 음극 번호 문자열에 대한 인덱스의 홀수 상황을 초래 않는다)의 길이에 덧붙여 i여기서 (공백 i이고 편리하게 strlen(s) - 1).

  • 마지막 줄의 반전 인쇄는 매우 간단합니다. 유일한 트릭은 루프 본문의 반복 *s*~i--을 얻는 가장 짧은 방법입니다 i+2(의지하지 않습니다 i; 모두 i사용되는 것입니다). 펑키 *s*부분은 길이가 1 인 입력에서 발생 하는 *sis is '\0'인 경우 루프가 실행되지 않도록합니다 .


3

옥타브, 40 바이트

@(s,t=toeplitz(s),u=t(x=2:end-1,x)=32)t;

온라인으로 사용해보십시오!

내 대답이지만 @Luis MATL 답변 후에 게시되었습니다.


2
아주 좋은 답변입니다. Btw : 코드가 GNU Octave 개발 브랜치 4.3.1 (b481a9baeb61)과 충돌하여 이제 테스트 스위트의 일부가되었습니다 :-) hg.savannah.gnu.org/hgweb/octave/rev/c94e9509461b
Andy

1
@Andy 감사합니다. codegolf에 오신 것을 환영합니다! Octave 프로젝트 개선에 도움이 될 수 있다면 기쁘다!
rahnema1

3

하스켈 , 84 78 바이트

f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]
r=reverse

온라인으로 사용해보십시오! 사용법 : f "test". 줄 목록을 반환합니다.

편집 : dianne 덕분에 -6 바이트!


1
패턴 가드를 가드로 사용하고에 대한 동의어를 정의하여 몇 바이트를 절약 할 수 있습니다 reverse. r=reverse;f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]78 바이트입니다.
dianne



2

05AB1E , 17 16 15 19 바이트

ÂDÂø¦¨Dgú€Ás)˜»Igi¨

온라인으로 사용해보십시오!

설명

input = golf

ÂDÂ                  # bifurcate, duplicate, bifurcate
                     # STACK: 'golf', 'flog', 'flog', 'golf'
   ø                 # zip the top 2 items
                     # STACK: 'golf', 'flog', ['fg', 'lo', 'ol', 'gf']
    ¦¨               # remove the first and last element
                     # STACK: 'golf', 'flog', ['lo', 'ol']
      Dg             # get the length of the list
                     # STACK: 'golf', 'flog', ['lo', 'ol'], 2
        ú            # prepend that many spaces to each element
                     # STACK: 'golf', 'flog', ['  lo', '  ol']
         €Á          # rotate each right
                     # STACK: 'golf', 'flog', ['o  l', 'l  o']
           s         # swap the top 2 items
                     # STACK: 'golf', ['o  l', 'l  o'], 'flog'
            )˜       # wrap in a flattened list
                     # STACK: ['golf', 'o  l', 'l  o', 'flog']
              »      # join on newline
               Igi¨  # if input is length 1, remove last char

1 글자 입력에 대한 수정은 상당히 비쌌습니다.
다른 접근법이 더 나을 것 같습니다.


1

파이썬 2 , 99 88 바이트

musicman523 덕분에 -4 바이트.

lambda s:s[1:]and[s]+[s[i]+' '*(len(s)-2)+s[~i]for i in range(1,len(s)-1)]+[s[::-1]]or s

온라인으로 사용해보십시오!

문자열 목록을 반환합니다.


닫기! 출력은 내가 요구하는 것이 아닙니다.
SpookyGengar

1
89 바이트 움직여 ss[::-1]join
musicman523

길이가 1 인 문자열에는 작동하지 않습니다.
musicman523

2
참고로 모든 문제가 해결되었습니다.
완전히 인간적인

1

수학, 128 바이트

(c=Column;g=Length[x=Characters@#]-1;If[g==0,#,c@{#,c@Table[""<>{x[[i]],""<>Table[" ",g-1],x[[-i]]},{i,2,g}],StringReverse@#}])&

1

C, 96 바이트

i,l;f(char*s){for(i=l=puts(s)-2;--i;)printf("%c%*c\n",s[l-i],l,s[i]);for(;l+1;)putchar(s[l--]);}

보너스 버전 (122 바이트) :

x,y,i,l;f(char*s){for(i=l=puts(s)-1;++i<l*-~l;putchar(x==l?10:x%~-l*(y%~-l)?32:s[(x*y?l+l-2-x-y:x+y)%l]))x=i%-~l,y=i/-~l;}


1

파이썬 3, 88 바이트

w=input();p=print;l=len(w)-2
[p(w[n+1]+' '*l+w[l-n])for n in range(l)]
l+1and p(w[::-1])

1
PPCG에 오신 것을 환영합니다!
Martin Ender

사이트에 오신 것을 환영합니다! 바이트를 절약하기 위해 l+1 and다시 작성할 수 있다고 생각합니다 l+1and.
밀 마법사

@WheatWizard 편집 됨-감사합니다! 일한 것에 놀랐습니다.
Levi

의 경우를 제외하고 작동합니다 0or. 여기서 파이썬 0o은 8 진수 접두사 이므로 구문 분석에 실패 합니다.
밀 마법사

이 작업을 실행할 때 맨 위 줄을 인쇄하지 않는 것 같습니다 ... tio.run/##FcoxCsQgEAXQPqeYLk7EwqRL8CRiEVh3Iww/…
Coty Johnathan Saxman

1

자바 스크립트 (ES8) 108 112 바이트

let f = 

s=>(n=s.length)<2?s:(r=[...s].reverse()).slice(1,-1).reduce((a,v,i)=>a+`
`+s[i+1].padEnd(n-1)+v,s)+`
`+r.join``

o.innerHTML = f("hello folks!")
<pre id="o"></pre>

덜 골핑

s=>
   (n=s.length) < 2 ?    // record and check length
   s :                   // s has 0 or 1 char, else
   (r=[...s].reverse())  // reverse characters,
   .slice(1,-1)          // exclude 1st and last
   .reduce((a,v,i)=>     // append inner lines
      a +'\n' +s[i+1].padEnd(n-1) + v
    ,s)                  // to first line
    + '\n' +r.join("")   // append characters reversed

많은 바이트를 절약 해 준 Justin Mariner에게 감사의 말을 전했습니다. 당신은 그것을 얻는다 :-(


두 번째 줄을 `+s[i+1].padEnd(s.length-1)+v,s)+`만들고를 사용하여 7 바이트를 절약 할 수 있습니다 r.join``.
Justin Mariner

String.prototype.padStart템플릿 리터럴 에 대한 팁 과 태그를 추가 한 @JustinMariner에게 감사 합니다. 나는 길이 검사를 최소한으로 추가하는 데 도움이 필요했습니다 :-)
traktor53

간격이 너무 짧습니다. 를 수행 (n=s.length-1)?(r=<...>+r.join``:s하고 사용하여 문제를 해결하고 몇 가지를 더 절약 할 수 있습니다 padEnd(n). 길이 인 경우 1, length-1이다 0(거짓).
Justin Mariner

@JustinMariner 간격은 고정되어 있지만 길이 테스트를 유지했습니다. 알다시피, 길이가 0 인 문자열과 한 문자의 문자열 모두 캐리지 리턴이나 문자열의 반복없이 스스로를 반환합니다.
traktor53

1
padEndES2017입니다.
Neil

1

PHP , 118 바이트

echo $s=$argv[1];$l=strlen($r=strrev($s))-1;for($i=$l-1;$l&&$i;)echo "\n".str_pad($r[$i],$l).$s[$i].(--$i?"":"\n$r");

온라인으로 사용해보십시오!

echo $s = $argv[1];
$l = strlen($r = strrev($s)) - 1;

for ($i = $l - 1; $l && $i;)
    echo "\n" . str_pad($r[$i], $l) . $s[$i] . (--$i ? "" : "\n$r");

1

APL , 58 바이트

{(' ',⍵)[x+(x←∘.{((c-1)=⍺⌈⍵)∨0=⍺⌊⍵}⍨r)×o⌊⌽⊖o←∘.⌈⍨r←⍳c←≢⍵]}

⎕IO←0.

온라인으로 사용해보십시오!

어떻게?

c←≢⍵ -끈의 길이

r←⍳ -범위

o←∘.⌈⍨ -최소 외부 제품

123
223
333

o⌊⌽⊖- 자체 minimalize 180 턴 O를

123  ⌊  333  =  123
223  ⌊  322  =  222
333  ⌊  321  =  321

× -곱하기

x←∘....⍨r -범위의 외부 제품

    ((c-1)=⍺⌈⍵)∨0=⍺⌊⍵ -행렬의 프레임

111  ×  123  =  123
101  ×  222  =  202
111  ×  321  =  321

x+ -프레임을 추가

111  +  123  =  234
101  +  202  =  303
111  +  321  =  432

(' ',⍵)[...] -공간에 연결된 문자열에서 색인으로 가져 오기


⍉⊖⍉⊖⌽⊖있습니까?
Zacharý

@ Zacharý 감사합니다
Uriel

0

JavaScript (ES2017), 87 바이트

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

ES6 버전 : 93 바이트

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i]+' '.repeat(l-1)+c:z.join``:s).join`
`

덜 골프

s => (
  l = s.length-1,
  [...s].reverse().map( // scan string backwards
     (c, i, z) => 
     i != 0 // check if top row
     ? l-i != 0 // check if bottom row
       ? s[i].padEnd(l) + c // any middle row
       : z.join`` // bottom row: string reversed
     :s // top row: original string
  ).join`\n`
)

F=
s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

function update() {
  O.textContent = F(I.value)
}

update()
<input id=I value='Hello, world!' oninput='update()'>
<pre id=O></pre>


padEndES2017입니다.
Neil

@Neil 감사합니다. 제목을 변경하겠습니다
edc65

을 사용하여 ES6 버전에서 바이트를 저장할 수 있습니다 l+~i. 이렇게하면 1을 두 번 빼지 않아도됩니다. 대신 2를 빼면됩니다.
Neil

l-~-i
@Neil

나는 생각 s=>[...s].reverse(l=s.length).map((c,i,z)=>i?l+~i?s[i]+' '.repeat(l-2)+c:z.join``:s).join`\n` 했지만 s=>[...s].reverse(l=s.length-2).map((c,i,z)=>i?i+~l?s[i]+' '.repeat(l)+c:z.join``:s).join`\n` 작동했습니다.
Neil

0

자바, 191 바이트

(s)->{PrintStream o=System.out;int l=s.lenght();o.println(s);for(int i=0;i<l;i++){o.printf("%"+"s%"+(l-1)+"s%n",s.charAt(i),s.charAt(l-1-i));for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}}};

(s)그냥 될 수 있습니다 s. 내부에 한 줄의 루프가 있으면 중괄호를 제거 할 수 있습니다. 바이트를 절약하면 인쇄 대신 돌아올 수 있습니다. int i두 루프 모두에서 사용 하며, 서로 다른 범위에 있지만 지적 할 가치가 있는지 알 수 없습니다. 변수와 같이 초기화하면 일반적으로 바이트가 절약됩니다. for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}-> for(int i=0;i<l;){o.print(s.charAt(l-1-i++));}. 뒤에 세미콜론이 필요하지 않습니다.
TheLethalCoder

;) 지적 해 주셔서 감사합니다 (골프에 익숙하지 않음). 나중에 최적화하겠습니다!
Serverfrog

0

C # (. NET 코어) , 179161 바이트

TheLethalCoder 덕분에 -18 바이트

using System.Linq;
s=>{int l=s.Length-1,i=1;var d=s.Reverse().ToArray();while(i<l)s+="\n"+s[i]+new string(' ',l-1)+d[i++];if(l>1)s+="\n"+new string(d);return s;};

온라인으로 사용해보십시오!

바이트 수를 계산 해야하는지 여부에 관계없이 규칙에 대해 잘 모르겠습니다.

using System.Linq;

누군가이 문제를 해결해주세요.

언 골프 드 :

s =>
{
    int l = s.Length - 1, i = 1;
    var d = s.Reverse().ToArray();
    while (i < l)
        s += "\n" + s[i] + new string(' ', l - 1) + d[i++];
    if (l > 1)
        s += "\n" + new string(d);
    return s;
};

PPCG에 오신 것을 환영합니다! Linq를 사용하고 있으므로 using바이트 수에 포함해야합니다 . Linq ToCharArray()를 사용 ToArray()하고 있기 때문에 실제로 사용할 수 Reverse()있습니까? 사용 String하는 동안이를 정규화하거나 사용을 포함해야하지만이를 변경하여 쉽게 수정할 수 있습니다 string. 는 if같은 원으로 짧아 질 수도 있습니다 s+=l>1?if code:"";. i++루프에서 를 제거하고 에서 증가 시킬 수 있습니다 d[i++].
TheLethalCoder

초기화 il같은 int l=s.Length-1,i=1;. 그리고 나는 그것이 그럴지도 모른다고 생각합니다!
TheLethalCoder

@TheLethalCoder 감사합니다! 코드에 제안을 추가했습니다. 몇 가지 참고 사항 : 문자열에 실제로 IEnumerable이 있음을 완전히 잊었습니다. 문자열 대신 문자열은 내가 여전히 싸우고있는 Java 잔류 물이었다. 실제로 삼항은 놀랍게도 오래 지속되었다. 그리고 변경 후 나는 더 좋게 보이고 동일한 바이트 수이기 때문에 for (; expr;) for while (expr)으로 변경했습니다. 다시 감사합니다.
Grzegorz Puławski

걱정 마! Ternaries는 간혹 짧아지기 때문에 항상 시도해 볼 가치가 있습니다.
TheLethalCoder

0

망막 , 106 바이트

..+
$&¶$&
O$^`.(?=.*$)

\G.
$&$%'¶
r`.\G
¶$%`$&
+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2
T`p` `(?<=.¶.).*(?=.¶.)
G`.

온라인으로 사용해보십시오! 설명:

..+
$&¶$&

두 개 이상의 문자가 있으면 입력을 복제하십시오.

O$^`.(?=.*$)

복제본을 뒤집습니다.

\G.
$&$%'¶
r`.\G
¶$%`$&

끈을 삼각형으로 바꿉니다. 맨 위 삼각형은 입력으로 시작하여 매번 첫 문자를 제거하고 맨 아래 삼각형은 반전 된 입력의 첫 문자로 시작하여 매번 문자를 추가합니다.

+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2

마지막 문자가 /대각선을 이루도록 삼각형을 겹쳐서 결합하십시오 .

T`p` `(?<=.¶.).*(?=.¶.)

모든면의 끝에서 하나 이상의 문자가 떨어져 있으면 모든 문자를 공백으로 변경하십시오.

G`.

남은 빈 줄을 삭제하십시오.


0

파이썬 3, 85 바이트

상단 행에 대한 입력 사용 :)

a=input()
b=len(a)
for i in range(b-2):print(a[1+i]+" "*(b-2)+a[-2-i])
print(a[::-1])

이것이 정답입니까?
Koishore Roy


0

파이썬 3, 106 바이트

기능적인 버전 ...

w=input();p=print;l=len(w)-2
def f(k):p(w[k]+' '*l+w[-k-1]);l-k>0and f(k+1)
l<0 or f(1)or l<1or p(w[::-1])


0

매스 매 티카, 138 91 바이트

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&

Wolfram Cloud Sandbox에 다음을 붙여넣고 "셀 평가"를 클릭하거나 Shift + Enter 또는 Numpad Enter를 누르면 온라인으로 시도 할 수 있습니다 .

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&@{"g","o","l","f","y"}//MatrixForm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.