Sequenze di cifre discendenti


16

introduzione

Ad esempio, prendiamo il numero 7. Quindi dupliciamo questo e posizioniamo 7 spazi in mezzo. Otteniamo questo:

7_______7

Successivamente, diminuiremo il numero, fino a quando non ci saranno più spazi. Otteniamo quanto segue per il numero 7:

7_______7    
 6543210

Quindi, uniamo solo i due, quindi:

7_______7    
 6543210  becomes

765432107

Questo verrà emesso per N = 7 .

Sembra facile, vero? Ora prendiamo N = 12 . Inseriamo nuovamente 12 spazi tra i due numeri, il che ci dà:

12____________12

Quindi iniziamo il decremento:

12____________12
  111098765432

E questo finalmente ci dà:

1211109876543212

Come puoi vedere, la parte discendente termina con 2, non con 0 .

Compito

Dato un numero intero, maggiore di 1 , genera la sequenza decrescente come mostrato sopra.

Casi 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

Questo è , quindi vince l'invio con il minor numero di byte!


Lo spazio interno deve essere pieno di numeri interi o dovremmo tagliare i numeri se necessario? Non esiste un caso di prova al riguardo (per esempio 99)
edc65,

@ edc65 Dovresti tagliare i numeri se necessario. Ho aggiunto 99 come test case.
Adnan,

Risposte:


8

CJam, 11 10 byte

q4*~,W%s<\

Provalo online. Presuppone che sia presente una nuova riga finale nell'input. (Grazie a @ jimmy23013 per aver salvato un byte.)

Spiegazione

Alla fine di ogni riga appare l'aspetto della pila in quel punto (usando 4come esempio).

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 byte

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

Questa è una funzione anonima che accetta un numero intero e restituisce una stringa. Per chiamarlo, assegnarlo a una variabile.

Costruiamo e uniamo la sequenza discendente da n -1 a 0 e prendiamo i primi n caratteri dalla stringa risultante. Anticipiamo e aggiungiamo questo con l'input come stringa.

Verifica tutti i casi di test online


5

Haskell, 44 byte

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

Esempio di utilizzo: f 14-> "141312111098765414".


5

JavaScript (ES6), 55 52 byte

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

Modifica: salvato 3 byte grazie a @WashingtonGuedes.


@WashingtonGuedes Bah, non mi sembra mai di usarlo .keys().
Neil,

.keys()è come .reduce. Lo strumento giusto per il lavoro, ma trovi sempre qualcosa che può fare di meglio in quel caso particolare
edc65,

4

Python 2, 82 72 58 53 byte

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

Provalo qui!

Grazie a @Alex per avermi insegnato che repr(x)= `x`salvandomi un sacco di byte!


3

Pyth, 11 byte

++Q<jk_UQQQ

Due versioni alternative, che sono tutte anche 11 byte ( sospiro ):

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

Provalo qui.


3

Japt, 13 byte

U+Uo w ¬¯U +U

Provalo online!

Come funziona

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

Gelatina, 10 byte

Ȯ’r0DFḣ³Ḍ³

Provalo online!

Come funziona

Ȯ’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 byte

Poiché Vitsy non è a conoscenza di come ricavare stringhe dai numeri, ho implementato la ricerca della lunghezza del numero in cifre decimali nella seconda riga.

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

Spiegazione:

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.

Provalo online!

Modalità dettagliata per 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;

Sembra che la modalità verbosa sia sbagliata nella sua definizione di L, risolvendola ora (non aggiornerà la domanda però).
Addison Crump,

Solo curioso, come si impedisce l'esecuzione del metodo alla fine del programma? Il carattere newline è un segnale per tornare / uscire dal programma?
LegionMammal978,

@ LegionMammal978 Immagina che la prima riga di ogni programma Vitsy sia il metodo "principale" e che tutte le altre righe siano public static voidmetodi. Il principale termina il programma al termine. Per quanto riguarda il modo in cui ciò avviene, le istruzioni sono contenute in un tipo ArrayList<ArrayList<String[]>>, dove ogni riga è a String[]. Ogni metodo viene diviso nella riga nuova in base al modo in cui il file viene caricato, facendo sì che il metodo principale sia separato da tutti gli altri metodi.
Addison Crump,

Questo spiega perché sono necessari tre livelli. Quindi Stringsono le istruzioni, String[]i metodi sono (il primo è il metodo principale) e le ArrayList<String[]>classi (il primo è la classe principale), giusto?
LegionMammal978,

@ LegionMammal978 È tutto corretto. :)
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

Non sono sicuro che stiano valutando correttamente l'intervallo. Al momento del test, entrambi stampano solo metà dell'intervallo. cioè per $ 1 = 90, l'intervallo è solo fino a 45. Il mio sforzo è stato "for i in $ (eval echo {$ 1..0}); do echo -n $ i; done; echo $ 1"
rcjohnson

@rcjohnson Penso che sia il comportamento richiesto. Cosa ti aspetti che sia l'output per N = 90?
Trauma digitale

@rcjohnson ad es. per N = 12, l'output dovrebbe essere 12, quindi i primi 12 caratteri di 11..0(o 111098765432), e infine12
Digital Trauma,

Bene rileggendo la descrizione vedo che hai ragione. Il problema indica "spazi" non numeri interi.
rcjohnson,

@rcjohnson Sì, penso che la parte "spazi" si applichi solo ai passaggi intermedi. L'output finale dovrebbe essere solo una stringa di cifre.
Trauma digitale,

2

Retina, 63 byte

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

C'è ancora abbastanza spazio per giocare a golf ...

Provalo online!


Hm, Sto pensando a fare il $0in $0$*optional, così, quando la precedente token è una letterale, che non è un numero (come i vostri ys sono) ... vedendo questo mi potrebbe effettivamente attuare tale.
Martin Ender,

@ MartinBüttner Ho pensato che fosse la nuova funzionalità, ma non si è rivelato davvero. :)
randomra

No, attualmente funziona solo all'inizio della sostituzione. Detto questo, forse puoi cambiare il ruolo del primo e dell'ultimo numero per usarlo?
Martin Ender,

2

MATL , 15 byte

VG:qPVXvG:)GVhh

EDIT (20 maggio 2016) Utilizza il codice nel collegamento Xz invece di Xv, a causa di recenti cambiamenti nella lingua.

Provalo online!

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 byte

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

Rubino, 41 byte

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

1

Via Lattea 1.6.5 , 27 25 byte

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

Spiegazione

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>

Quale codifica utilizza la Via Lattea?
Adnan,

Uhhh ... UTF-8, penso ahah. @AandN
Zach Gates,

Ho ricevuto questo errore (sì, sono uno scumbag di Windows: p) durante il tentativo di eseguirlo. Ho incollato questo: I'::%{K£BCH=}<OHG<+<;+!in un file codificato UTF-8, ma non funziona.
Adnan,

Ecco un link al file che sto usando. @AandN
Zach Gates,

1

Perl 6 , 31 byte

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

1

Perl, 43 + 2 = 45 byte

Sono contento di non aver usato reversee nessuno dei due substr:

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

Richiede le -plbandiere.

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

Come funziona:

                                            # '-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 byte

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

Versione non golfata (con spiegazione):

#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

Il cast implicito da double a int ha h=floor(...)consentito l'uso del #define p(x)salvataggio di 5 byte.

Test su ideone.


1

R, 67 byte (come funzione)

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

R, 63 byte (input da STDIN)

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

1

Brainfuck, 265 byte

Funzionerà solo con numeri <10

Prova qui la versione golfata :

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

Ungolfed. Provalo qui :

>
,
---------- 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
++++++++++
++++++++++
++++++++++
++++++++
.

,>>++++++[<++++++++>-]<[-<->]<Questo può sottrarre 48 con una lunghezza del codice più breve
Leaky Nun,


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.