Compte à rebours dimensionnel

17

Écrivez une fonction f (n, k) qui affiche le compte à rebours en k à partir de n.

Un compte à rebours unidimensionnel à partir de 5 ressemble à

 54321

Un compte à rebours en 2 dimensions à partir de 5 ressemble à

 54321
 4321
 321
 21
 1

Enfin, un compte à rebours en 3 dimensions à partir de 5 ressemble à

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

Définition formelle

Le compte à rebours unidimensionnel de n'importe quel n est une seule ligne avec les chiffres n, n-1, ..., 1 concaténés (suivi d'une nouvelle ligne).

Pour tout k, le compte à rebours k-dimensionnel de 1 est la ligne unique

 1

Pour n> 1 et k> 1, un compte à rebours k-dimensionnel à partir de n est un compte à rebours (k-1)-dimensionnel à partir de n suivi d'un compte à rebours k-dimensionnel à partir de n-1.

Contribution

Deux entiers positifs k et n <= 9, dans le format de votre choix.

Production

Le compte à rebours en k à partir de n, avec une nouvelle ligne après chaque compte à rebours en 1 dimension. Des sauts de ligne supplémentaires sont autorisés dans la sortie.

Notation

Score de golf standard.

Exemple de bonus

Voici un exemple avec k> n, un compte à rebours en 4 dimensions à partir de 3 (avec des commentaires supplémentaires qui ne doivent pas être inclus dans les solutions réelles):

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

Précisions:

Les chiffres sur une ligne ne doivent pas nécessairement être adjacents, mais ils doivent être régulièrement espacés.

Vous pouvez écrire un programme complet au lieu d'une simple fonction, si vous préférez.

Eric Tressler
la source
Je ne suis pas sûr de bien comprendre les cas de test. Les comptes à rebours 3D et 4D de 2 sont-ils identiques?
Dennis
1
@Dennis Je pense que l'intention est que le compte à rebours 4D à partir de 2 = compte à rebours 3D à partir du compte à rebours 2 + 4D à partir du 1
Sp3000
cela ne devrait-il pas dire le compte à rebours 3d d'un?
Destructible Lemon
Des retours à la ligne supplémentaires sont autorisés dans la sortie. Est-ce que cela fait référence à des sauts de ligne ou peuvent-ils se produire n'importe où?
Dennis
Les nouvelles lignes @Dennis Extra peuvent se produire n'importe où. Eh bien, 543 \ n21 ne va pas, mais après tout «1», ça va.
Eric Tressler

Réponses:

15

Python, 60 octets

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

Testez-le sur Ideone .

Comment ça fonctionne

Le compte à rebours en k à partir de n peut être défini avec un seul cas de base:

Si n = 1 ou k = 1 , la sortie est n || n-1 || ... || 1 || ¶ , où || indique une concaténation.

En utilisant la définition récursive de la question, f(n,k)retourne f(n,k-1)+f(n-1,k)si n> 1 et k> 1 ; sinon, il renvoie les n + 1 derniers caractères de '987654321\n'.

Dennis
la source
Dennis est tout simplement trop bon. Comment avez-vous réussi?
clismique
Ma seule idée ici était que vous pouvez combiner les deux cas de base. Le reste n'est qu'une traduction directe de la définition récursive.
Dennis
8

Gelée , 8 octets

R¡UḌFṚp⁷

Il s'agit d'un programme complet qui attend n et k comme arguments de ligne de commande.

Essayez-le en ligne!

Comment ça fonctionne

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.)
Dennis
la source
Ne Yfonctionne pas à la place de p⁷?
miles
Sorte de. Car 5, 1, il s'affiche [54321].
Dennis
5

Javascript, 40 38 37 octets

1 octets enregistrés grâce à @ edc65:

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

Réponses précédentes

38 octets grâce à @Neil:

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

40 octets:

f=(n,k)=>k&&n?f(n,k-1)+f(n-1,k):n?n:'\n'
Hedi
la source
1
Enregistrez un octet en utilisant ||au lieu de ?n:. Enregistrez un autre octet en utilisant un saut de ligne littéral à l'intérieur de `s au lieu de '\n'.
Neil
Le mieux que je pouvais faire sans les nouvelles lignes supplémentaires était de 43:f=(n,k)=>n?(k?f(n,k-1):n)+f(n-1,k):k?``:`\n`
Neil
@Neil J'utilise notepad ++ pour compter les octets et le littéral littéral compte pour 2 caractères.
Hedi
Peut-être pourriez-vous plutôt l'essayer dans le bloc-notes de votre navigateur?
Neil
1
Intelligent, +1. Mais utilisez *plutôt &&.
edc65
3

Python, 76 75 octets

-1 octet grâce à @ Sp3000

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

Exécute la procédure telle que décrite dans l'OP: joint les nrésultats décroissants pour k-1les sauts de ligne avec une base de récursivité de la 'n...1'chaîne quand kest1 ( kpas plus grand que 1puisque nous sommes garantis une kentrée positive ).

Cas de test sur ideone

Jonathan Allan
la source
3

Python, 86 81 80 octets

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

d est le nombre de dimensions, n est le nombre de compte à rebours.

Publiera bientôt une explication.

EDIT # 1: changé en lambda.

EDIT # 2: 1 octet enregistré grâce à @DestructibleWatermelon.

clismique
la source
3

Haskell, 57 octets

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

Exemple d'utilisation: 5 # 3-> "\n54321\n4321\n321\n21\n1\n4321\n321\n21\n1\n321\n21\n1\n21\n1\n1".

Une mise en œuvre directe de la définition.

nimi
la source
2

Raquette 215 octets

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

Essai:

(f 54321 3)

54321
4321
321
21
1
4321
321
21
1
321
21
1
21
1
1
rnso
la source
Umm ... En mode 3D, pourquoi 54321apparaît deux fois?
Erik the Outgolfer
J'essaie de régler les problèmes.
rnso
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Le problème a été corrigé.
rnso
Cool, et je vois aussi que vous avez supprimé beaucoup d'espaces!
Erik the Outgolfer
Dans Racket, l'utilisation de lambda ( λ) représente toujours moins d'octets que l'utilisation define. De plus, l'entrée pour a nété spécifiée comme étant un nombre pour lequel vous créez le (range 1 n). Voir aussi sur le remplacement de votre condpar un if, car vous économisez des octets sur le else.
Steven H.
2

J, 38 37 32 octets

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

C'est une fonction qui prend k sur le LHS et n sur le RHS.

5 octets enregistrés avec des idées de @ Adám.

Usage

   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

Explication

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
miles
la source
Vous devriez pouvoir utiliser mon approche .
Adám
@ Adám Merci, je vais l'essayer
miles
2

Dyalog APL , 18 octets

Demande n , puis k .

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

~∘'0'⍤1supprimer ( ~) le ( ) zéros ( '0') des lignes ( ⍤1) (remplissage avec des espaces au besoin) de

la représentation des caractères de

(⌽⍳)⍤0⍣⎕le nombre inversé ( ) jusqu'à ( ) chaque scalaire ( ⍤0), répété ( ) fois entrée ( )

sur

entrée numérique

TryAPL en ligne!

Adam
la source
2

C 93 octets

Mise en œuvre itérative.

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 octets

Implémentation récursive

f(n,k){n*k?f(n,k-1)+f(n-1,k):puts("987654321"+9-n);}
cleblanc
la source
Vous ne pouvez pas déclarer de chaînes sans utiliser char *, donc votre implémentation récursive ne se compile pas. Mais la solution est très simple et économise 4 octets: remplacez simplement l' mintérieur de l' puts()appel par "987654321".
G. Sliepen
J'ai compilé en utilisant gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125). Je pense que c'est ok puisque je suis juste en train de convertir de char * en int, cependant, puisque votre solution est plus petite de 4 octets, je l'aime mieux. Merci
cleblanc
1

Lot, 117 octets

@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

Réponse de Python de Port of Dennis ♦.

Neil
la source
1

Rubis, 56 octets

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

Usage

Lorsque vous affichez des solutions, vous devez utiliser "Kernel # put".

Exemple:

puts f[9,3]
cia_rana
la source