数字の三角形


26

チャレンジ:

入力:正の整数n

出力:

範囲でリストを作成し、それを文字列に結合します(つまり、が文字列になります)。[1,n]n=1312345678910111213

次に、この文字列のプレフィックスまたはサフィックスを使用して、入力整数に基づいて次の4つの方向のいずれかで三角形を出力します。

  • もしn0(mod4)、三角形状の出力を◣
  • もしn1(mod4)、三角形状の出力を◤
  • もしn2(mod4)、三角形状の出力を◥
  • もしn3(mod4)、三角形状の出力を◢

例:

入力:n=13

ので、131(mod4)、形状が◤あろう。ここでは、3つの有効な出力が考えられます。

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

チャレンジルール:

  • 上記の3つの有効な出力を見るとわかるように、正しい形状とすべての数字を正しい順序で使用することが重要です。それとは別に、プレフィックスまたはサフィックスを自由に使用できます。反転/反映; 斜め印刷; など。各シェイプの6つの可能な出力のいずれかが許可されます(シェイプに基づくすべての有効な出力を確認するには以下のテストケースを参照してください)。これにより、回転ビルトインを使用する言語で使用できますが、上から下に正しいサイズのプレフィックスを使用するか、2つの形状のプレフィックスを使用して他の2つの形状のサフィックスを使用する代替アプローチを使用することもできます。あなたの言語に最適な出力オプションを選択することは、ゴルフのプロセスの一部です。:)
  • 入力は正の整数であることが保証されています。以下のため、我々は単に出力。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

differentの1など、さまざまな三角形に他の値を使用できますか?
無知の具体化

@EmbodimentofIgnorance残念な例です。それが仕様にあるからです。一貫性を保つ限り、4つのアレンジメントの順序を変更できるかどうか尋ねたかったと思います(それはノーになると思います)。
エリック・ザ・アウトゴルファー

1
の場合n==13、最上位の行を'33333333333333333'(または同等に'31211101987654321')にできますか?
チャスブラウン

@EmbodimentofIgnorance申し訳ありませんが、この場合はノーと言います。形状とそれに対応するmod 4ものは、この課題に対する厳密なペアです。したがって、4つのmod 4ケースの4つの形状を切り替えることはできません。しかし、それでも良い質問です。
ケビンクルーッセン

@ChasBrownはい、両方とも大丈夫です。 3つの可能な例を挙げましたが、6つのオプション(テストケースなど)はすべて有効な出力です。n = 5n=13n=5
ケビンクルーイッセン

回答:


9

JavaScript(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
詳細をご説明いただきありがとうございます。
チャウ


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
であるú必要?回転は暗黙的にこれを行うようですか?
ケビンクルーッセン

@KevinCruijssen、うーん...そうです。私はいつもそれを忘れています。めったに使用できませんz
シャギー

1
まあ、私はJaptをまったく知りません。出力は楽しみのために、パディングなしでどのように見えるかだけ興味があった、とのこぎりは、それはまったく同じ働いていた。..;)
ケビンCruijssen



3

、17バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

入力n

≔⭆θ⊕ιη

数字1をに連結して文字列を作成しますn

GLLηη

その長さの三角形を文字列で塗りつぶします。

⟲⊗θ

三角形を反時計回りにn*90度単位で回転させます。

すべてを反映し、その結果、時計回りにn*90角度で回転する三角形になります。




3

R152の 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
  }

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


...明らかにゴルフの日ではありませんでした。
ジュゼッペ

@ジュゼッペ:あぁあそこに行って...そして、あなたはいつも私を凌gしていた: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

暗黙的にフラット化さLJη€SれるためLSη、に変更する2バイトを保存できますS
ケビンクルーイッセン

@KevinCruijssen:そうそう、ありがとう!私はそれを忘れていました。私は€Sこれを試してみましたが、うまくいきませんでした;)
Emigna



2

R175の 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バイト、さらにゴルフをした後のもう1バイト


Iこのupper.triangleアプローチのようにしてに短縮することができます155バイト ...多分もっと、私は...私は何かを明らかに欠けていると確信している
digEmAll

@digEmAllああ、はるかに改善されたが、それでも長い:-(
ジュゼッペ






1

JAVA(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パディング
-21 bytesprintf処理できる@KevinCruijssenに感謝します。
-2 bytes置換前に部分文字列を実行することで、l2つではなく1つの場所でインクリメントできます。
-26 bytes- printfパディングを行うと、スペースでいっぱいの文字列は不要になり、数字の文字列は明らかに短い方法で生成できました。
-12 bytes私たちがすでに持っている完全にサービス可能な数字列の部分文字列を印刷する代わりに、1桁の数字をいじらないことによって。

非ゴルフ

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())。三項チェックの周りの括弧を削除できます。1>(i-1)%4/2することができます1>~-i%4/2w-1-l++することができますw+~l++。また、バイトカウントの末尾のセミコロンをカウントする必要はありません。結合されたすべてが209バイトになります
ケビンクルーッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.