印刷番号の三角形


25

numberを指定するNと、NxN個の直角三角形が出力iされiます。各行には、までの数字が入力されます。

n = 0

(出力なし)

n = 4

1
1 2
1 2 3
1 2 3 4

n = 10

1
1 2
1 2 3
.
.
.
1 2 3 4 5 6 7 8 9 10

(アライメントは不要です)

n = N

1
1 2
1 2 3
.
.
.
1 2 3 4 .... N

各行の末尾に後続スペースはありません。

最小バイト数が優先され、標準の抜け穴は許可されません。


出力は入れ子になった数字のリストにできますか?
seequ

n = 0、およびn> 9の場合の動作はどうなりますか?
freekvd

@Sieg確かに、出力が正しい限り。
タンWS

@freekvd 0ために必要な書式Nのための出力、> 9特別な存在しない
タンWS

ああ、あなたは私の提出物を壊した。
できるだけ早く

回答:


17

ジョー5 3バイト(-tフラグの場合は+2または+3 )

まあ、どうやら私はジョーの可能性をフルに活用しなかったようだ。これは、最初にこれを投稿したときに可能だった。

\AR

ここでRは、0〜nの範囲を排他的に指定します。次に\A、連続するプレフィックスを取得します(A恒等関数です)。例:

-tフラグ(注:これでもフラグなしで今標準出力されます):

   (\AR)5
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
   \AR5
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
   \AR2
0
0 1
   \AR1
0
   \AR0

それなしで:

   \AR5
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
   (\AR)5
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
   \AR2
[[0], [0, 1]]
   \AR1
[[0]]
   \AR0
[]

ルールが少し変わった。私の古いコードはN = 0で正しく動作しませんでした。また、出力は単なるネストされたリストである-t可能性があるため、ドロップできます。

1R1+R

ここで、Rn0〜nの範囲を排他的に指定します。0を指定すると、空のリストが返されます。 1+その範囲のすべての要素に1を追加します。1R値を1〜xの範囲にマッピングします。空のliatsは、マップされると、空のリストを返します。

出力例:

   1R1+R0
[]
   1R1+R5
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]

更新:何かに気づきました。この関数は、ランク0の要素に自動的にマッピングされます。次の例は-tフラグ付きで実行されます。

   1R1+R3 5 8
1
1 2
1 2 3

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8

古い:5バイト(-tフラグ付き)

1R1R

これは、数値を受け取り、1〜N(1Rn)のリストを作成し、それらの値を前の範囲にマッピングして、範囲1〜Nの各アイテムに1〜xの範囲を与える匿名関数です。

この-tフラグは、出力をJのようなテーブルとして提供します。

   1R1R5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

注:言語は非常に新しく完全ではありませんが、この課題の前に最新バージョンがリリースされました。


4
それで、Jはアレイベースの課題で優位性を得るのに十分ではなかったのですか?:D-
オプティマイザー

4
@Optimizer最適化は重要です。
-seequ

4
突然、私が最も投票した答えは、私が最も時間を費やしなかったものです。不正。
-seequ

1
ジョーはあなたの平均的なジョーではないと思います
ジャスティン

10

Pythonの3、48の 45バイト

f=lambda n:n and[f(n-1),print(*range(1,n+1))]

副作用の完全な。


2
入れ子になった無。今ではねじれています。
seequ

これは気の利いたトリックです。関数をの前に置いprintprintsを逆順に実行します。
xnor

8

APL、5

⍪⍳¨⍳⎕

ベクトル1..nを作成し、要素ごとに別のそのようなベクトルを作成します。

次に、⍪はすべてのベクトルから列を作成します。これにより、末尾の空白の問題を回避できます。

tryapl.orgで試してください


古いソリューション:

{⎕←⍳⍵}¨⍳⎕

ベクトル1..nを作成します

{⎕←⍳⍵}は、各(¨)要素に対してベクトル1..nを個別の行に出力する関数です

残念ながら、これはtryapl.orgで試すことはできません。、←はそこでは機能しないからです。


どの行にも末尾のスペースがあってはなりません。
-randomra

ああありがとう、私はそれを見逃した。間もなく修正されます
モリスズッカ

APLが解決策になることはわかっていました
コナーオブライエン



6

PHP、53バイト

編集2:Ismael Miguelは、関数を定義する代わりに入力から読み取ることを提案したため、PHPのスコアは53バイトになりました。

for($a=1;@$i++<$n=$argv[1];$a.=" ".($i+print"$a\n"));

また、エラー(52バイト)を無視するようにPHPが構成されている場合は、改善できます。

for($a=1;$i++<$n=$argv[1];$a.=" ".($i+print"$a\n"));
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));

編集:オースティンはコメントで60バイトのバージョンを提案しました:

function f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}

PHPエラー(59バイト)を表示しない場合は改善できます。

function f($n){for($a=1;$i++<$n;$a.=" ".($i+print"$a\n"));}

$a印刷される次の行を格納し、印刷されるたびにスペースと次の番号(print常に戻る1)が連結されます。


再帰関数(65バイト):

function f($n){$n>1&&f($n-1);echo implode(' ',range(1,$n))."\n";}
function f($n){$n>1&&f($n-1);for(;@$i++<$n;)echo$i,' ';echo"\n";}   // Using @ to hide notices.

エラー報告を無効にした、より短い再帰関数(64バイト):

function f($n){$n>1&&f($n-1);for(;$i++<$n;)echo$i,' ';echo"\n";}

エラー報告を無効にし、実際の出力の前に空行を追加した、さらに短い再帰関数(62バイト):

function f($n){$n&&f($n-1);for(;$i++<$n;)echo$i,' ';echo"\n";}

楽しみのために、非再帰的な機能:

function f($n){for($i=0;$i<$n;print implode(' ',range(1,++$i))."\n");}    // 70 bytes
function f($n){for(;@$i<$n;print implode(' ',range(1,@++$i))."\n");}      // 68 bytes, hiding notices.
function f($n){for(;$i<$n;print implode(' ',range(1,++$i))."\n");}        // 66 bytes, error reporting disabled.

2
45バイト:for($a=1;@$i<$n;$a.=" ".(@++$i+print"$a\n"));
オースティン

@オースティン:私は、コードが入力から読み取る完全なプログラムまたは関数でなければならないというコメントを読みました。非常に素晴らしいトリック、それはビット/バイトによって改善することができます:for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));(44バイト)
ブノワEsnard

ああ、それならfunction f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}60バイトであると思います。
オースティン

確かに。ソリューションを追加するために回答を編集しても大丈夫ですか?
ブノワエスナード

1
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));->これを試してください(完全なコード、urlパラメーターnと数字を使用)
Ismael Miguel

5

CJam、13 12バイト

ri{),:)S*N}/

仕組み

ri{       }/     "Run the block input number of times with iteration index from 0 to N-1";
   )             "Increment the iteration index (making it 1 to N)";
    ,            "Get an array of 0 to iteration index";
     :)          "Increment each of the above array members by 1";
       S*        "Join all above array numbers with space";
         N       "Add a new line. After all iterations, things are automatically printed";

こちらからオンラインでお試しください


4

Pyth、9バイト

VQjdr1hhN

これはもっと短くできると本当に思ったが、そうは思えない。

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

            Q = input()
VQ          For N in [0, 1, ..., Q-1]:
    r1hhN       create list [1, ..., N+1+1-1]
  jd            print joined with spaces

1
代替9: VQaYhNjdYaリストのみを返した場合、VQjdaYhN8のようになります。
Sp300015年

2
a簡単に追加リストを返すために使用されます。
オプティマイザー

私はPythに詳しくないので、その理由を詳しく説明していただけますかN+1+1-1
Seequ

1
@Sieg rはPython範囲関数であるため、-1(r1Nリストを作成します[1, 2, ..., N-1])。しかし、ループのN番目の繰り返しでは、リスト[1, 2, ..., N+1]が必要なので、に追加2する必要がありNます。r1hhNに直接変換しrange(1, N+1+1)ます。別の可能性はr1+N2range(1, N+2))です。
ジャクベ

またはでもmhdhN、それは完全に異なるアプローチです。
寂部

4

JavaScript(ES6)49 52

このような単純なタスク、これをJSで短くすることができるのだろうか(更新:はい、再帰を使用して)

再帰49

f=n=>alert((r=w=>n-i++?w+'\n'+r(w+' '+i):w)(i=1))

反復52

f=n=>{for(o=r=i=1;i++<n;o+='\n'+r)r+=' '+i;alert(o)}

これはどこでテストできますか?私はこれを受け入れる任意ES6の遊び場を見つけるように見えるカント
クリストファーのSalI-Storgaard

@ KristofferSall-Storgaard FirefoxはデフォルトでES6をサポートしています。Firefoxコンソール。
オプティマイザー

4

Java、85 84バイト

これはJavaでは驚くほど短いです。

void a(int a){String b="";for(int c=0;c++<a;System.out.println(b+=(c>1?" ":"")+c));}

インデント:

void a(int a){
    String b="";
    for(int c=0;
        c++<a;
        System.out.println(
                b+=(c>1?" ":"")+c
        ));
}

Bigtoes / Geobitsのおかげで1バイト


あなたは移動することによって、1を保存することができますb+=...にをprintln(b+=...)
ジオビット

3

プロローグ-119

h(N):-setof(X,(between(1,N,K),setof(Y,between(1,K,Y),X)),[L]),k(L),nl,fail.
k([A|B]):-write(A),(B=[];write(" "),k(B)).

3

Python 2- 62 54 65バイト

def f(n):
 for x in range(n):print' '.join(map(str,range(1,x+2)))

番号nは変数への初期化ではなく、プログラムへの入力として指定する必要があります。
ズガルブ

ヒントをありがとう。それについてはわかりませんでした。
ペップ

2
申し訳ありませんが、私はより明確にすべきでした。私が意味することは、あなたが実際に定義しなければならないということであるNことによってN=input()、あなたのプログラムは以下のような実行できるように、または類似した何か。ここではトピックに関するメタ議論があります。
ズガルブ

だからこれは正しいでしょう?
ペップ

よさそうだ!
ズガルブ

3

J、9文字

暗黙の単項動詞として。

[:":\1+i.
  • i. y–から0までの数字y - 1
  • 1 + i. y–から1まで の数字y
  • ": yy文字列として表されるベクトル。
  • ":\ yy文字列として表される各プレフィックス。
  • ":\ 1 + i. y–から1までの数字の各プレフィックスは、y文字のマトリックスとして表されます。

これは非常に賢い方法です。+1
seequ

これはよりJ風ですが、各行の末尾にスペースがないというルールに違反していませんか?
マイル

@miles確かにそうです!それ以外は非常に複雑です。
-FUZxxl

3

> <>(魚)40 37 + 3 = 40バイト

&1>:&:&)?;1\
(?v:n" "o1+>}:{:@
ao\~1+

繰り返しますが、別の番号印刷演習では> <>は適切に機能します。-v入力用のフラグで実行します。例えば

py -3 fish.py -v 4

説明

&               Put n in register
1               Push 1 (call this "i")

[outer loop]

:&:&)?          If i > n...
;                 Halt
1                 Else push 1 (call this "j")

[inner loop]

}:{:@(?         If j > i...
~1+ao             Pop j, print newline, increment i and go to start of outer loop
:n" "o1+          Else print j, print a space, increment j and go to start of inner loop

3

C(ループなし、ええ!)-72バイト

b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}

これにより、r(n)この方法で使用できる関数が作成されます。

main(){ r(5); }

tutorialspoint.comで実際にご覧ください

簡単に説明できるいくつかのトリックが必要です。大幅に改善できると思います。


1
実際に、それはあなたが10で「「32とし、」」置き換えることにより、72バイトに、それを削減\ nはできる、しかし75のバイトではなく74です:b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}
FatalSleep

1
かなりいいトリック、ありがとう!
A.ブレスト

ありがとう!私はCカテゴリーであなたに1つにベストを尽くしましたが、私は何も短くすることができませんでした!そこで、代わりにあなたのものを短くすることにしました。
FatalSleep

64バイトのb(n,c){n&&b(n-1,32)^printf("%d%c",n,c);}r(n){n&&r(n-1)^b(n,10);} Wandbox
o79y

2

Python 2〜72

>>> def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
... 
>>> p(5)
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

このサイトの回答については、完全なプログラムまたは機能を作成する必要があります。そして、結果を標準出力に出力するか、関数から返す必要があります。Nは、変数として事前定義されているのではなく、入力から読み取るか、関数パラメーターとして取得する必要があります。
jimmy23013

@ user23013 OK、修正済み!
Kasramvd

関数定義はバイトカウントに含める必要があるため、これは61とは思いません。おそらく、関数をのような短い名前で呼び出すのが一番の関心事pです。別のノートでは、次の2つのスペース削除することができます-との間に1 print'\n'の間の他の)))for
Sp3000

@ Sp3000 OK、ご清聴ありがとうございました!修正!;)
Kasramvd

72:def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
seequ

2

Perl、28

stdinからパラメーターを読み取ります。

@x=1..$_,print"@x
"for 1..<>

コマンドラインから:

perl -E'$,=$";say 1..$_ for 1..<>'

しかし、今ではそれを数える方法はありません(おそらく25〜29)。


1

Python

import string
N,s=int(input()),list(string.digits)
for i in range(1,N+1):
    print(' '.join(s[1:i+1]))

1
N> = 10の場合、これは失敗しませんか?
seequ

@Siegはい、そうです。私はPythonを学んだだけで、intのリストを文字列のリストに変換する方法を探していました。
バッカスビール

63バイト:for i in range(int(input())):print(' '.join("123456789"[:i+1]))-文字列はリストとして扱われることに注意してください。
seequ


1

クリップ、16

Jm[ijkw,1iwS},1n

説明

J                   .- join with newlines                           -.
 m[i        },1n    .- map numbers from 1 to numeric value of input -.
    jkw   wS        .- join with spaces                             -.
       ,1i          .- numbers from 1 to index                      -.

1

行く、 93 81 78 93 90バイト

func r(n int)(s string){s=string(n+48);if n!=1{s=r(n-1)+" "+s};println(s);return}

現在の無料

func r(n int) (s string) {
    // Convert n to a string, we do not have to initialize s since
    // we hijacked the return value.
    // Numbers in the ascii table starts at 48
    s = string(n | 48)
    // Unless we are on our last iteration, we need previous iterations,
    // a space and our current iteration
    if n != 1 {
        // Collect the result of previous iteration for output
        s = r(n-1) + " " + s
    }
    println(s)
    // We can use a naked return since we specified the
    // name of our return value in the function signature
    return
}

N> 9を処理する必要がある場合は、78バイトで次を使用できますが、fmtパッケージをインポートする必要があります。

func r(n int)(s string){s=Sprint(n);if n!=1{s=r(n-1)+" "+s};Println(s);return}

importステートメントを含めると、最初の時点に戻ります 93 92 90バイト

import."fmt";func r(n int)(s string){s=Sprint(n);if n>1{s=r(n-1)+" "+s};Println(s);return}

ここでオンラインでテストします:http : //play.golang.org/p/BWLQ9R6ilw

バージョンfmtはこちらです:http : //play.golang.org/p/hQEkLvpiqt


私は確かに私は、文字列のキャストについてはどのように感じないんだけど、バイト配列にそれを回すためにあらゆる試みはちょうどそれが長くなります
クリストファーのSalI-Storgaard

主な問題は、n> 9では機能しないことです。ただし、に変更する!=こと>でバイトを保存できます。
ジオビット

@Bigtoes、今修正、import声明を数えるかどうかわからない
クリストファーサルストーガード

私が慣れ親しんでいる言語で数えられることはわかっているので、おそらくそうでしょう。吸う、私は知っている:)
Geobits

1

ZX / Sinclair BASIC-39バイト

ZX Basicはキーワードごとに1バイト(すべて大文字)を使用するため、バイトサイズを少し小さくするのに役立ちます...

1 INPUT n:FOR i=1 TO n:FOR j=1 TO i:PRINT j;" ";:NEXT j:PRINT:NEXT i

n = 8を使用

enter image description here


1
いいね 図6は、複数(一般的トリックた各数値リテラルのバイト隠さなくZX基本的な用途VAL("1")のinsted VALが1であるように(6バイト)1(7バイト))
edc65

1

R、28

for(i in 1:scan())print(1:i)

入力値が0の場合、出力は正しくありません。また、[1]各行の先頭が仕様に違反しているかどうかは不明です。
アレックスA.

@AlexA。質問をよく見ると、n = 0の場合の動作を尋ねる私のコメントが表示されます。しかし、私を正しい方向に向けてくれてありがとう!
freekvd

コメントを見ました。問題は、これが0に対して何も出力せず、印刷すること1; 1 0です。(ふり;は改行です。)
アレックスA.

の使用も検討してくださいcat(1:i,"\n")。少し長いですがprint(1:i)[1]各行の先頭には含まれません。
アレックスA.

1

TI-Basic、28バイト

Input N
For(I,1,N
randIntNoRep(1,N->L1
SortA(L1
Disp L1
End

1
フォーマットが示すとおり、これは出力されません。むしろ、配列はホーム画面に角かっこなどで表示されます。
リルトシアスト

1

C、89文字

// 90 characters
f(int n){int a=1,b;for(;n--;++a){for(b=0;b<a;++b)printf("%c%d",(!!b)*' ',b+1);puts("");}}

についての混乱を排除するためputs("");。これは、単に改行文字を出力するだけです(次を参照)。

Notice that puts not only differs from fputs in that it uses stdout as destination, but it also appends a newline character at the end automatically (which fputs does not).

I got it slightly shorter with @TheBestOne's java algorithm:

// 89 characters
f(int a){char b[999]="",*p=b+1;int c=0;for(;a--&&(sprintf(b,"%s %d",b,++c)&&puts(p)););}

puts(""); does nothing. You can use char b[999]="" instead of char b[999]={0} to save 1 character.
mch

2
puts(""); prints a newline character.
Felix Bytow

1

Perl: 34 characters

print"@$_\n"for map[1..$_],1..$_;

This code gets the input number supplied through the special variable $_.


1
Most brackets are redundant here: print"@$_\n"for map[1..$_],1..$_ also works.
nutki

I adjusted the code.
Felix Bytow

1

C# - 94 bytes

Written as an anonymous function that returns a string, which doesn't seem to be disallowed by the spec.

n=>String.Join("\n\n",Enumerable.Range(1,n).Select(l=>String.Join(" ",Enumerable.Range(1,l))))

Here's an ungolfed version (comments are read in BDCA order):

n =>
    String.Join("\n\n",                    //...then join it together with newlines.
        Enumerable.Range(1, n).Select(l => //For each l from 1 to n, ...
                String.Join(" ",              //...and join it with spaces, ...
                    Enumerable.Range(1, l)    //...get the range from 1 to l, ...

1

Bash+coreutils, 26 bytes

seq $1|sed "x;G;s/\n/ /;h"
  • seq simply generates the numbers 1 to n
  • sed saves the entire output for a given line in the hold space, and then appends the next line to it.

1

Haskell, 62 57 bytes

e=enumFromTo 1
f=putStr.unlines.map(unwords.map show.e).e

Point-free style. Usage example:

Prelude> f 5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Doing e=enumFromTo 1 saves 7 bytes.
Zgarb

@Zgarb: Thanks, but if I swap out enumFromTo 1, I have to give the main function a name, too, so it's 5 bytes. Without the name it would be a let construct: let e=enumFromTo 1 in (putStr.unlines.map(unwords.map show.e).e) 5
nimi


1

Scala, 73 65 62 bytes

(n:Int)=>print(1 to n map(1 to _ mkString " ") mkString "\n")

Ungolfed

def printNumberTriangle(n: Int): Unit = {
  def rowString(m: Int): String = 1.to(m).mkString(" ")
  print(1.to(n).map(rowString).mkString("\n"))
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.