반 지그재그 구축


29

N입력 으로 양의 정수가 제공 됩니다. 당신의 임무는 N각 길이 의 측면, 세미 지그재그를 구축하는 것 N입니다. 작업을 명확하게 설명하기가 상대적으로 어렵 기 때문에 다음과 같은 몇 가지 예가 있습니다.

  • N = 1:

    영형
    
  • N = 2:

    영형
     OO
    
  • N = 3:

    OO
     OO
      OOO
    
  • N = 4:

    OOOOO
     OO
      OO
       OOOO
    
  • N = 5:

    OOOOOO
     OOO
      OOO
       OOO
        OOOOOO
    
  • N = 6:

    OOOOOOO
     OOO
      OOO
       OOO
        OOO
         OOOOOOOOOOOO
    
  • N = 7:

    OOOOOOOOO
     OOOO
      OOOO
       OOOO
        OOOO
         OOOO
          OOOOOOOOOOOOOO
    
  • 더 큰 테스트 케이스 N = 9

보시다시피 세미 지그재그는 대각선과 수평선이 번갈아 만들어지며 항상 왼쪽 상단에서 오른쪽 하단 대각선으로 시작합니다. 수평선의 문자는 공백으로 구분됩니다.

규칙

  • 당신은 어떤 공백이 아닌를 선택할 수 있습니다 문자를 대신 O조차 일치하지 않을 수 있습니다.

  • 결과를 문자열 또는 각 줄을 나타내는 문자열 목록으로 출력 / 반환 할 수 있습니다 .

  • 후행 또는 선행 줄 바꿈이있을 수 있습니다.

  • 기본 허점이 적용됩니다.

  • 표준 수단으로 입력하고 출력 할 수 있습니다 .

  • 가능하면 제출물에 테스트 링크를 추가하십시오. 나는 골프 활동을 보여주고 설명이있는 답변을지지 할 것이다.

  • 이것은 이므로 모든 언어에서 가장 짧은 바이트 코드가 이깁니다!



O 사이에 수평 인 공백을 넣어야합니까?
HatsuPointerKun

1
@HatsuPointerKun 가로줄 의 문자는 공백으로 구분됩니다. – 예, 공백을 넣어야합니다.
Mr. Xcoder

1
아. 넵. 읽는 법을 배워야합니다. 감사합니다
HatsuPointerKun

1
@JohnHamilton 대답은 입력으로 주어진 숫자에 이론적으로 작동 해야 합니다. 화면이 무엇을 유지할 수 있는지 걱정할 필요가 없습니다.
Mr. Xcoder

답변:


10

, 24 바이트

FN«↶§7117ι×⁺#× ﹪ι²⁻Iθ¹»#

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

Neil 덕분에 -5 .

AST :

Program
├F: For
│├N: Input number
│└Program
│ ├↶: Pivot Left
│ │└§: At index
│ │ ├'7117': String '7117'
│ │ └ι: Identifier ι
│ └Print
│  └×: Product
│   ├⁺: Sum
│   │├'#': String '#'
│   │└×: Product
│   │ ├' ': String ' '
│   │ └﹪: Modulo
│   │  ├ι: Identifier ι
│   │  └2: Number 2
│   └⁻: Difference
│    ├I: Cast
│    │└θ: Identifier θ
│    └1: Number 1
└Print
 └'#': String '#'

차콜에게는 너무 쉬웠다 :)
Mr. Xcoder

@ Mr.Xcoder 이것은 골프를 치는 방법을 잘 모르겠다.
Outgolfer Erik

OP는 문자가 될 수 있고 일관성이 필요하지 않다고 말했기 때문에 FN§⟦↘→↗→⟧ι⁻Iθ¹→(15 바이트 만) 줄을 따라 무언가를 가고 있었지만 방향 목록은 숯에서 제대로 작동하지 않는 것 같습니다. 유감.
Charlie

@CarlosAlejo 그것도 시도했지만 불행히도 작동하지 않습니다.
Outgolfer Erik

1
@CarlosAlejo은 FN✳§⟦↘→↗→⟧ι⁻θ¹O, 데니스 당긴 후 작동 방향에 캐스팅되고
ASCII 전용

7

파이썬 2 , 157153 바이트

n=input()
o,s=q='O '
def p(k,t=q*n+s*(4*n-6)):print(t*n)[k*~-n:][:n*3/2*~-n+1]
p(2)
for i in range(n-2):p(0,i*s+s+o+s*(4*n-7-2*i)+o+s*(2*n+i-2))
n>1>p(5)

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

  • n*3/2*~-n+1 각 줄의 너비는 다음과 같습니다. ⌊3n / 2⌋ · (n-1) + 1 자.
  • 문자열 q*n+s*(4*n-6)은 맨 위와 맨 아래 행을 나타냅니다. 우리가 그것을 반복하고 슬라이스 [2*(n-1):]하면 최상위 행을 얻습니다. 슬라이스 [5*(n-1):]하면 맨 아래 줄이 나타납니다. 따라서 정의 p와의 통화 p(2)p(5). 그러나 다른 모든 라인에 대해 반복 및 라인 길이 슬라이싱이 필요하기 p때문에 루프에서 재사용 할 수 있습니다.
  • 이것은 i*s+s+o+…중간 행에 대한 지루한 표현입니다.
  • n>1>p(5)경우 단락 것이다 n≯1원인, p(5)평가되지 수 있습니다. 따라서이 줄임말입니다 if n>1:p(5).

와우, 멋진 솔루션, 너무 영리합니다. 당신은 내 upvote에 적립
씨 Xcoder

와우, 파이썬이 +1과 같은 비교에서 단락되는 것을 결코 알지 못했습니다.
Zacharý

6

매쓰, 126 125 121 112 104 89 86 바이트

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&
  • #익명 함수의 입력 번호입니다 (final로 끝남 &).
  • m=" "&~Array~{#,#^2-#+1};#,#^2-#+1일정한 익명 함수 "출력 공간"의 출력으로 주어진 차원의 배열을 채워서 적절한 크기의 공백 문자 행렬을 만듭니다 " "&.
  • Do[foo,{j,#},{i,#}]중첩 DO 루프의 쌍이고 j범위 1#그 내부 i에서 범위 1#.
  • m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X"매트릭스의 대응하는 부분이 문자 수에 세트 X에 기초 j하고 i. 은 -i에서 바이트를 저장하는 음의 색인을 사용합니다 #-i+1. (I 쓰는 것을 잊었 Mod[j,4]으로 j~Mod~4Jenny_mathy 우리는 (오히려 사용하는 것보다 직접 목록에 인덱스 모듈 잔류 물을 사용할 수 있음을 지적했다.이 코드의 원래 버전에서) Switch9 바이트를 저장) 및 JungHwan 분은 우리가 'didn를 지적 ReplacePart우리는 배열의 일부를 설정할 수 1[i,#,-i][[j~Mod~4]]있고 이상한 행동과 일반성 을 사용하여 [[foo]]바이트를 절약 하기 때문에 사용할 필요가 없습니다.{1,i,#,-i}[[j~Mod~4+1]]
  • 메타는 문자 목록이 문자열이라는 것을 확립 했기 때문에 ( 정환 민이 지적한 바와 같이 ) 문자 행렬은 이미 "문자열"목록이므로 문자 행렬의 행에 함수를 매핑 할 필요가 없습니다.

다음과 같은 코드를 붙여 넣고 Shift + Enter 또는 숫자 키패드 Enter 를 눌러 Wolfram Cloud 샌드 박스 에서이를 테스트 할 수 있습니다 .

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&@9//MatrixForm

1
아주 좋아요! StringJoin을 ""<> # &로 대체하여 4 바이트를 절약 할 수 있습니다.
J42161217

@Jenny_mathy 팁 주셔서 감사합니다! 꽤 유용한 것 같습니다.
Mark S.

2
Switch [...]를 {1, i, #,-i} [[j ~ Mod ~ 4 + 1]]로 바꾸고 9 바이트를 절약 할 수도 있습니다!
J42161217

1
실제로는 ReplacePart여기에 필요하지 않습니다 . m=ReplacePart[...]할 수있다 m[[{1,i,#,-i}[[j~Mod~4+1]],j#-#+i+1-j]]="X"- 할 수 있습니다 리스트를. 그것은 15 바이트를 제거합니다. SetPart
JungHwan Min

1
{1,i,#,-i}[[j~Mod~4+1]]또한 될 수 있습니다 1[i,#,-i][[j~Mod~4]]. 이 트릭은 식 [[0]]Head를 반환 하기 때문에 작동 합니다 .
JungHwan Min

4

C ++, 321234 바이트

Zacharý 덕분에 -87 바이트

#include<vector>
#include<string>
auto z(int n){std::vector<std::string>l;l.resize(n,std::string(n*n+n/2*(n-1),32));l[0][0]=79;int i=0,j,o=0;for(;i<n;++i)for(j=1;j<n;++j)l[i%4?i%4-1?i%4-2?0:n-j-1:n-1:j][i*n+j-i+(o+=i%2)]=79;return l;}

문자열로 구성된 벡터를 반환


나는 그것을 318 바이트로 줄였다
Zacharý

수정, 나는 그것을 239 바이트로 줄였다
Zacharý

스팸, 죄송합니다. 234 바이트 : repl.it/JpJ2/3
Zacharý

1
천만에요
Zacharý

@ Zacharý 당신에게 대단히 감사합니다
HatsuPointerKun

4

Mathematica, 179 바이트

Rotate[(c=Column)@(t=Table)[{c@(a=Array)[" "~t~#<>(v="o")&,z,0],c@t[t[" ",z-1]<>v,z-1],c@a[t[" ",z-2-#]<>v&,z-1,0],c@t[v,z-Boole[!#~Mod~4<1]-1]}[[i~Mod~4+1]],{i,0,(z=#)-1}],Pi/2]&

@JungHwanMin에 대한 편집


나는 그것이 그렇게 짧고 잘 될 것이라고 기대하지 않았습니다!
Mr. Xcoder

그냥 질문 : 수 Mod[z,4]==0로 대체 Mod[z,4]<1?
Mr. Xcoder

네, 골프를
타면

3
정말 티카 모르지만, 당신은 대체 할 수 Mod[#,4]와 함께 #~Mod~4-1 바이트?
Mr. Xcoder

1
죄송합니다. 실수로 다운 보트를 받았습니다. 답을 뒤집어 뒤집을 수 있습니까?
JungHwan Min

4

05AB1E , 21 20 19 바이트

암호

새로운 캔버스 모드를 사용합니다 :

Fx<)Nè'ONÉúR3212NèΛ

05AB1E 인코딩을 사용합니다 . 온라인으로 사용해보십시오!

설명:

F                      # For N in range(0, input)
 x<)                   #   Push the array [input, 2 × input - 1]
    Nè                 #   Retrieve the Nth element
      'ONÉúR           #   Push "O" if N is odd, else "O "
            3212Nè     #   Retrieve the Nth element of 3212
                  Λ    #   Write to canvas

입력 6의 경우 캔버스에 대해 다음과 같은 인수가 동일한 순서로 제공됩니다.

[<num>, <fill>, <patt>]
[6,     'O',     3]
[11,    'O ',    2]
[6,     'O',     1]
[11,    'O ',    2]
[6,     'O',     3]
[11,    'O ',    2]

캔버스의 기능을 설명하기 위해 위 목록에서 첫 번째 인수 세트를 선택합니다.

숫자 6 은 캔버스에 기록 될 문자열 의 길이 를 결정합니다 . 필러는 캔버스에 쓰는 데 사용되며이 경우에는입니다 O. 필러 문자열을 통해 주기적으로 실행됩니다. 문자열의 방향은 최종 인수 방향으로 결정됩니다. 지시 사항은 다음과 같습니다.

7  0  1
 \ | /
6- X -2
 / | \
5  4  3

이것은 3 이 방향을 남동쪽 으로 설정 한다는 것을 의미하며, 온라인 에서도 시도 할 수 있습니다 .


또한 캔버스 모드는 개발 중이며 매우 불안정합니다
Adnan

: O 05AB1E가 숯으로 변하고 있습니다 (또한 숯 O_o를 치고 있습니다)
ASCII 전용

나는 그것에 대해 뭔가를해야했다, 그래서 @ ASCII 전용 그래, 나는 배경에 모든 ASCII 기반 언어의 상승 (숯, SOGL, V, 등) 및 톱 05AB1E 싱크를 보았다 : P
아드 난

숯을 복사 했습니까? : P 05ab1e에는 캔버스와 방향 인쇄 기능도 있습니다 (숯은 파이썬을 통한 길이의 인쇄 스타일 만 지원하지만)
ASCII 전용

2

SOGL V0.12 , 36 바이트

╝.H∫2\?.╝}F2%?№@.┌Ο};1w⁄Hh1ž}.4%1>?№

여기 사용해보십시오!

기본 아이디어는 입력 범위의 각 숫자에 대해 대각선 또는 수평 점선 부분을 추가하는 것을 선택하는 것입니다.이 경우 배열을 더 쉽게 추가 할 수 있습니다. 설명:

╝                                     get a diagonal from the bottom-left corner with the length of the input - the starting canvas
 .H∫                        }         for each number in the range [1,inp-1] do, pushing counter
    2\?  }                              if it divides by 2, then
       .╝                                 create another diagonal of the input
          F2%                           push counter % 2
             ?     }                    if that [is not 0]
              №                           reverse the current canvas upside down
               @.┌Ο                       get an alternation of spaces and dashes with the dash amount of the input length
                    ;                   get the canvas on top of the stack
                     1w⁄                get its 1st element length
                        H               decrease it
                         h              swap the bottom 2 items - the canvas is now at the bottom and the current addition ontop
                          1             push 1
                           ž            at 1-indexed coordinates [canvasWidth-1, 1] in the canvas insert the current part made by the Ifs
                             .4%1>?   if input%4 > 1
                                   №    reverse the array vertically

1의 입력이 허용되지 않으면 ο.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№작동합니다. 주위에 떠 다니는 임의의 숫자가 허용 .∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№되면 작동합니다. 내가 구현 게으른 아니었다면 , }F2%?로 대체 될 수 -4 바이트


2

매스 매 티카, 106 87 바이트

SparseArray[j=i=1;k=#-1;Array[{j+=Im@i;k∣#&&(i*=I);j,#+1}->"o"&,l=k#+1,0],{#,l}," "]&

s 의 SparseArray객체를 반환합니다 String. 출력을 시각화하기 위해 추가 할 수 있습니다Grid@ . case에 대한 오류가 발생 1하지만 무시해도됩니다.

설명

j=i=1

ij1로 설정하십시오 .

k=#-1

k입력-1로 설정하십시오 .

l=k#+1

설정 lk*input + 1

Array[ ..., l= ...,0]

l에서 시작 0하여 1매번 증가하는 반복 시간 ...


j+=Im@i

의 허수 구성 요소 추가 i에를 j...

k∣#&&(i*=I)

현재 반복이로 나눌 수 있으면 허수를 ki하십시오

{... j,#+1}->"o"

크리에이트 Rule위치에 요소를 변경 객체 {j, current iteration + 1}로를"o"


SparseArray[ ...,{#,l}," "]

생성 된 SparseArray객체를 사용하여 객체 생성Rule 차원과, 객체를 {input, l}사용하여 " "빈으로.

Wolfram Sandbox에서 사용해보십시오!


1
케이스 n = 3에 문제가 있습니다
J42161217

1
n = 2, 4,5,6에도 정확성 문제가 있지만 7 이상에서 작동한다고 생각합니다. 궁금합니다 : SparseArray배열로 카운트 되는지 여부에 관한 선례가 있습니까? 그것은 사용하여 시각화 할 수 있습니다 Grid또는 MatrixForm, 그러나 나는 일반적으로 여기에 "문자열 목록"으로 간주하지 않을 것입니다. 예를 들어 2D 문자 배열이 충분하면 내 솔루션에서 8 바이트를 차단합니다 (Jenny_mathy의 도움을 받기 전에 12 바이트).
Mark S.

1
@점수. 또한 메타 합의에 따라 문자열 배열이 정상 입니다. 확실치 않은 사항이 있으면 OP가 문의하십시오 (우리가 아닌 규칙을 만드는대로). 이 사이트에서 "SparseArray"를 간단하게 검색하면 많은 SparseArray응답을 얻을 수 있으므로 괜찮습니다.
JungHwan Min

1
@점수. 또한 이 페이지 에는 Mathematica 골프에 관한 많은 트릭이 있습니다.
JungHwan Min

1
@JungHwanMin 당신이 요청
한대로

2

파이썬 (3) , 228 (226) 224 215 197 195 바이트

-11 bytes @Mr 덕분입니다. Xcoder

-2 바이트 @Mr 덕분입니다. Xcoder

def f(n,s=range):
 x=y=t=c=0;z=[]
 for i in s(n*n-n+2):c+=i%(n-(2<=n))<1;z+=[[x,y]];t=max(t,x);x+=2-c%2;y+=[-1,1][c%4<3]*(c%2)
 return'\n'.join(''.join(' O'[[k,j]in z]for k in s(t))for j in s(n))

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

설명 및 덜 골프 코드 :

def f(n):
 x=y=t=c=0;z=[]                       #initialize everything
 for i in range(n*n-n+2):             #loop n*n-n+2 times which is the numberr of 'o's expected
    c+=i%[~-n,n]<n-1                  #if one cycle has been completed, increase c by 1, if n>1.                                            
    z+=[[x,y]]                        #add [x,y] to z(record the positions of 'o')
    t=max(t,x)                        #trap maximum value of x-coordinate(to be used later while calculatng whole string)
    r=[[2,0],[1,1],[2,0],[1,-1]][c%4] #r gives direction for x and y to move, adjust it as per c i.e. cycles
    x+=r[0];y+=r[1]                   #yield newer values of x and y 
 return '\n'.join(''.join(' o'[[k,j]in z]for k in range(t))for j in range(n)) #place space or 'o' accordingly as per the recorded posititons in z

1
아주 좋은 일입니다. 축하합니다!
Mr. Xcoder

@ Mr.Xcoder 감사합니다. 나는 이것이 어렵다고 말해야한다. 특히 올바른 범위를 식별하는 데 문제가 있었다.
officialaimm


1
215 바이트 , if 2>n:return'o'상당히 중복입니다. c+=i%[~-n,n][2>n]<1대신에 해결 방법을 만들었습니다 c+=i%~-n<1.
Mr. Xcoder

1
죄송 매우 늦게 개선, 195 바이트
씨 Xcoder

1

하스켈 , 197 바이트

a n c=take(2*n)$cycle$c:" "
r i n x y=take(div(3*n)2*(n-1)+1)$(' '<$[1..i])++(cycle$"O "++(a(2*n-i-3)y)++"O "++(a(n+i-2)x))
z n=take n$(r 0 n 'O' ' '):[r i n ' ' ' '|i<-[1..n-2]]++[r(n-1)n ' ' 'O']

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

@Lynn 덕분에 : O지그재그의 수평 세그먼트에서 s 사이 의 공백을 수정 했지만 많은 바이트 가 소요되었습니다 !

몇 가지 설명 :

  • r출력의 행입니다. 0 y y y y y 0 x x x 0 y ...형식, 수 xy 행과 최초에 따라n
  • 상단 행에 대한, x='0'그리고y=' '
  • 중간 행에 대해, x=' '그리고y=' '
  • 맨 아래 행에 대해, x=' '그리고y='0'
  • take(div(3*n)2*(n-1)+1) 올바른 장소에서 무한 행을 자른다
  • 모든 출력에는 when n=1: take n이 경우를 제외하고 하나의 맨 위 행과 맨 아래 행 이 있습니다.

멋지게 골프를 쳤다! 그런 공간을 몇 개 떨어 뜨릴 수 있다고 생각합니다. 그리고 replicate n x교체 할 수 있습니다 x<$[1..n]. 또한 답 O은 지그재그의 수평 세그먼트에서 s 사이 의 공간이 부족합니다 .
Lynn

@Lynn 감사합니다! 가로 세그먼트에 공백이 있으면 내 방법이
번거롭지 만

연산자를 사용하고 불필요한 공백을 제거하면 상당히 많은 비용을 절약 할 수 있습니다 ( 여기 참조) .
ბიმო

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