次元カウントダウン


17

nからk次元のカウントダウンを表示する関数f(n、k)を記述します。

5からの1次元のカウントダウンは次のようになります

 54321

5からの2次元のカウントダウンは次のようになります

 54321
 4321
 321
 21
 1

最後に、5からの3次元のカウントダウンは次のようになります

 54321
 4321
 321
 21
 1
 4321
 321
 21
 1
 321
 21
 1
 21
 1
 1

正式な定義

任意のnからの1次元のカウントダウンは、数字n、n-1、...、1が連結された単一の行です(その後に改行が続きます)。

任意のkについて、1からのk次元のカウントダウンは単一行です

 1

n> 1およびk> 1の場合、nからのk次元のカウントダウンは、nからの(k-1)次元のカウントダウンと、それに続くn-1からのk次元のカウントダウンです。

入力

選択した任意の形式の2つの正の整数kおよびn <= 9。

出力

nからのk次元のカウントダウン。各1次元のカウントダウンの後に改行が付きます。出力では、余分な改行を使用できます。

得点

標準的なゴルフの得点。

ボーナスの例

以下は、k> nの例で、3からの4次元のカウントダウンです(実際のソリューションには含まれないコメントが追加されています)。

 -- 3-dimensional countdown from 3
 321
 21
 1
 21
 1
 1
 -- 4-dimensional countdown from 2:
 ---- 3-dimensional countdown from 2:
 21
 1
 1
 ---- 4-dimensional countdown from 1:
 1  

明確化:

行の数字は隣接している必要はありませんが、等間隔である必要があります。

必要に応じて、関数だけでなく完全なプログラムを作成することもできます。


テストケースを正しく理解しているかどうかはわかりません。2つの3Dと4Dのカウントダウンは同じですか?
デニス

1
@Dennis 2からの4Dカウントダウン= 2からの3Dカウントダウン+ 1からの4Dカウントダウン
Sp3000

1から3Dカウントダウンと言ってはいけませんか?
破壊可能なレモン

出力では、余分な改行が許可されます。それは末尾の改行を指しますか、それともどこでも発生しますか?
デニス

@Dennis余分な改行はどこでも発生します。まあ、543 \ n21は大丈夫ではありませんが、「1」の後は大丈夫です。
エリックトレスラー16

回答:


15

Python、60バイト

f=lambda n,k:n>1<k and f(n,k-1)+f(n-1,k)or'987654321\n'[~n:]

Ideoneでテストします。

使い方

nからk次元のカウントダウンは、単一の基本ケースで定義できます。

場合N = 1または= 1 K、出力はN || n-1 || ... || 1 || ¶、ここで|| 連結を示します。

質問の再帰的定義を使用して、n> 1およびk> 1の場合にf(n,k)戻ります。それ以外の場合は、から最後のn + 1文字を返します。f(n,k-1)+f(n-1,k)'987654321\n'


デニスはあまりにも良いです。どうやってやったの?
clismique

ここでの私の唯一の洞察は、両方の基本ケースを組み合わせることができるということでした。残りは、再帰的な定義の直接的な翻訳です。
デニス

8

ゼリー、8 バイト

R¡UḌFṚp⁷

これは、コマンドライン引数としてnkを必要とする完全なプログラムです。

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

使い方

R¡UḌFṚp⁷  Main link. Left argument: n. Right argument: k

 ¡        Repeat the link to the left k times.
R           Range; map each integer j in the previous return value to [1, ..., j].
  U       Upend; reverse each 1-dimensional array in the result.
   Ḍ      Undecimal; convert each 1-dimensional array from base 10 to integer.
    F     Flatten the resulting array.
     Ṛ    Reverse the result.
      p⁷  Cartesian product with '\n'. (Join is weird for singleton arrays.)

Y代わりに機能しませんp⁷か?
マイル

並べ替え。の場合5, 1、表示されます[54321]
デニス

5

Javascript、40 38 37バイト

@ edc65のおかげで1バイト節約されました:

f=(n,k)=>k*n?f(n,k-1)+f(n-1,k):n||`
`

以前の回答

@Neilのおかげで38バイト:

f=(n,k)=>k&&n?f(n,k-1)+f(n-1,k):n||`
`

40バイト:

f=(n,k)=>k&&n?f(n,k-1)+f(n-1,k):n?n:'\n'

1
||代わりにを使用して1バイトを保存します?n:`の代わりにs 内のリテラル改行を使用して、別のバイトを保存します'\n'
ニール

余分な改行なしでできることは43 f=(n,k)=>n?(k?f(n,k-1):n)+f(n-1,k):k?``:`\n`
ニール

@Neil私はメモ帳++を使用してバイトをカウントし、リテラル改行は2文字としてカウントしています。
エディ

代わりにブラウザのスクラッチパッドで試すことができますか?
ニール

1
賢い、+ 1。ただし、*代わりに使用します&&
edc65

3

Python、76 75バイト

@ Sp3000のおかげで-1バイト

c=lambda n,k:k>1and'\n'.join(c(n-i,k-1)for i in range(n))or'987654321'[-n:]

OPに記載の手順アウト虫歯は:減少ジョインnの結果k-1の再帰の塩基と改行で'n...1'文字列kである1k以下で1我々は、正の保証されているので、k入力)。

イデオンのテストケース


3

Python、86 81 80バイト

o=lambda d,n:"987654321"[-n:]if d<2else"\n".join([o(d-1,n-x) for x in range(n)])

dは次元数n、カウントダウン数です。

説明をすぐに投稿します。

編集1:ラムダに変更しました。

編集#2:@DestructibleWatermelonのおかげで1バイトを保存しました。


3

Haskell、57バイト

n#1='\n':(show=<<[n,n-1..1])
1#_=1#1
n#k=n#(k-1)++(n-1)#k

使用例:5 # 3-> "\n54321\n4321\n321\n21\n1\n4321\n321\n21\n1\n321\n21\n1\n21\n1\n1"

定義の直接実装。


2

ラケット215バイト

(define(g n k(s(number->string n)))(cond [(< k 2) n]
[else(define o(for/list((i(string-length s)))
(string->number(substring s i))))(for/list((x o))(g x(- k 1)))])) 
(define(f n k)(for-each println(flatten(g n k))))

テスト:

(f 54321 3)

54321
4321
321
21
1
4321
321
21
1
321
21
1
21
1
1

うーん... 3Dモードで、なぜ543212回表示されるのですか?
エリックアウトゴルファー16

私は問題を整理しようとしています。
rnso

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ問題は修正されました。
-rnso

かっこいいですし、たくさんの空白を削除したこともわかりました!
エリックアウトゴルファー16

ラケットでは、lambda(λ)を使用すると、を使用するよりも常にバイト数が少なくなりますdefine。また、の入力は、nを作成する対象の番号になるように指定されました(range 1 n)。でバイトを保存するので、condをに置き換えることも参照してください。ifelse
スティーブンH.

2

J、38 37 32バイト

a:":@>@-.~&,0<@-."1~0&(](-i.)"0)

これは、LHS ではk、RHSではnを取る関数です。

@Adámのアイデアで5バイトを節約しました。

使用法

   f =: a:":@>@-.~&,0<@-."1~0&(](-i.)"0)
   3 f 5
5 4 3 2 1
4 3 2 1  
3 2 1    
2 1      
1        
4 3 2 1  
3 2 1    
2 1      
1        
3 2 1    
2 1      
1        
2 1      
1        
1

説明

a:":@>@-.~&,0<@-."1~0&(](-i.)"0)  Input: k on LHS, n on RHS
                    0&(        )  Repeat k times on initial value n
                        (   )"0   For each value x
                          i.        Make the range [0, x)
                         -          Subtract x from each to make the range [x, 1]
                       ]            Return the array of ranges
            0  -."1~              Remove the zeros from each row
             <@                   Box each row
          &,                      Flatten the array of boxes
a:     -.~                        Remove the empty boxes
     >@                           Unbox each
  ":@                             Convert it into a string and return

あなたは私のアプローチを使用できるはずです。
アダム

@Adámありがとう、試してみます
マイル

2

Dyalog APL、18 バイト

nのプロンプト、次にkを要求します。

~∘'0'1⍕(⌽⍳)⍤0⍣⎕⊢⎕

~∘'0'⍤1 削除する (~行()(必要に応じてスペースでパディング)から()ゼロ('0')を)⍤1

の文字表現

(⌽⍳)⍤0⍣⎕逆に()まで(カウント)各スカラー(⍤0)まで繰り返される、繰り返し()入力()回

オン

数値入力

TryAPLオンライン!


2

C 93バイト

反復実装。

m,i,j;f(n,k){for(;m<k+2;m++)for(j=0;j<n;j++){for(i=m;i<n-j;i++)printf("%d",n-j-i);puts("");}}

C 67 65 61 56 52バイト

再帰的な実装

f(n,k){n*k?f(n,k-1)+f(n-1,k):puts("987654321"+9-n);}

char *を使用せずに文字列を宣言することはできないため、再帰的な実装はコンパイルされません。しかし、解決策は非常に簡単で、4バイトを節約します。呼び出しm内でを置き換えるだけです。puts()"987654321"
G. Sliepen

gcc(GCC)3.4.4(cymming special、gdc 0.12、dmd 0.125を使用)を使用してコンパイルしました。私はchar *からintに変換しているだけなので大丈夫だと思いますが、あなたのソリューションは4バイト小さいので気に入っています。ありがとう
cleblanc 16

1

バッチ、117バイト

@setlocal
@set/an=%1-1,k=%2-1,p=n*k,s=987654321
@if %p%==0 (call echo %%s:~-%1%%)else call %0 %1 %k%&call %0 %n% %2

Port of Dennis♦のPythonの答え。


1

ルビー、56バイト

f=->n,k{n>1&&k>1?[f[n,k-1],f[n-1,k]]:[*1..n].reverse*""}

使用法

ソリューションを表示するときは、「Kernel#puts」を使用する必要があります。

例:

puts f[9,3]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.