三面三角形


22

このアイデアは、主にBIO 2017 q1からのものです。多くの人がそれを気に入っているようだったので、このチャレンジをBinary Sequencesチャレンジから投稿するアイデアを得ました。

また、これはサンドボックスに投稿せずに投稿した最初の課題です。誰も気に入っていない場合は削除します。

ルール

3進数(基数3)の一連の数字を取り込みます。これは、文字列、配列、または先行ゼロの数と一緒の数値として可能性があります。

三角形の各行について、最後の行に1桁しか表示されなくなるまで、以下の行が生成されます。他の2つの数字の下にある数字を見つけるために、数字は、上の2つの数字が等しい場合、その上の2つと同じになります。それ以外の場合は、どちらにも等しくない数字になります。以下に例を示します。

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として2桁のマッピングを計算することです。ゴルフの目的では、モジュロを最後まで遅らせることができます。

   Ωε       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を法とする合計の2倍を計算します。このプロセスは、入力の長さから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




2

Haskell、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です。

Haskell、44バイト

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

オンラインでお試しください!



2

J、23 15バイト

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

@milesに感謝

古いソリューション:

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

マーティン・エンダーのソリューションに触発された:

説明

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+/\-)~<:@#
マイル

@miles、はい、私はちょうどこれを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それに応じて設定されます。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で1行でループコードを記述する1つの方法です。


右端は必要ありません3|
Uriel

@ウリエル。ありがとう。
グラハム

0

Javascript(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.