数字の三角形


11

クレジット

このコードゴルフの挑戦のインスピレーションについて、ランド・アル・トールの手紙ベースの質問に感謝します。

バックグラウンド

この課題の性質は、ランドが「3文字の三角形」で言及したアルゴリズムに基づいています。

  • それぞれがX、Y、またはZである10文字のシーケンスで開始します。
  • 各行の下に、次の行を作成します。隣接する2つの文字が同じ場合、それらの下に同じ文字を書きます。異なる場合は、その下に3番目の文字を書きます。

次に、10行目に1文字入力されるまで、前の手順を繰り返します。

チャレンジ

上記のアルゴリズムに数学的なスピンをかけます。

  • まず、スペースで区切られた10桁のシーケンスから始めましょう。各シーケンスは1、2、または3です。
  • 各行の下に、次の行を作成します。隣接する2つの数字が同じ場合、それらの下に同じ数字を書きます。異なる場合は、その下に3桁目を記入してください。
  • 最終番号が1つになるまで、前の手順を繰り返します。

したがって、このアルゴリズムに従って1 2 3 3 1 3 1 3 1 2、たとえばrow で始まる場合、次の三角形が生成されます。

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つある場合、勝者はアップ投票の数に基づいて授与されます。
  2. 基本的には11行、19文字の長さです...最終出力のレンダリング方法は完全にあなた次第です:配列、コンソール、ファイル出力、STDOUTなどです。好きな出力方法を使用してくださいあなたの利益のために働きます。出力の唯一のルールは、上記と同様の形式で各行に19文字の11行があることです...
  3. コードに役立つ場合は、数字に区切り文字を使用します...読みやすさが要因になる可能性があることに注意してください。
  4. 愚かな抜け穴はありません
  5. 入力のハードコーディングは許可されていません。このコードの目的は、さまざまな入力で毎回異なる結果を生成するために使用できるようにすることです。1 1 1 1 1 1 1 1 1 1たとえば、ハードコーディングは、アルゴリズムのポイント全体を完全に無効にします。

皆さんが何を思いつくことができるのか楽しみにしています!



1
三角形が中央揃えになっている(したがって読みやすい)場合、セパレータが必要ですか?
ジョンファンミン

1
スペースのないこのように見えます(私の答えにはスペースがあり、10バイトかかります)。
ジョンファンミン

2
許可が与えられました
-WallyWest

1
10桁(または3の累乗より大きい任意の数値1)の文字列の場合、最終桁は文字列の最初と最後の桁から簡単に計算されることに注意してください。他の数字は違いがありません。
ニール

回答:


1

05AB1E32 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]&@@@

各パーティションを取得し、対応する出力を計算します。

ここに関係するトリック。2つの数値を加算し、mod 3を取得し、3からその結果を減算しました。これにより、目的の数値が得られます。(例3-((2 + 1)mod 3)= 3)

NestList[ ... ,9]

上記のプロセスを9回繰り返し、すべての反復を出力として提供します。

Grid[List@*Row/@#]

各反復を行にフォーマットし、すべてを1列(中央揃え)に配置して、三角形を作成します。

#~Total~2

すべての数字の合計を取ります。

{...}~Column~Right

三角形と合計を組み合わせ、全体を右揃えにします(三角形は既に整列されているため、その整列は影響を受けません)。


1
同一の親タイプと異なる親タイプの両方を処理する単一の関数によるインスピレーションを受けたアプローチ...私はそれが好きです!
-WallyWest

3

JavaScript(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
ニール

2

ルビー、134 101バイト

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を待ってください。;)
マーティン・エンダー

実際、GolfScriptソリューションがどのように見えるか知りたいです...;)
WallyWest

ああ、SQLソリューションを投稿するまでですか?;)
WallyWest

1

Python 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

オンラインで試す



0

JavaScriptの(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.