Boyutsal geri sayım


17

N'den k-boyutlu geri sayımı gösteren f (n, k) fonksiyonunu yazın.

5'ten 1 boyutlu geri sayım,

 54321

5'ten 2 boyutlu geri sayım

 54321
 4321
 321
 21
 1

Son olarak, 5'ten 3 boyutlu bir geri sayım

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

Resmi tanımlama

Herhangi bir n'den gelen 1 boyutlu geri sayım, n, n-1, ..., 1 basamaklarının birleştirilmiş (ardından bir yeni satır) tek bir satırdır.

Herhangi bir k için, 1'den k-boyutlu geri sayım tek satırdır

 1

N> 1 ve k> 1 için, n'den k-boyutlu geri sayım, n'den a (k-1)-boyutlu geri sayım, ardından n-1'den k-boyutlu geri sayımdır.

Giriş

Seçtiğiniz herhangi bir biçimde iki pozitif tamsayı k ve n <= 9.

Çıktı

Her 1 boyutlu geri sayımdan sonra yeni satır içeren, n'den k-boyutlu geri sayım. Çıktıda fazladan yeni satırlara izin verilir.

puanlama

Standart golf puanlaması.

Bonus örneği

İşte k> n, 3'ten 4 boyutlu geri sayım (gerçek çözümlere dahil edilmeyen ekstra yorumlarla) ile bir örnek:

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

Açıklamalar:

Bir satırdaki rakamların bitişik olması gerekmez, ancak eşit aralıklarla yerleştirilmelidirler.

İsterseniz, yalnızca bir işlev yerine tam bir program yazabilirsiniz.


Test senaryolarını doğru anladığımdan emin değilim. 3B ve 4D geri sayımları 2 ile aynı mıdır?
Dennis

1
@Dennis bence 2'den 4D geri sayım = 1'den 2 + 4D geri
sayımdan

Birinden 3d geri sayım dememeli mi?
Yıkılabilir Limon

Çıktıda fazladan yeni satırlara izin verilir. Bu, sondaki yeni satırları mı ifade ediyor yoksa herhangi bir yerde olabilir mi?
Dennis

@Dennis Ekstra yeni satırlar her yerde olabilir. 543 \ n21 iyi değil, ancak herhangi bir '1'den sonra iyi durumdalar.
Eric Tressler

Yanıtlar:


15

Python, 60 bayt

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

Ideone üzerinde test edin .

Nasıl çalışır

K gelen boyutlu geri sayım n , tek bir temel durum ile tanımlanabilir:

Eğer , n = 1 ya da k = 1 , çıkış n || n-1 || ... || 1 || ¶ , burada || birleştirme anlamına gelir.

Sorunun özyinelemeli tanımını kullanarak n> 1 ve k> 1 ise f(n,k)döndürür ; aksi takdirde, son n + 1 karakterini döndürür .f(n,k-1)+f(n-1,k)'987654321\n'


Dennis çok iyi. Bunu nasıl yaptın?
clismique

Buradaki tek görüşüm, her iki temel vakayı birleştirebileceğinizdi. Gerisi özyinelemeli tanımın doğrudan bir çevirisi.
Dennis

8

Jöle , 8 bayt

R¡UḌFṚp⁷

Bu, n ve k'yi bekleyen tam bir programdır. komut satırı argümanları olarak .

Çevrimiçi deneyin!

Nasıl çalışır

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

YYerine çalışmıyor mu p⁷?
mil

Bir çeşit. İçin 5, 1görüntülenir [54321].
Dennis

5

Javascript, 40 38 37 bayt

@ Edc65 sayesinde 1 bayt kaydedildi:

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

Önceki cevaplar

@Neil sayesinde 38 bayt:

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

40 bayt:

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

1
Kullanarak bir bayt kaydet ||yerine ?n:. `S yerine gerçek bir satırsonu kullanarak başka bir bayt kaydedin '\n'.
Neil

Ekstra yeni satırlar olmadan yapabileceğim en iyi şey 43:f=(n,k)=>n?(k?f(n,k-1):n)+f(n-1,k):k?``:`\n`
Neil

@Neil Bayt saymak için notepad ++ kullanıyorum ve 2 satır olarak yeni satır sayısı.
Hedi

Belki bunun yerine tarayıcınızın not defterinde deneyebilirsiniz?
Neil

1
Akıllı, +1. Ama *bunun yerine kullanın &&.
edc65

3

Python, 76 75 bayt

@ Sp3000 sayesinde -1 bayt

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

OP tarif edilen prosedüre üzerinden Çürük: azalan birleştirmeler niçin sonuçları k-1bir yineleme bir baz ile yeni satır üzerinde 'n...1'zaman dize kolan 1( kdaha büyük 1pozitif garanti edilir çünkü kgiriş).

İdeone üzerinde test vakaları


3

Python, 86 81 80 bayt

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

dboyut nsayısı, geri sayım numarasıdır.

Yakında bir açıklama gönderecek.

EDIT # 1: Lambda olarak değiştirildi.

EDIT # 2: @ DestructibleWatermelon sayesinde 1 bayt kaydedildi.


3

Haskell, 57 bayt

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

Kullanım örneği: 5 # 3-> "\n54321\n4321\n321\n21\n1\n4321\n321\n21\n1\n321\n21\n1\n21\n1\n1".

Tanımın doğrudan uygulanması.


2

Raket 215 bayt

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

Test yapmak:

(f 54321 3)

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

Hımm ... 3D modunda neden 54321iki kez görünüyor?
Outgolfer Erik

Sorunları çözmeye çalışıyorum.
rnso

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Sorun düzeltildi.
rnso

Havalı, ve ben de çok boşluk kaldırdığınızı görüyorum!
Outgolfer Erik

Rakette, lambda ( λ) kullanmak her zaman kullanmaktan daha az bayttır define. Ayrıca, için girdi, oluşturduğunuz nbir sayı olarak belirtildi (range 1 n). Üzerinde bayt kaydettiğiniz için cond, bir ile değiştirme hakkında da bakın . ifelse
Steven H.

2

J, 38 37 32 bayt

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

Bu, LHS ve n'yi k alan bir işlevdir. .

@ Adám'ın fikirleriyle 5 bayt kaydedildi.

kullanım

   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çıklama

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

Benim yaklaşımımı kullanabilmelisin .
Adám

@ Adám Teşekkürler, deneyeceğim
mil

2

Dyalog APL , 18 bayt

İçin İstemler n daha sonra da, k .

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

~∘'0'⍤1( ~) ( ) sıfırlarını ( '0') satırlardan (⍤1 ) (gerektiği gibi boşluklarla doldurma)

karakter temsili

(⌽⍳)⍤0⍣⎕her skaler ( ), tekrarlanan ( ) giriş ( ) sürelerine ( ) kadar ters ( ) sayımı⍤0

üzerinde

sayısal girdi

TryAPL çevrimiçi!


2

C 93 Bayt

Yinelemeli uygulama.

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 Bayt

Özyinelemeli uygulama

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

Char * kullanmadan dizeleri bildiremezsiniz, bu nedenle yinelemeli uygulamanız derlenmez. Ancak çözüm çok kolaydır ve 4 bayt tasarruf sağlar: sadece aramanın miçini değiştirin . puts()"987654321"
G. Sliepen

Gcc (GCC) 3.4.4 (cygming special, gdc 0.12, dmd 0.125 kullanarak) kullanarak derledim. Ben sadece char * dan int dönüştürmek beri sorun yok, ancak, çözüm 4 bayt daha küçük olduğundan ben daha iyi gibi. Teşekkürler
cleblanc

1

Toplu, 117 bayt

@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

Dennis Limanı ♦ 'nın Python cevabı.


1

Yakut, 56 bayt

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

kullanım

Herhangi bir çözüm görüntülerken, "Kernel # puts" kullanmalısınız.

Misal:

puts f[9,3]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.