Secuencias de dígitos descendentes

16

Introducción

Como ejemplo, tomemos el número 7. Luego duplicamos esto y colocamos 7 espacios en el medio. Obtenemos esto:

7_______7

Después de eso, vamos a disminuir el número, hasta que no queden espacios. Obtenemos lo siguiente para el número 7:

7_______7    
 6543210

Luego, solo fusionamos los dos, entonces:

7_______7    
 6543210  becomes

765432107

Esta será salida para N = 7 .

Parece fácil, ¿verdad? Ahora tomemos N = 12 . Volvemos a insertar 12 espacios entre los dos números, lo que nos da:

12____________12

Entonces comenzamos la disminución:

12____________12
  111098765432

Y esto finalmente nos da:

1211109876543212

Como puede ver, la parte descendente termina en 2, no en 0 .

Tarea

Dado un número entero, mayor que 1 , genera la secuencia descendente como se muestra arriba.

Casos de prueba

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

Este es el , por lo que gana el envío con el menor número de bytes.

Adnan
fuente
El espacio interior debe llenarse con números enteros o debemos cortar los números si es necesario. No hay un caso de prueba al respecto (por ejemplo, 99)
edc65
@ edc65 Debe cortar los números si es necesario. He agregado 99 como un caso de prueba.
Adnan

Respuestas:

8

CJam, 11 10 bytes

q4*~,W%s<\

Pruébalo en línea.Asume que hay una nueva línea final en la entrada. (Gracias a @ jimmy23013 por guardar un byte).

Explicación

Al final de cada línea se ve la pila en ese punto (usando 4como ejemplo).

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]
NinjaOsoMono
fuente
9

Julia, 30 bytes

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

Esta es una función anónima que acepta un número entero y devuelve una cadena. Para llamarlo, asígnelo a una variable.

Construimos y unimos la secuencia descendente de n -1 a 0, y tomamos el primer n caracteres de la cadena resultante. Anteponemos y agregamos esto con la entrada como una cadena.

Verifique todos los casos de prueba en línea

Alex A.
fuente
5

Haskell, 44 bytes

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

Ejemplo de uso: f 14-> "141312111098765414".

nimi
fuente
5

JavaScript (ES6), 55 52 bytes

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

Editar: Guardado 3 bytes gracias a @WashingtonGuedes.

Neil
fuente
@WashingtonGuedes Bah, parece que nunca uso .keys().
Neil
.keys()es como .reduce. La herramienta adecuada para el trabajo, pero siempre encuentra algo que puede mejorar en ese caso particular
edc65
4

Python 2, 82 72 58 53 bytes

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

Pruébalo aquí!

Gracias a @Alex por enseñarme eso repr(x)= ¡ `x`ahorrándome un montón de bytes!

Denker
fuente
3

Pyth, 11 bytes

++Q<jk_UQQQ

Dos versiones alternativas, que también son de 11 bytes ( suspiro ):

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

Pruébalo aquí

Pomo de la puerta
fuente
3

Japt, 13 bytes

U+Uo w ¬¯U +U

¡Pruébelo en línea!

Cómo funciona

               // 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.
ETHproducciones
fuente
3

Jalea, 10 bytes

Ȯ’r0DFḣ³Ḍ³

Pruébalo en línea!

Cómo funciona

Ȯ’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.
Dennis
fuente
2

Vitsy, 35 bytes

Como Vitsy no sabe cómo hacer cadenas de números, implementé encontrar la longitud del número en decimales en la segunda línea.

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

Explicación:

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.

Pruébalo en línea!

Modo detallado para 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;
Addison Crump
fuente
Parece que el modo detallado está mal en su definición de L, arreglando eso ahora (aunque no actualizará la pregunta).
Addison Crump
Por curiosidad, ¿cómo evita que el método se ejecute al final del programa? ¿Es el carácter de nueva línea una señal para regresar / salir del programa?
LegionMammal978
@ LegionMammal978 Imagine que la primera línea de cada programa Vitsy es el método "principal", y todas las demás líneas son public static voidmétodos. El principal finaliza el programa cuando finaliza. En cuanto a cómo se hace esto, las instrucciones se llevan a cabo en un tipo ArrayList<ArrayList<String[]>>, donde cada línea es una String[]. Cada método se divide en la nueva línea según cómo se carga el archivo, lo que hace que el método principal se separe de todos los demás métodos.
Addison Crump
Eso explica por qué se necesitan tres niveles. Entonces, Strings son instrucciones, String[]s son métodos (el primero es el método principal) y ArrayList<String[]>s son clases (el primero es la clase principal), ¿correcto?
LegionMammal978
@ LegionMammal978 Eso es todo correcto. :)
Addison Crump
2

Pure Bash, 49

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

O:

Bash + coreutils, 48

echo $1$(seq $[$1-1] -1 0|tr -d \\n|head -c$1)$1
Trauma digital
fuente
No estoy seguro de que estos estén evaluando el rango correctamente. Al probar ambos, imprima solo la mitad del rango. es decir, para $ 1 = 90, el rango solo se reduce a 45. Mi esfuerzo fue "para i en $ (eval echo {$ 1..0}); do echo -n $ i; hecho; echo $ 1"
rcjohnson
@rcjohnson Creo que ese es el comportamiento requerido. ¿Cuál espera que sea la salida para N = 90?
Trauma digital
@rcjohnson, por ejemplo, para N = 12, la salida debería ser 12, luego los primeros 12 caracteres de 11..0(o 111098765432), y finalmente12
Trauma digital
Bien, al releer la descripción, veo que estás en lo correcto. El problema establece "espacios" no enteros.
rcjohnson
@rcjohnson Sí, creo que la parte de "espacios" solo se aplica a los pasos intermedios. El resultado final debe ser solo una cadena de dígitos.
Trauma digital
2

Retina, 63 bytes

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

Todavía hay bastante espacio para jugar al golf ...

Pruébalo en línea!

randomra
fuente
Hm, estoy considerando hacer el $0en $0$*opcional, así, cuando el anterior token es un literal que no es un número (como sus ys son) ... de ver esto en realidad podría aplicar eso.
Martin Ender
@ MartinBüttner Pensé que esa era la nueva característica, pero resultó que en realidad no. :)
randomra
No, actualmente eso solo funciona al comienzo de la sustitución. Dicho esto, ¿tal vez puedas cambiar los roles del primer y último número para hacer uso de eso?
Martin Ender
2

MATL , 15 bytes

VG:qPVXvG:)GVhh

EDITAR (20 de mayo de 2016) El código en el enlace se usa en Xzlugar de Xv, debido a cambios recientes en el idioma.

Pruébalo en línea!

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    
Luis Mendo
fuente
1

Java, 93 bytes

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;}
Addison Crump
fuente
1

Ruby, 41 bytes

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

Vía Láctea 1.6.5 , 27 25 bytes

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

Explicación

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

Uso

$ ./mw <path-to-code> -i <input-integer>
Puertas de Zach
fuente
¿Qué codificación usa la Vía Láctea?
Adnan
Uhhh .. UTF-8, creo jaja. @AandN
Zach Gates
Recibí este error (sí, soy un cabrón de Windows: p) al intentar ejecutar esto. Pegué esto: I'::%{K£BCH=}<OHG<+<;+!en un archivo codificado UTF-8, pero no funciona.
Adnan
Aquí hay un enlace al archivo que estoy usando. @AandN
Zach Gates
1

Perl 6 , 31 bytes

{$_~([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
  ~
  $_
}

Uso:

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

Perl, 43 + 2 = 45 bytes

Estoy feliz de no haber usado reversey tampocosubstr :

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

Requiere el -pl banderas.

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

Cómo funciona:

                                            # '-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
andlrc
fuente
1

C, 130 125 bytes

#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)}

Versión sin golf (con explicación):

#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

La conversión implícita de doble a int h=floor(...)permitió el uso de#define p(x) guardar 5 bytes.

Prueba de ideona.

remoto
fuente
1

R, 67 bytes (como función)

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

R, 63 bytes (entrada de STDIN)

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

Brainfuck, 265 bytes

Esto solo va a funcionar con números <10

Prueba la versión de golf aquí :

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

Sin golf. Pruébalo aquí :

>
,
---------- 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
++++++++++
++++++++++
++++++++++
++++++++
.
Keatinge
fuente
,>>++++++[<++++++++>-]<[-<->]<Esto puede restar 48 con una longitud de código más corta
Leaky Nun