Séquences de chiffres décroissants


16

introduction

À titre d'exemple, prenons le nombre 7. Nous dupliquons ensuite cela et plaçons 7 espaces entre les deux. Nous obtenons ceci:

7_______7

Après cela, nous allons diminuer le nombre, jusqu'à ce qu'il n'y ait plus d'espace. Nous obtenons ce qui suit pour le numéro 7:

7_______7    
 6543210

Ensuite, nous fusionnons simplement les deux, donc:

7_______7    
 6543210  becomes

765432107

Ce sera une sortie pour N = 7 .

Ça a l'air facile, non? Prenons maintenant N = 12 . Nous insérons à nouveau 12 espaces entre les deux nombres, ce qui nous donne:

12____________12

Ensuite, nous commençons le décrément:

12____________12
  111098765432

Et cela nous donne enfin:

1211109876543212

Comme vous pouvez le voir, la partie descendante se termine à 2, pas à 0 .

Tâche

Étant donné un entier supérieur à 1 , sortez la séquence décroissante comme indiqué ci-dessus.

Cas de test

Input   Output

2       2102
3       32103
4       432104
5       5432105
6       65432106
7       765432107
8       8765432108
9       98765432109
10      10987654321010
11      111098765432111
12      1211109876543212
13      13121110987654313
14      141312111098765414
15      1514131211109876515
20      201918171615141312111020
99      9998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150499
100     1009998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150100

C'est du , donc la soumission avec le moins d'octets gagne!


L'espace intérieur doit être rempli de nombres entiers ou nous devrions couper les nombres si nécessaire? Il n'y a pas de test à ce sujet (par exemple 99)
edc65

@ edc65 Vous devez hacher les numéros si nécessaire. J'ai ajouté 99 comme cas de test.
Adnan

Réponses:


8

CJam, 11 10 octets

q4*~,W%s<\

Essayez-le en ligne.Suppose qu'il y a une nouvelle ligne de fin dans l'entrée. (Merci à @ jimmy23013 d'avoir enregistré un octet.)

Explication

À la fin de chaque ligne se trouve à quoi ressemble la pile à ce point (en utilisant 4comme exemple).

q4*  e# Push input x 4 times, separated by newlines. ["4\n4\n4\n4\n"]
~    e# Evaluate, separating the 4's and converting them to numbers. [4 4 4 4]
,W%  e# Take the range of x and reverse it. [4 4 4 [3 2 1 0]]
s<   e# Cast to string and take the first x characters. [4 4 "3210"]
\    e# Swap the top two to get the final result. [4 "3210" 4]

9

Julia, 30 octets

n->"$n"join(n-1:-1:0)[1:n]"$n"

Il s'agit d'une fonction anonyme qui accepte un entier et renvoie une chaîne. Pour l'appeler, affectez-le à une variable.

Nous construisons et joignons la séquence décroissante de n -1 à 0, et prenons les n premiers caractères de la chaîne résultante. Nous ajoutons et ajoutons ceci avec l'entrée sous forme de chaîne.

Vérifiez tous les cas de test en ligne


5

Haskell, 44 octets

s=show
f n=s n++take n(s=<<[n-1,n-2..])++s n

Exemple d'utilisation: f 14-> "141312111098765414".


5

JavaScript (ES6), 55 52 octets

n=>n+[...Array(m=n)].map(_=>--m).join``.slice(0,n)+n

Edit: enregistré 3 octets grâce à @WashingtonGuedes.


@WashingtonGuedes Bah, je ne semble jamais pouvoir l'utiliser .keys().
Neil

.keys()c'est comme .reduce. Le bon outil pour le travail, mais vous trouvez toujours quelque chose qui peut faire mieux dans ce cas particulier
edc65

4

Python 2, 82 72 58 53 octets

lambda x:`x`+''.join(map(str,range(x)[::-1]))[:x]+`x`

Essayez-le ici!

Merci à @Alex de m'avoir appris cela repr(x)= cela m'a fait `x`économiser un tas d'octets!


3

Pyth, 11 octets

++Q<jk_UQQQ

Deux versions alternatives, qui sont toutes également de 11 octets ( soupir ):

s[Q<jk_UQQQ
pQp<jk_UQQQ
  Q           the input
       UQ     [0, 1, ..., input-2, input-1]
      _       reverse
    jk        join on empty string
   <     Q    first (input) characters
          Q   the input again
++            concatenate everything so it prints on one line

Essayez-le ici.


3

Japt, 13 octets

U+Uo w ¬¯U +U

Testez-le en ligne!

Comment ça fonctionne

               // Implicit: U = input integer
  Uo           // Create the range [0..U).
     w         // Reverse.
       ¬       // Join.
        ¯U     // Slice to the first U chars.
U+         +U  // Append U on either end.

3

Gelée, 10 octets

Ȯ’r0DFḣ³Ḍ³

Essayez-le en ligne!

Comment ça fonctionne

Ȯ’r0DFḣ³Ḍ³  Main link. Input: n

Ȯ           Print n.
 ’          Decrement to yield n - 1.
  r0        Create a range from n - 1 to 0.
    D       Convert each integer to base 10 (array of decimal digits).
     F      Flatten the resulting array.
      ḣ³    Keep the first n elements.
        Ḍ   Convert from base 10 to integer.
         ³  Print the integer and set the return value to n.
            (implicit) Print the return value.


2

Vitsy, 35 octets

Étant donné que Vitsy ne sait pas comment créer des chaînes à partir de nombres, j'ai implémenté la recherche de la longueur du nombre en décimales dans la deuxième ligne.

V0VVNHVv[XDN1mv$-DvD);]VN
1a/+aL_1+

Explication:

V0VVNHVv[XDN1mv$-DvD);]VN
V                          Save the input as a global final variable.
 0V                        Push 0, push input.
   VN                      Output the input.
     H                     Push the range 0...intput.
      Vv                   Push the input, then save it as a temp variable.
        [             ]    Do the stuff in brackets infinitely or until exited.
         X                 Remove the top item of the stack.
          DN               Duplicate, then pop as output.
            1m             Calls the first line index, retrieving length.
              v            Pop the temp var and push it to the stack.
               $           Switch the top two items of the stack. 
                -          Subtract them.
                 Dv        Duplicate, then pop one as a temp var.
                   D);     If it's zero, exit the loop.
                       VN  Output the global var.

1a/+aL_1+
1a/+       Add .1. This makes sure we don't throw errors on input 0.
    a      Push ten.
     L     Pop the top item as n, push the log base n of second to top.
      _    Make it an int.
       1+  Add 1.

Essayez-le en ligne!

Mode détaillé pour lols:

save top as permanent variable;
push 0;
save top as permanent variable;
save top as permanent variable;
output top as number;
push all ints between second to top and top;
save top as permanent variable;
save top as temporary variable;
begin recursive area;
remove top;
duplicate top item;
output top as number;
push 1;
goto top method;
save top as temporary variable;
switch the top two items;
subtract top two;
duplicate top item;
save top as temporary variable;
duplicate top item;
if (int) top is not 0;
generic exit;
end recursive area;
save top as permanent variable;
output top as number;
:push 1;
push 10;
divide top two;
add top two;
push 10;
push ln(top);
replace top with int(top);
push 1;
add top two;

Il semble que le mode verbeux soit erroné dans sa définition de L, corrigeant cela maintenant (ne mettra pas à jour la question cependant).
Addison Crump

Juste curieux, comment empêchez-vous l'exécution de la méthode à la fin du programme? Le caractère de nouvelle ligne est-il un signal pour retourner / quitter le programme?
LegionMammal978

@ LegionMammal978 Imaginez que la première ligne de chaque programme Vitsy est la méthode "principale", et toutes les autres lignes sont des public static voidméthodes. Le principal termine le programme lorsqu'il est terminé. Quant à la façon dont cela se fait, les instructions sont contenues dans un type ArrayList<ArrayList<String[]>>, où chaque ligne est un String[]. Chaque méthode est divisée à la nouvelle ligne par la façon dont le fichier est chargé, ce qui entraîne la séparation de la méthode principale de toutes les autres méthodes.
Addison Crump

Cela explique pourquoi trois niveaux sont nécessaires. Donc Strings sont des instructions, String[]s sont des méthodes (la première est la méthode principale) et ArrayList<String[]>s sont des classes (la première est la classe principale), n'est-ce pas?
LegionMammal978

@ LegionMammal978 C'est tout à fait correct. :)
Addison Crump

2

Pure Bash, 49

eval printf -va %s {$[$1-1]..0}
echo $1${a::$1}$1

Ou:

Bash + coreutils, 48

echo $1$(seq $[$1-1] -1 0|tr -d \\n|head -c$1)$1

Je ne suis pas certain qu'ils évaluent correctement la portée. Lors des tests, les deux n'impriment que la moitié de la plage. c'est-à-dire que pour $ 1 = 90, la plage n'est que de 45. Mon effort était "pour i dans $ (eval echo {$ 1..0}); do echo -n $ i; done; echo $ 1"
rcjohnson

@rcjohnson Je pense que c'est le comportement requis. Que pensez-vous que la sortie soit pour N = 90?
Digital Trauma

@rcjohnson par exemple pour N = 12, la sortie devrait être 12, puis les 12 premiers caractères de 11..0(ou 111098765432), et enfin12
Digital Trauma

Eh bien, en relisant la description, je vois que vous avez raison. Le problème indique des «espaces» et non des entiers.
rcjohnson

@rcjohnson Oui, je pense que la partie "espaces" ne s'applique qu'aux étapes intermédiaires. La sortie finale doit être juste une chaîne de chiffres.
Digital Trauma

2

Rétine, 63 octets

.+
$0,y$0$*y$0$*x
x
$'_
(x)*_
$#1
+`(y+)y(.)
$2$1
,(\d+).*
$1$`

Il y a encore pas mal de place pour le golf ...

Essayez-le en ligne!


Hm, j'envisage de rendre l' option $0in $0$*optionnelle également, lorsque le jeton précédent est un littéral qui n'est pas un nombre (comme les vôtres y) ... en voyant cela, je pourrais en fait l'implémenter.
Martin Ender

@ MartinBüttner Je pensais que c'était la nouvelle fonctionnalité mais pas vraiment. :)
randomra

Non, actuellement cela ne fonctionne qu'au début de la substitution. Cela dit, vous pouvez peut-être changer les rôles du premier et du dernier numéro pour l'utiliser?
Martin Ender

2

MATL , 15 octets

VG:qPVXvG:)GVhh

EDIT (20 mai 2016) Le code dans le lien utilise à la Xzplace de Xv, en raison de récents changements dans la langue.

Essayez-le en ligne!

V                 % input n. Convert to string
 G:               % range [1,2,...,n]
   qP             % convert into [n-1,n-2,...,0]
     VXv          % convert to string, no spaces
        G:)       % take first n characters only
           GV     % push input as a string, again
             hh   % concat horizontally twice    

1

Java, 93 octets

String x(int v){String o=""+v;for(int i=v-1,c=o.length();o.length()-c<v;i--)o+=i;return o+v;}

1

Rubis, 41 octets

->n{[n]*2*(r=0...n).to_a.reverse.join[r]}

1

Voie lactée 1.6.5 , 27 25 octets

I'::%{K£BCH=}<ΩHG<+<;+!

Explication

I                        ` empty the stack
 '::                     ` push 3 copies of the input
    %{K£BCH=}            ` dump digits of reversed range(n) as strings [n-1...0]
             <ΩHG<+<;+   ` select the first nth digits and pad them with n
                      !  ` output

Usage

$ ./mw <path-to-code> -i <input-integer>

Quel encodage la Voie lactée utilise-t-elle?
Adnan

Uhhh .. UTF-8, je pense haha. @AandN
Zach Gates

J'ai eu cette erreur (oui, je suis un scumbag Windows: p) en essayant de l'exécuter. J'ai collé ceci: I'::%{K£BCH=}<OHG<+<;+!dans un fichier encodé UTF-8, mais cela ne fonctionne pas.
Adnan

Voici un lien vers le fichier que j'utilise. @AandN
Zach Gates

1

Perl 6 , 31 octets

{$_~([R~] ^$_).substr(0,$_)~$_}
{
  $_ # input
  ~  # string concatenated with
  ([R~] ^$_)    # all numbers up to and excluding the input concatenated in reverse
  .substr(0,$_) # but use only up to the input number of characters
  ~
  $_
}

Usage:

for 2,3,7,12,100 {
  say {$_~([R~] ^$_).substr(0,$_)~$_}( $_ )
}
2102
32103
765432107
1211109876543212
1009998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150100

1

Perl, 43 + 2 = 45 octets

Je suis content de ne pas avoir utilisé reverseet ni substr:

"@{[1-$_..0]}"=~s.\D..gr=~/.{$_}/;$_.=$&.$_

Nécessite les -pldrapeaux.

$ perl -ple'"@{[1-$_..0]}"=~s.\D..gr=~/.{$_}/;$_.=$&.$_' <<< 12
1211109876543212

Comment ça fonctionne:

                                            # '-p' read first line into `$_` and
                                            # auto print at the end
"@{[1-$_..0]}"                              # Create a list from -1-n..0 and
                                            # join it on space. This becomes:
                                            #   "-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0"
              =~s.\D..gr                    # Remove all but digits:
                                            #   "11109876543210"
                        =~/.{$_}/;          # Match the n first characters from
                                            # the generated string
                                  $_.=$&.$_ # Append the match and the input

1

C, 130 125 octets

#define p(x) printf("%i",x);
i,y,h;f(x){for(i=y=x;(i-=h)>=0;){p(y--)h=floor(log10(y))+1;}if(i+=h)p(h=floor(y/pow(10,i)))p(x)}

Version non golfée (avec explication):

#define p(x) printf("%i",x);     // alias to print an integer
i,y,h;                           // helper variables
f(x){                            // function takes an integer x as arg
    for(i=y=x;(i-=h)>=0;){       // i -> the remaining space
                                 // y -> the current descending number
        p(y--)                   // print y (at first y==x)
        h=floor(log10(y))+1;     // h -> the number of digits in y-1
    }                            // do it until there is no more empty space
    if(i+=h)                     // if needs to chop the last number
        p(h=floor(y/pow(10,i)))  // chop and print (implicitly cast of double to int)
    p(x)                         // print x at the end
}                                // end function

Le cast implicite du double à l'int h=floor(...) permis l'utilisation de#define p(x) économiser 5 octets.

Test sur ideone.


1

R, 67 octets (comme fonction)

# usage example : f(7)
f=function(i)cat(i,substr(paste((i-1):0,collapse=''),1,i),i,sep='')

R, 63 octets (entrée de STDIN)

i=scan();cat(i,substr(paste((i-1):0,collapse=''),1,i),i,sep='')

1

Brainfuck, 265 octets

Cela ne fonctionnera qu'avec des nombres <10

Essayez la version golfée ici :

>,------------------------------------------------[->+>+<<]>>[-<<+>>]<[[->+>+<<]>>[-<<+>>]<-]<[<]>[>[>]>+<<[<]>-]>[++++++++++++++++++++++++++++++++++++++++++++++++.>]++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.

Non golfé. Essayez-le ici :

>
,
---------- Convert to base 10
----------
----------
----------
-------- 


[->+>+<<]>>[-<<+>>]<

Fill up the grid
[
[->+>+<<]>>[-<<+>>] //duplicate number like [5][0] -> [5][5]
<-
]

<[<]> Go to cell 1
[

>[>] Scan for zero
> Move one more
+ Add one
<< Move two back
[<] Scan for zero
> Move one forward
- Subtract One
]

> Move one forward into actual numbers
[
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.
>
]
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.
>
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.

,>>++++++[<++++++++>-]<[-<->]<Cela peut soustraire 48 avec une longueur de code plus courte
Leaky Nun


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.