Hitung mundur dimensi


17

Tulis fungsi f (n, k) yang menampilkan hitung mundur k-dimensional dari n.

Seperti hitungan mundur 1 dimensi dari 5

 54321

Hitungan 2 dimensi dari 5 terlihat seperti

 54321
 4321
 321
 21
 1

Akhirnya, hitungan mundur 3 dimensi dari 5 terlihat seperti

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

Definisi formal

Hitungan mundur 1 dimensi dari sembarang n adalah satu garis dengan angka n, n-1, ..., 1 digabungkan (diikuti oleh garis baru).

Untuk setiap k, hitungan mundur k-dimensi dari 1 adalah garis tunggal

 1

Untuk n> 1 dan k> 1, hitung mundur k-dimensi dari n adalah hitung mundur (k-1) dari n diikuti oleh hitung mundur k-dimensi dari n-1.

Memasukkan

Dua bilangan bulat positif k dan n <= 9, dalam format apa pun yang Anda pilih.

Keluaran

Countdown k-dimensional dari n, dengan baris baru setelah setiap countdown 1-dimensi. Baris baru ekstra diizinkan dalam output.

Mencetak gol

Penilaian standar golf.

Contoh bonus

Berikut ini contoh dengan k> n, hitungan mundur 4 dimensi dari 3 (dengan komentar tambahan yang tidak dimasukkan dalam solusi aktual):

 -- 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  

Klarifikasi:

Digit pada garis tidak perlu berdekatan, tetapi harus spasi merata.

Anda dapat menulis program lengkap alih-alih hanya fungsi, jika diinginkan.


Saya tidak yakin saya mengerti soal-soal ujian dengan benar. Apakah hitungan mundur 3D dan 4D dari 2 identik?
— Dennis

1
@ Dennis Saya pikir maksudnya adalah bahwa 4D hitung mundur dari 2 = 3D hitung mundur dari 2 + 4D hitung mundur dari 1
— Sp3000

tidakkah seharusnya dikatakan hitung mundur 3d dari satu?
— Lemon Destructible

Baris baru ekstra diizinkan dalam output. Apakah itu merujuk pada mengikuti baris baru atau dapatkah itu terjadi di mana saja?
— Dennis

@Dennis Baris baru ekstra dapat terjadi di mana saja. Yah, 543 \ n21 tidak apa-apa, tapi setelah '1' mereka baik-baik saja.
— Eric Tressler

Jawaban:


15

Python, 60 byte

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

Uji di Ideone .

Bagaimana itu bekerja

The k mundur berdimensi dari n dapat didefinisikan dengan kasus dasar tunggal:

Jika n = 1 atau k = 1 , outputnya adalah n || n-1 || ... || 1 || ¶ , di mana || menunjukkan penggabungan.

Menggunakan definisi rekursif dari pertanyaan, f(n,k)mengembalikan f(n,k-1)+f(n-1,k)jika n> 1 dan k> 1 ; selain itu mengembalikan n + 1 karakter terakhir dari '987654321\n'.


Dennis terlalu bagus. Bagaimana kamu melakukannya?
— clismique

Satu-satunya wawasan saya di sini adalah bahwa Anda dapat menggabungkan kedua kasus dasar. Selebihnya hanyalah terjemahan langsung dari definisi rekursif.
— Dennis

8

Jelly , 8 byte

R¡UḌFṚp⁷

Ini adalah program lengkap yang mengharapkan n dan k sebagai argumen baris perintah.

Cobalah online!

Bagaimana itu bekerja

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.)

Tidak Ybekerja di tempat p⁷?
— mil

Semacam. Sebab 5, 1, ini ditampilkan [54321].
— Dennis

5

Javascript, 40 38 37 byte

Disimpan 1 byte berkat @ edc65:

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

Jawaban sebelumnya

38 byte berkat @Neil:

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

40 byte:

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

1
Simpan satu byte dengan menggunakan ||alih-alih ?n:. Simpan byte lain dengan menggunakan baris literal literal di dalam `bukan '\n'.
— Neil

Yang terbaik yang bisa saya lakukan tanpa baris baru tambahan adalah 43:f=(n,k)=>n?(k?f(n,k-1):n)+f(n-1,k):k?``:`\n`
— Neil

@Neil Saya menggunakan notepad ++ untuk menghitung byte dan jumlah baris baru literal sebagai 2 char.
— Hedi

Mungkin Anda bisa mencobanya di scratchpad browser Anda?
— Neil

1
Pintar, +1. Tapi gunakan *saja &&.
— edc65

3

Python, 76 75 byte

-1 byte terima kasih kepada @ Sp3000

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

Karies keluar prosedur seperti yang dijelaskan dalam OP: bergabung dengan penurunan nhasil untuk k-1pada baris dengan dasar rekursi dari 'n...1'string bila kini 1( ktidak lebih besar dari 1karena kita dijamin positif kinput).

Uji kasus pada ideone


3

Python, 86 81 80 byte

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

dadalah jumlah dimensi, nadalah angka hitung mundur.

Akan segera memposting penjelasan.

EDIT # 1: Mengubahnya menjadi lambda.

EDIT # 2: Disimpan 1 byte berkat @DestructibleWatermelon.


3

Haskell, 57 byte

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

Contoh penggunaan: 5 # 3-> "\n54321\n4321\n321\n21\n1\n4321\n321\n21\n1\n321\n21\n1\n21\n1\n1".

Implementasi langsung dari definisi.


2

Racket 215 byte

(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))))

Pengujian:

(f 54321 3)

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

Umm ... Pada mode 3D, mengapa 54321muncul dua kali?
— Erik the Outgolfer

Saya mencoba memilah masalah.
— rnso

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Masalahnya telah diperbaiki.
— rnso

Keren, dan saya juga melihat Anda menghapus banyak ruang kosong!
— Erik the Outgolfer

Dalam Racket, menggunakan lambda ( λ) selalu lebih sedikit byte daripada menggunakan define. Juga, input untuk nditentukan sebagai angka yang Anda buat (range 1 n). Lihat juga tentang mengganti conddengan Anda if, karena Anda menyimpan byte di else.
— Steven H.

2

J, 38 37 32 byte

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

Ini adalah fungsi yang dibutuhkan k pada LHS dan n pada RHS.

Disimpan 5 byte dengan ide dari @ Adám.

Pemakaian

   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

Penjelasan

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

Anda harus dapat menggunakan pendekatan saya .
— Adám

@ Adám Terima kasih, saya akan mencobanya
— mil

2

Dyalog APL , 18 byte

Anjuran untuk n , lalu untuk k .

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

~∘'0'⍤1menghapus ( ~) ∘nol ( '0') dari baris ( ⍤1) (padding dengan spasi sesuai kebutuhan) dari

⍕ representasi karakter

(⌽⍳)⍤0⍣⎕input terbalik ( ⌽) dihitung hingga ( ⍳) setiap skalar ( ⍤0), berulang ( ⍣) ( ⎕) kali

⊢ di

⎕ input numerik

TryAPL online!


2

C 93 Bytes

Implementasi berulang.

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 Bytes

Implementasi rekursif

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

Anda tidak dapat mendeklarasikan string tanpa menggunakan char *, sehingga implementasi rekursif Anda tidak dikompilasi. Tetapi solusinya sangat mudah dan menghemat 4 byte: ganti saja mdi dalam puts()panggilan dengan "987654321".
— G. Sliepen

Saya dikompilasi menggunakan gcc (GCC) 3.4.4 (cygming special, gdc 0.12, menggunakan dmd 0.125). Saya pikir tidak apa-apa karena saya baru saja mengubah dari char * ke int, karena solusi Anda 4 byte lebih kecil saya menyukainya lebih baik. Terima kasih
— cleblanc

1

Batch, 117 byte

@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 ♦ adalah jawaban Python.


1

Ruby, 56 byte

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

Pemakaian

Ketika Anda menampilkan solusi apa pun, Anda harus menggunakan "Kernel # puts".

Contoh:

puts f[9,3]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.