숫자 삼각형


26

도전:

입력 : 양의 정수n

산출:

범위의 목록을 작성하고 이를 문자열로 결합하십시오 (즉, 은 문자열이됩니다 ).[1,n]n=1312345678910111213

이제이 정수의 접두사 또는 접미사를 사용하여 입력 정수에 따라 다음 4 가지 방향 중 하나를 사용하여 삼각형을 출력합니다.

  • 만약 n0(mod4) 삼각형 모양의 출력을 ◣
  • 만약 n1(mod4) 삼각형 모양의 출력을 ◤
  • 만약 n2(mod4) 삼각형 모양의 출력을 ◥
  • 만약 n3(mod4) 삼각형 모양의 출력을 ◢

예:

입력 : n=13

때문에 131(mod4) , 형상 ◤ 것이다. 가능한 세 가지 유효한 출력은 다음과 같습니다.

12345678910111213    11111111111111111    12345678910111213
1234567891011121     2222222222222222     2345678910111213
123456789101112      333333333333333      345678910111213
12345678910111       44444444444444       45678910111213
1234567891011        5555555555555        5678910111213
123456789101         666666666666         678910111213
12345678910          77777777777          78910111213
1234567891           8888888888           8910111213
123456789            999999999            910111213
12345678             11111111             10111213
1234567              0000000              0111213
123456               111111               111213
12345                11111                11213
1234                 1111                 1213
123                  222                  213
12                   11                   13
1                    3                    3

도전 규칙 :

  • 위의 세 가지 유효한 출력에서 ​​볼 수 있듯이 올바른 모양 만 올바른 순서 로 모든 숫자를 사용하는 것이 중요합니다. 그 외에도 접두사 또는 접미사를 자유롭게 사용할 수 있습니다. 반전 / 반영; 대각선 인쇄; 등. 각 모양에 대해 가능한 6 가지 출력 중 하나가 허용됩니다 ( 모양에 따라 유효한 모든 출력 을 보려면 아래 테스트 사례 참조 ). 이를 통해 회전 내장 언어가있는 언어에서이를 사용할 수 있지만,없는 언어의 경우 접두사를 위에서 아래로 올바른 크기로 사용하거나 두 가지 도형에 접두사를 사용하고 다른 두 가지 도형에 접미사를 사용하는 대체 방법을 사용할 수도 있습니다. . 귀하의 언어에 가장 적합한 출력 옵션을 선택하는 것은 골프 과정의 일부입니다. :)
  • 입력은 양의 정수 여야합니다. 들면 우리는 단순히 출력 .n=11
  • 화면의 어딘가에 올바른 삼각형 (수직 또는 수평 구분 기호없이)을 인쇄하는 한 선행 / 후행 줄 바꿈 / 공백이 허용됩니다.

일반적인 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙으로 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트와 링크를 추가하십시오 (예 : TIO ).
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

입력 : 가능한 모든 유효한 출력 :n=5

12345    54321    12345    54321    11111    55555
1234     5432     2345     4321     2222     4444
123      543      345      321      333      333
12       54       45       21       44       22
1        5        5        1        5        1

입력 : 가능한 모든 출력 :n=6

123456    654321    123456    654321    111111    666666
 12345     65432     23456     54321     22222     55555
  1234      6543      3456      4321      3333      4444
   123       654       456       321       444       333
    12        65        56        21        55        22
     1         6         6         1         6         1

입력 : 가능한 모든 출력 :n=7

      1          1          7          7          7          1
     12         21         67         76         66         22
    123        321        567        765        555        333
   1234       4321       4567       7654       4444       4444
  12345      54321      34567      76543      33333      55555
 123456     654321     234567     765432     222222     666666
1234567    7654321    1234567    7654321    1111111    7777777

입력 : 가능한 모든 출력 :n=8

1           1           8           8           8           1
12          21          78          87          77          22
123         321         678         876         666         333
1234        4321        5678        8765        5555        4444
12345       54321       45678       87654       44444       55555
123456      654321      345678      876543      333333      666666
1234567     7654321     2345678     8765432     2222222     7777777
12345678    87654321    12345678    87654321    11111111    88888888

입력 : 가능한 출력 만 :n=1

1

입력 : 가능한 모든 출력 :n=2

12    21    12    21    11    22
 1     2     2     1     2     1

triangle에 대한 1과 같이 다른 삼각형에 다른 값을 사용할 수 있습니까?
에 무지

불명예의 @Embodimentof 일관성있게 유지하는 한 네 가지 배열의 순서를 변경할 수 있는지 묻고 싶었다고 생각합니다.
Outgolfer Erik

1
인 경우 n==13맨 위 행이 '33333333333333333'(또는 동등하게 '31211101987654321') 될 수 있습니까?
Chas Brown

@EmbodimentofIgnorance 죄송합니다.이 경우에는 아니요라고 대답합니다. 모양과 그에 해당하는 mod 4것은이 도전에 대한 엄격한 쌍입니다. 따라서 네 가지 mod 4경우에 네 가지 모양을 전환하지 못할 수 있습니다 . 그럼에도 불구하고 좋은 질문입니다.
케빈 크루이 센

@ChasBrown 네, 둘 다 괜찮습니다. 대해 세 가지 가능한 예제 만 제공 했지만 테스트 사례 와 같은 6 가지 옵션 은 모두 유효한 출력입니다. n = 5n=13n=5
Kevin Cruijssen

답변:


9

자바 스크립트 (ES6),  93  89 바이트

문자 행렬을 반환합니다.

n=>[...(g=n=>n?g(n-1)+n:'')(n)].map((d,y,a)=>a.map(_=>y-(n&2)*y--<0?' ':d)).sort(_=>-n%2)

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

다른 패턴 (같은 크기) :

n=>[...(g=n=>n?g(n-1)+n:'')(n)].map((_,y,a)=>a.map(d=>y-(n&2)*y--<0?' ':d)).sort(_=>-n%2)

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

댓글

n =>                 // n = input
  [...               // split the result of ...
    ( g = n =>       //   ... a call to the recursive function g, taking n
      n ?            //     if n is not equal to 0:
        g(n - 1)     //       append the result of a recursive call with n - 1
        + n          //       append n
      :              //     else:
        ''           //       stop recursion and return an empty string
    )(n)             //   initial call to g
  ].map((d, y, a) => // for each digit d at position y in this array a[]:
    a.map(_ =>       //   for each character in a[]:
      y -            //     we test either y < 0 if (n AND 2) is not set
      (n & 2)        //     or -y < 0 (i.e. y > 0) if (n AND 2) is set
      * y-- < 0      //     and we decrement y afterwards
      ?              //     if the above condition is met:
        ' '          //       append a space
      :              //     else:
        d            //       append d
    )                //   end of inner map()
  )                  // end of outer map()
  .sort(_ => -n % 2) // reverse the rows if n is odd

모양 요약

아래는 각 에 대한 기본 모양 (중첩 된 map루프에 의해 생성됨 )과 최종 모양 () 다음에 대한 요약입니다 .sortnmod4

 n mod 4  | 0     | 1     | 2     | 3
----------+-------+-------+-------+-------
 n & 2    | 0     | 0     | 2     | 2
----------+-------+-------+-------+-------
 test     | y < 0 | y < 0 | y > 0 | y > 0
----------+-------+-------+-------+-------
 base     | #.... | #.... | ##### | #####
 shape    | ##... | ##... | .#### | .####
          | ###.. | ###.. | ..### | ..###
          | ####. | ####. | ...## | ...##
          | ##### | ##### | ....# | ....#
----------+-------+-------+-------+-------
 n % 2    | 0     | 1     | 0     | 1
----------+-------+-------+-------+-------
 reverse? | no    | yes   | no    | yes
----------+-------+-------+-------+-------
 final    | #.... | ##### | ##### | ....#
 shape    | ##... | ####. | .#### | ...##
          | ###.. | ###.. | ..### | ..###
          | ####. | ##... | ...## | .####
          | ##### | #.... | ....# | #####

1
자세한 설명 감사합니다.
chau giang


7

Japt , 8 바이트

행 배열을 반환합니다.

õ ¬å+ zU

시도 해봐

Kevin 덕분에 2 바이트를 절약했습니다 .

õ ¬å+ zU     :Implicit input of integer U
õ            :Range [1,U]
  ¬          :Join to a string
   å+        :Cumulatively reduce by concatenation
      zU     :Rotate clockwise by 90 degrees U times

1
인가 ú필요? 회전이 암시 적으로 수행하는 것 같습니다.
Kevin Cruijssen

@KevinCruijssen, 흠 ... 그렇습니다. 나는 항상 그것을 잊는다. 거의 사용하지 마십시오 z.
Shaggy

1
글쎄, 나는 전혀 Japt을 모른다. 재미를 위해 패딩없이 출력물이 어떻게 생겼는지 궁금해하고 정확히 똑같이 작동하는 것을 보았습니다 ..;)
Kevin Cruijssen



3

, 17 바이트

Nθ≔⭆θ⊕ιηGLLηη⟲⊗θ‖

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

Nθ

입력 n.

≔⭆θ⊕ιη

에 숫자 1를 연결하여 문자열을 만듭니다 n.

GLLηη

해당 길이의 삼각형을 문자열로 채 웁니다.

⟲⊗θ

삼각형을 시계 반대 방향으로 n*90도 단위로 회전시킵니다 .

시계 방향으로 n*90도 회전하는 삼각형으로 끝나는 모든 것을 반영하십시오 .




3

R , 152 (139) 137 134 바이트

function(n,N=nchar(s<-Reduce(paste0,1:n,'')),A=!n%%4%%3)for(i in 1:N)cat(rep('',(M=c(N-i+1,i))[1+!A]*(n%%4>1)),substr(s,1,M[1+A]),'
')

풀린 코드 :

function(n){
  s = Reduce(paste0,1:n,'')      # concat the digits from 1 to n into a string s

  N = nchar(s)                   # store the length of s

  A = !n%%4%%3                   # A = TRUE if n MOD 4 == 1 or 2 

  for(i in 1:N){                 # for 1 to N (length of s)

    M = c(N-i+1,i)               # store N-i+1 and i into a vector

    nSpaces = M[1+!A]*(n%%4>1)   # if n MOD 4 == 1 or 2 then nSpaces = i else nSpaces = N-i+1, 
                                 # but if n MOD 4 == 0 or 1, then force nSpaces = 0

    nDigits = M[1+A]             # if n MOD 4 == 1 or 2 then nDigits = N-i+1 else nDigits = i

    prfx = rep('',)              # create a character vector repeating '' nSpaces times

    sufx = substr(s,1,M[1+A])    # substring s by taking the first nDigits characters

    cat(pr,su,'\n')              # print prfx and sufx using space as separator for the values 
                                 # contatenation (cat function default) and append a newline
  }

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


... 내가 골프를 타던 날은 아니었다.
주세페

@ 주세페 : 아하 거기에 ... 그리고 당신은 일반적으로 나를 능가 : P
digEmAll


2

PowerShell , 108 바이트

param($n)0..($y=($x=-join(1..$n)).length-1)|%{' '*(0,0,$_,($z=$y-$_))[$n%4]+-join$x[0..($_,$z,$z,$_)[$n%4]]}

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

가장자리는 약간 거칠지 만 작동합니다. 숫자 1을 n문자열로 결합한 다음 0에서 문자열 1의 길이까지 반복합니다. 매번 목록 인덱싱을 사용하여 새 문자열을 슬라이스하는 데 사용되는 올바른 간격 방법 및 숫자 범위로 바꿉니다.



2

05AB1E (레거시) , 14 12 10 바이트

레거시 버전을 다시 쓰기로 사용하면 어떤 이유로 든 매우 느립니다.

Kevin Cruijssen 덕분에 2 바이트 절약

LSηsFRζ}J»

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

설명

L           # push range [1 ... input]
 S          # split to list of individual digits
  η         # calculate prefixes
   sF  }    # input times do:
     R      # reverse list
      ζ     # and transpose it
        J   # join to list of strings
         »  # and join on newlines

암시 적으로 평탄화 되므로 2 바이트를 (으)로 변경 LJη€S하여 저장할 수 있습니다 . LSηS
케빈 크루이 센

@KevinCruijssen : 예, 감사합니다! 나는 그것을 잊었다. 나는 €S잘 작동하지 않았다;)
Emigna



2

R , 175 (172) 154 바이트

function(n)write(c(" ",0:9)[1+(x=utf8ToInt(Reduce(paste0,1:n,""))-47)*!upper.tri(diag(y<-sum(x|1)))["if"(n%%4>1,1:y,y:1),"if"(!n%%4%%3,y:1,1:y)]],1,y,,"")

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

끔찍한 인라인 혼란!

회전 조건을 변경하여 -3 바이트

digEmAll 의 제안 덕분에 -17 바이트 , 골프 후의 다른 바이트


나는이 upper.triangle 접근 방식을 좋아하고 155 바이트 로 단축 될 수 있습니다 ... 아마도 더, 내가 분명 뭔가 빠진 것이 확실합니다 ...
digEmAll

@digEmAll 아, 많이 개선되었지만 여전히 길다 :-(
Giuseppe




1

펄 5, 117 바이트

$p=$_++&2?'/ ':'$/';$s='(.*\d.\n)';$r=$_--&2?$s.'\K$':"^(?=$s)";$_=(join"",1..$_).$/;1while s,$r,'$1=~s/\d'."$p/r",ee

TIO


1

PHP ,116 111 109 바이트

for($m=$l=strlen($s=join(range(1,$n=$argn)));$l--;)printf('%'.($n&2?$m:-$l).'.'.($n-1&2?$m-$l:$l+1)."s
",$s);

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

php -nF입력으로 실행하십시오 STDIN.

$ echo 6|php -nF t.php

123456
 12345
  1234
   123
    12
     1

1

자바 (JDK) , 247 (209) 188 186 160 148 바이트

i->{String s="";int l=0,w;for(;l<i;s+=++l);for(w=s.length(),l=0;l<w;)System.out.printf("%"+(1>i%4/2?1:w)+"s\n",s.substring(0,1>~-i%4/2?w-l++:++l));}

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

-38 bytes@KevinCruijssen 덕분
-21 bytes있도록함으로써 printf패딩을 처리합니다.
-2 bytes교체하기 전에 하위 문자열을 수행하여 l두 위치가 아닌 한 위치에서 증가시킬 수 있습니다.
-26 bytes- printf패딩 을 수행하면 공백으로 가득 찬 문자열이 더 이상 필요하지 않았으며 숫자 문자열이 더 짧은 방식으로 생성 될 수있었습니다.
-12 bytes우리가 이미 가지고있는 완벽하게 서비스 가능한 숫자 문자열의 하위 문자열을 인쇄하는 대신 단일 숫자를 망칠 수 없습니다.

언 골프

input->{
    // Lambda expression with target type of IntConsumer
    String allDigits = "";
    int lineLength, line = 0;

    // Collect a list of all digits in order.
    for (;line < input; allDigits += ++line) {}

    // Save the max length of a line, and create a string of that many spaces.
    for (lineLength=allDigits.length(), line=0; line < lineLength;) {
        System.out.printf(   "%" // construct a format string to handle the padding
                           + (   1 > input%4/2
                               ? 1 // No padding
                               : w // Yes padding
                             )
                           + "s\n"
                         , allDigits.substring( 0
                                              ,   1 > (i-1)%4/2
                                                ? w - l++
                                                : ++l
                                              ) // A string containing only the digit we want.
                         );
    }
}

1
좋은 대답입니다. 골프를 더해야 할 것들이 많이 for(있습니다. 이후의 공백 은 제거 할 수 있습니다. Java 11 이상을 사용할 new String(new char[w=s.length()]).replace('\0',' ')수 있습니다 " ".repeat(w=s.length()). 3 진 검사 주위의 괄호를 제거 할 수 있습니다. 1>(i-1)%4/2일 수 있습니다 1>~-i%4/2. w-1-l++일 수 있습니다 w+~l++. 그리고 바이트 수에서 후미 세미콜론을 세지 않아도됩니다. 모두 결합 된 209 바이트됩니다 .
케빈 크루이 센
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.