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.