숫자 삼각형


11

신용

이 코드 골프 도전에 영감을 준 Rand Al'Thor의 편지 기반 질문 에 감사드립니다 .

배경

이 도전의 본질은 Rand가 그의 "세 글자로 구성된 삼각형"에서 언급 한 알고리즘을 기반으로합니다.

  • X, Y 또는 Z 인 10 개의 문자 시퀀스로 시작하십시오.
  • 각 행에서 다음과 같이 다음 행을 구성하십시오. 인접한 두 글자가 같으면 그 아래에 같은 글자를 쓰십시오. 다른 경우에는 그 아래에 세 번째 글자를 쓰십시오.

그런 다음 열 번째 문자에 한 글자가 나타날 때까지 이전 단계를 반복합니다.

도전

위 알고리즘에 수학적 스핀을 넣을 것입니다.

  • 공백으로 구분되고 각각 1, 2 또는 3 인 10 자리 시퀀스로 시작해 봅시다.
  • 각 행에서 다음과 같이 다음 행을 구성하십시오. 인접한 두 자리가 같은 경우 그 아래에 같은 자리를 쓰십시오. 다른 경우 그 아래에 세 번째 숫자를 쓰십시오.
  • 최종 번호가 하나가 될 때까지 이전 단계를 반복하십시오.

따라서이 알고리즘에 따라 행으로 시작하면 1 2 3 3 1 3 1 3 1 2예를 들어 다음 삼각형이 생성됩니다.

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1 2 3 3 1 3 1 3 1 2
 3 1 3 2 2 2 2 2 3 
  2 2 1 2 2 2 2 1  
   2 3 3 2 2 2 3   
    1 3 1 2 2 1    
     2 2 3 2 3     
      2 1 1 1      
       3 1 1       
        2 1        
         3         

또한 숫자 삼각형의 모든 자릿수의 합계를 알고 싶습니다.이 숫자를 모두 더한 다음이 열을 11 번째 행에 놓고 첫 번째 행의 마지막 숫자에 오른쪽 정렬하십시오. 따라서 우리의 숫자 삼각형은 다음과 같습니다 (제 예에서 공백은 .문자로 아래에 표시되어 형식을 나타냅니다).

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109

입력 한 문자열 / 배열 등으로 시작할 수있는 코드를 작성하는 것이 어렵습니다. 내 예제에 따라 10 자리 숫자로 만든 다음 알고리즘을 적용하여 숫자 삼각형을 만드는 10 개의 행을 생성 한 다음 11 번째 행은 오른쪽 자리 맞춤으로 모든 자릿수의 합계를 표시합니다.

테스팅

이 문자열의 테스트는 무작위로 생성 한 10 자리 숫자의 문자열 또는 아래 스 니펫에서 생성 된 문자열로 수행 할 수 있습니다.

c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");

$("#btn").click(function(){
  $("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.

규칙

  1. 코드 골프 규칙이 적용되므로 가장 적은 수의 바이트가 문제를 해결합니다. 낮은 점수를 가진 두 항목이있는 경우, 투표 수에 따라 우승자가 수여됩니다.
  2. 우리가 기본적으로 수행 한 것은 11 행, 19 자 길이입니다 ... 최종 출력을 렌더링하는 방법은 전적으로 귀하에게 달려 있습니다 : 배열, 콘솔, 파일 출력, STDOUT 등 원하는 출력 방법을 사용하십시오. 당신의 이익을 위해 일하십시오. 출력의 유일한 규칙은 위와 비슷한 형식으로 각 행에 19 개의 문자가있는 11 개의 행이 있다는 것입니다 ...
  3. 코드에 도움이된다면 숫자 구분 기호를 사용하십시오 ... 가독성이 기여 요인 일 수 있음을 기억하십시오.
  4. 바보 같은 허점이 없습니다 .
  5. 입력의 하드 코딩은 허용되지 않습니다. 이 코드의 목적은 다양한 입력으로 매번 다른 결과를 생성하는 데 사용될 수 있도록하는 것입니다. 1 1 1 1 1 1 1 1 1 1예를 들어 하드 코딩은 알고리즘의 요점을 완전히 무효화합니다.

당신이 할 수있는 것을 기대해주세요!



1
삼각형이 가운데에 정렬되어 있으면 읽을 수있는 구분 기호가 필요합니까?
JungHwan Min

1
공백 없는 것처럼 보입니다 (제 대답에는 공간이 있으며 10 바이트가 걸립니다).
JungHwan Min

2
권한 부여
WallyWest

1
10의 문자열 (또는 3의 거듭 제곱보다 큰 숫자 1)의 경우, 마지막 숫자는 문자열의 첫 번째 숫자와 마지막 숫자에서 사소하게 계산됩니다. 다른 숫자는 차이가 없습니다.
Neil

답변:


1

05AB1E , 32 26 바이트

DvÐOˆðýðN×.ø,ü+3%3^}\¯O19j

설명

D                 # duplicate input
v                 # for y,N in input,len(input): (10 times do)
 Ð                # triplicate current list
 Oˆ               # sum one copy and add it to global array
 ðý               # merge one copy on spaces
   ðN×.ø          # surround it with N spaces
        ,         # and print it
 ü+               # reduce one copy by addition
   3%             # modulus 3
     3^           # XOR 3
                  # this is the list sent to the next iteration
}                 # end loop
\                 # drop empty list left over from last iteration of loop
 ¯O               # sum the global array giving the triangles total sum
   19j            # join with spaces up to 19 chars

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


7

Mathematica, 104 97 90 94 바이트

{Grid[List@*Row/@#],#~Total~2}~Column~Right&[NestList[3-Mod[+##,3]&@@@Partition[#,2,1]&,#,9]]&

설명

Partition[#,2,1]

입력을 길이 2, 오프셋 1 파티션으로 분할합니다.

3-Mod[+##,3]&@@@

각 파티션을 가져와 해당 출력을 계산합니다.

여기에 관련된 트릭. 두 숫자를 더하고 mod 3을 취하고 그 결과를 3에서 뺍니다. 원하는 숫자를 얻습니다. (예 : 3-((2 + 1) mod 3) = 3)

NestList[ ... ,9]

모든 반복을 출력으로하여 위의 프로세스를 9 번 반복합니다.

Grid[List@*Row/@#]

각 반복을 행으로 형식화하고 전체를 하나의 열 (중앙 정렬)에 놓고 삼각형을 만듭니다.

#~Total~2

모든 숫자의 총계를 취하십시오.

{...}~Column~Right

삼각형과 총계를 결합하고 모든 것을 오른쪽으로 정렬하십시오 (삼각형은 이미 정렬되어 있으므로 정렬에 영향을 미치지 않습니다).


1
동일한 부모 유형과 다른 부모 유형을 모두 처리하는 단일 기능으로 영감을 얻은 접근 방식 ... 마음에 듭니다!
WallyWest

3

자바 스크립트 (ES6) 143 142 바이트

@Neil 덕분에 1 바이트 절약

a=>a.map((_,i)=>(q=" ".repeat(i))+(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+q,x=0).join`
`+`
`+(" ".repeat(18)+x).slice(-19)

다양한 부분을 결합하려고했지만 5 바이트가 더 길어졌습니다.

a=>[...a.map((_,i)=>(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+" ".repeat(i),x=0),x].map(q=>(" ".repeat(18)+q).slice(-19)).join`
`

훌륭한 일! JHM의 트릭 3-((x+y)%3)이이 코드를 줄이는 데 도움이 될 수 있습니까?
WallyWest

2
아니. p^c||p이다 이미 상당히 짧은 :-)
ETHproductions

자, 내가 어떻게 그것을 그리워 했습니까? 물론이야! XOR 기능은 여기에서 잘 작동합니다!
WallyWest

1
XOR ?! 나는 그것을 생각할 수 없었다. 그 존재는 슬프게도, XOR를 사용하여 만드는 말했다 이상 내 코드 : P
JungHwan 최소

들어 i?p^(p=c)||p:c당신이 사용할 수있는 i&&p^(p=c)||c?
Neil

2

루비, 134101 바이트

JHM의 모듈로 트릭을 사용합니다.

->a{b=*a
(0..8).map{|i|[" "*i,a=a.each_cons(2).map{|x,y|b<<n=3-(x+y)%3
n}]*" "}<<"%19d"%b.reduce(:+)}

eval.in에서 참조하십시오 : https://eval.in/649993


2

CJam ,  44  40 바이트

l~{S*\_S*\2ew{:+3%3^}%2$N@}A%_s:~:+sJSe[

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

설명

l~       e# Read and evaluate input.
{        e# Map this block over i in the range [0 1 ... 9].
  S*     e#   Get a string of i spaces (the indentation).
  \_     e#   Swap with the current line of trits and duplicate it.
  S*     e#   Join the trits with spaces.
  \2ew   e#   Swap with the other copy of the trits and get all consecutive pairs.
  {      e#   Map this block over the pairs...
    :+   e#     Sum the pair.
    3%   e#     Modulo 3.
    3^   e#     XOR 3.
         e#     This expression (x+y)%3 ^ 3 computes the required mapping.
  }%     e#   Now this is the next line.
  2$     e#   Copy the indentation (to pad the lines to equal length).
  N      e#   Push a linefeed.
  @      e#   Pull up the next line.
}A%      e# The result of this is a nested array whose string representation is
         e# the required triangle.
_s       e# Duplicate and flatten into a string.
:~       e# Eval each character which gives a list of all the trits.
:+       e# Sum that.
s        e# Turn the sum into a string.
JSe[     e# Left-pad it with spaces to width 19.

언제나 그렇듯이 매우 인상적입니다! 당신은 지금까지 선두에 있습니다!
WallyWest

1
@WallyWest 감사합니다. :) Pyth, Jelly 및 MATL을 기다리십시오. ;)
Martin Ender

실제로 GolfScript 솔루션이 어떻게 보일지 궁금합니다.;)
WallyWest

오, SQL 솔루션을 게시 할 사람이 있습니까? ;)
WallyWest

1

파이썬 2, 164 바이트

비교적 간단한 반복 솔루션입니다.

L=input()
s=0
for i in range(len(L)):
    print" "*-~i+" ".join(`L`[1::3]);s+=sum(L);N=L;L=[]
    for a,b in zip(N,N[1:]):L+=[list({1,2,3}-{a,b}),[a]][a==b]
print"%19s"%s

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


1

PHP, 143 바이트

<?for($t=$_GET[t];$i<181;$s+=$v,$i+=2)$t[$i+20]=($v=$t[$i])*($z=$t[$i+2])>0&$i!=18?($v+$z)%3^3:" ";echo chunk_split($t.str_pad($s,8," ",0),19);

0

자바 스크립트 (ES6), 112 (100) 96 바이트

배열을 입력으로 취하고 쉼표로 구분 된 삼각형을 재귀 적으로 만듭니다.

f=(s,p=`
`,S=0)=>p+(s[0]?s+f(s.map((v,i)=>(S+=v,v^s[i-1]||v)).slice(1),p+' ',S):(p+S).slice(-9))

console.log(f([1,2,3,3,1,3,1,3,1,2])); // reference example
console.log(f([3,3,2,1,3,1,2,1,2,1])); // random example
console.log(f([1,1,1,1,1,1,1,1,1,1])); // all ones (test case for sum < 100)

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