삼항 삼각형


22

이것의 아이디어는 주로 BIO 2017 q1 에서 나온 것 입니다. 많은 사람들이 그것을 좋아하는 것처럼 보이기 때문에 이진 시퀀스 도전 에서이 도전을 게시 할 아이디어를 얻었 습니다.

또한 이것은 샌드 박스에 게시하지 않고 게시 한 첫 번째 과제입니다. 아무도 좋아하지 않으면 삭제하겠습니다.

규칙

3 진 (기수 3)으로 일련의 자릿수를 취하십시오. 이는 선행 0의 수와 함께 문자열, 배열 또는 숫자 값일 수 있습니다.

삼각형의 각 행에 대해 마지막 행에 숫자가 하나만 나타날 때까지 아래 행이 생성됩니다. 다른 두 자리 아래의 숫자를 찾으려면 위의 두 자리 숫자가 같으면 두 자리 숫자와 동일합니다. 그렇지 않으면 둘 중 하나와 다른 숫자가됩니다. 예를 들면 다음과 같습니다.

0 0 1 2 0 1 2 2
 0 2 0 1 2 0 2
  1 1 2 0 1 1
   1 0 1 2 1
    2 2 0 0
     2 1 0
      0 2
       1

마지막 행만 반환해야합니다.

코드를 짧게 만드십시오.

테스트 사례

0 -> 0
11 -> 1
10 -> 2
000 -> 0
012 -> 1
21102 -> 2
201021 -> 1
111111 -> 1
1020202020 -> 2
0212121210 -> 0

답변:


9

껍질 , 9 바이트

%3←ΩεẊo_+

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

설명

주요 아이디어는 f (a, b) = (-ab) % 3 으로 두 자리를 1로 매핑하는 것을 계산하는 것입니다 . 골프 목적으로 모듈러스를 끝까지 지연시킬 수 있습니다.

   Ωε       Apply the following function until the list is only one
            element in length.
     Ẋo       Apply the following function to pairs of adjacent values.
       _+       Add the two values and negate the result.
  ←         Take the first (and only) element of this list.
%3          Take it modulo 3.

원칙적으로 각 요소에 해당 이항 계수를 곱하고 짝수 길이 목록의 경우 합계에 -1 을 곱하여 결과를 직접 계산할 수도 있지만 더 적은 바이트로 수행하는 방법을 모르겠습니다.


6

MATL , 10 바이트

td"HYCEsI\

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

각 자릿수 쌍에 대해 코드는 합 모듈로 3의 두 배를 계산합니다. 프로세스는 입력 길이에서 1을 뺀 수만큼 반복됩니다.

t        % Implicit input: array of length n. Duplicate
d        % Consecutive differences. Gives an array of length n-1
"        % For each (that is, do n-1 times)
  HYC    %   2-column matrix where each column is a sliding block of length 2
  E      %   Times 2, element-wise
  s      %   Sum of each column
  I\     %   Modulo 3
         % Implicit end. Implicit display

3

파이썬 2 , 48 바이트

f=lambda a,*l:-(f(*l)+f(a,*l[:-1]))%3if l else a

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

서브리스트에서 반복하여 첫 번째 요소와 마지막 요소를 각각 삭제합니다.

실제로 압축을 풀 수 있다면 파이썬 3에서는 더 깨끗할 것 f=lambda a,*b,c:...입니다.




2

하스켈 , 36 바이트

f[a]=a
f(h:t)=mod(-f t-f(h:init t))3

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

보다 대칭 적으로 1 바이트를 절약합니다.

f[a]=a
f l=mod(-f(tail l)-f(init l))3

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

아이디어는 간단합니다. 첫 번째 요소와 마지막 요소를 각각 삭제하는 하위 목록에서 함수를 재귀 적으로 계산하고 이들을 결합합니다 \a b -> mod(-a-b)3. 이것은 zipWith이 기능 보다 짧아 보인다 .

하스켈 , 44 바이트

f[a]=mod a 3
f l=f$zipWith((-).(0-))l$tail l

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



2

J, 23 15 바이트

3&(|2+/\-)~<:@#

@ 마일 덕분에

오래된 해결책 :

3|2&(-@+/\)^:(#>1:)^:_]

Martin Ender의 솔루션에서 영감을 얻었습니다.

설명

3|2&(-@+/\)^:(#>1:)^:_]    | Whole program
                      ]    | Seperates the argument from the _ (infinity)
           ^:(#>1:)^:_     | Do while the length is greater than one
  2&(-@+/\)                | Inverse of the sum of adjacent elements
3|                         | Modulo 3

2
15 3&(|2+/\-)~<:@#
마일

@ 마일, 하, 난 단지 19 바이트에 이것을 게시하려고했다 3|((2<.#)-@+/\])^:_-당신의 것이 정말 좋습니다.
요나

0

배치, 122 바이트

@set/an=2,s=i=l=0
@for %%e in (%*)do @set/al+=1,n^^=3
@for %%e in (%*)do @set/as+=%%e*n,s%%=3,n*=l-=1,n/=i+=1
@echo %s%

이항 확장을 사용합니다. @MartinEnder 지적한 바와 같이 (제 루프 카운트) 값의 개수가 짝수 인 경우, 합이므로 (모듈 3) 무효화되어야 n에 설정된 하나 1또는 2그에. 그런 다음 두 번째 루프는 이항 계수를 통해 합계를 계산합니다.



0

APL + WIN, 30 28 바이트

Uriel은 2 바이트를 절약했습니다.

n←⎕⋄¯1↑∊⍎¨(⍴n)⍴⊂'n←3|3-2+/n'

설명:

n←⎕ Prompt for screen input of the form: 0 0 1 2 0 1 2 2

'n←3|3-2+/n' Successive rows are 3 mod 3 minus successive digit pairs.

(⍴n)⍴⊂ Create a nested vector of the row code, one element per row. 

¯1↑∊⍎¨ Execute each element of row code, flatten result and take final value.

이것은 한 줄에 APL로 루핑 코드를 작성하는 한 가지 방법입니다.


당신은 가장 오른쪽 필요하지 않습니다3|
Uriel

@ 우리엘. 감사.
Graham

0

자바 스크립트 (ES6), 58 바이트

f=s=>s[1]?f(s.replace(/.(?=(.?))/g,(a,b)=>b&&(6-a-b)%3)):s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.