Cifre nelle loro corsie


32

Ingresso:

Un elenco di numeri interi

Produzione:

Inserisci ogni cifra (e il segno meno) nella sua corsia, nell'ordine -0123456789, ignorando le cifre duplicate.

Esempio:

Ingresso: [1,729,4728510,-3832,748129321,89842,-938744,0,11111]

Produzione:

-0123456789  <- Added as clarification only, it's not part of the output

  1         
   2    7 9
 012 45 78 
-  23    8 
  1234  789
   2 4   89
-   34  789
 0         
  1        

Regole della sfida:

  • Le cifre duplicate nel numero vengono ignorate.
  • L'I / O può essere in qualsiasi formato ragionevole. L'input può essere un elenco / array di stringhe o array di caratteri. L'output può essere un elenco di stringhe, caratteri, matrice di caratteri, ecc.
  • Gli spazi finali sono facoltativi.
  • Qualsiasi quantità di nuove righe iniziali o finali è facoltativa (ma non tra le righe).
  • L'input conterrà sempre almeno un numero intero
  • Dovrete supportare una gamma intero di almeno -2,147,483,648se 2,147,483,647(a 32 bit).
  • L'elenco di input non conterrà mai -0, 00(o più di due zero), né numeri interi con zero iniziali (cioè 012).
  • Se la tua lingua utilizza un simbolo diverso per i numeri negativi (come una parte superiore ¯), puoi anche usarlo, purché sia ​​coerente.
  • Puoi avere un delimitatore di spazio tra le cifre (quindi una riga senza 5 o 8 può essere al - 0 1 2 3 4 6 7 9posto di -01234 67 9), purché sia ​​coerente (e quindi dovrebbe esserci anche uno spazio tra -e 0).

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Sono vietate le scappatoie predefinite .
  • Se possibile, aggiungi un link con un test per il tuo codice.
  • Inoltre, si prega di aggiungere una spiegazione, se necessario.

Casi test:

Input: [1,729,4728510,-3832,748129321,89842,-938744,0,11111]
Output:
  1         
   2    7 9
 012 45 78 
-  23    8 
  1234  789
   2 4   89
-   34  789
 0         
  1        

Input: [4,534,4,4,53,26,71,835044,-3559534,-1027849356,-9,-99,-3459,-3459,-94593,-10234567859]
Output:
      4     
     345    
      4     
      4     
     3 5    
    2   6   
   1     7  
  0  345  8 
 -   345   9
 -0123456789
 -         9
 -         9
 -   345   9
 -   345   9
 -   345   9
 -0123456789

Input: [112,379,-3,409817,239087123,-96,0,895127308,-97140,923,-748]
Output:
  12       
   3    7 9
-  3       
 01 4   789
 0123   789
-      6  9
 0         
  123 5 789
-01  4  7 9
   23     9
-    4  78 

Input: [-15,-14,-13,-12,-11,10,-9,-8,-7,-5,-4,-3,-1,0,9,100,101,102,1103,104,105,106,116,-12345690]
Output:
- 1   5    
- 1  4     
- 1 3      
- 12       
- 1        
-01        
-         9
-        8 
-       7  
-     5    
-    4     
-   3      
- 1        
 0         
          9
 01        
 01        
 012       
 01 3      
 01  4     
 01   5    
 01    6   
  1    6   
-0123456  9

Input: [99,88,77,66,55,44,33,22,11,10,0,0,0,-941]
Output:
          9
         8 
        7  
       6   
      5    
     4     
    3      
   2       
  1        
 01        
 0         
 0         
 0         
- 1  4    9

Gli spazi tra le cifre sarebbero consentiti nell'output?
Shaggy,

Possiamo usare meno meno ¯invece di -?
Uriel,

Le cifre mancanti verrebbero comunque sostituite con spazi quindi, nel tuo esempio, ci sarebbero 3 spazi tra 4 e 6 e 7 e 9: "-0 1 2 3 4 <space> 6 7 <space> 9"(spazi multipli vengono compressi nei commenti, per qualche motivo)
Shaggy

1
Speravo di farti passare di soppiatto! : D Ben notato!
Shaggy,

Risposte:


4

Stax , 8 byte

║V≡u╝─é╢

Esegui ed esegui il debug

Ci vuole un numero per riga sull'input standard. Funziona trovando l'indice di destinazione di ciascun personaggio e assegnandolo a quell'indice del risultato. Se l'indice non ha limiti, l'array viene espanso con zero fino a quando non si adatta. Durante l'output, 0diventa uno spazio. Il resto sono codici di caratteri.

Disimballato, non golfato e commentato, ecco come si presenta.

m       for each line of input, execute the rest of the program and print the result
 zs     put an empty array under the line of input
 F      for each character code in the line of input, run the rest of the program
  Vd    "0123456789"
  I^    get the index of the character in this string and increment
  _&    assign this character to that index in the original string

Esegui questo


Come si intende inserire un elenco di lunghezza uno? (Se è solo il valore o il valore e una nuova riga non funziona.)
Jonathan Allan

1
Oh sì, buon punto. È una forma alternativa di input che funziona anche per valori singoli ["7"]. Questo formato può anche gestire più valori come ["34", "43"].
ricorsivo il

6

05AB1E , 13 byte

Codice:

v'-žh«DyмSð:,

Utilizza la codifica 05AB1E . Provalo online!

Spiegazione:

v               # For each element in the input..
 '-žh«          #   Push -0123456789
      D         #   Duplicate this string
       yм       #   String subtraction with the current element
                    e.g. "-0123456789" "456" м  →  "-0123789"
         Sð:    #   Replace all remaining elements with spaces
                    e.g. "-0123456789" "-0123789" Sð:  →  "     456   "
            ,   #   Pop and print with a newline

1
Bello! Seguire la rotta di sostituzione era più breve della rotta di inserimento che vedo :)
Emigna,

2
@Emigna L'insert-route è anche un approccio molto interessante. In effetti, penso che puoi salvare 4 byte con vðTúyvyÐd+ǝ},;).
Adnan,

1
Brillante! Non sapevo che ǝavrebbe funzionato così -0. Ma ora che me ne occupo, in realtà è un numero e non una stringa, come l'ho letto per la prima volta come: P
Emigna,

Ooooof ... Ero a 23bytes. Il 05AB1E (gioco di parole sull'umanità).
Magic Octopus Urn


4

JavaScript, 59 58 byte

Input e output come una matrice di stringhe.

a=>a.map(x=>`-0123456789`.replace(eval(`/[^${x}]/g`),` `))

Provalo

o.innerText=(g=s=>(f=
a=>a.map(x=>`-0123456789`.replace(eval(`/[^${x}]/g`),` `))
)(s.split`,`).join`\n`)(i.value="1,729,4728510,-3832,748129321,89842,-938744,0,11111");oninput=_=>o.innerText=g(i.value)
input{width:100%;}
<input id=i><pre id=o></pre>


Originale

Accetta l'input come una matrice di stringhe e genera una matrice di array di caratteri

a=>a.map(x=>[...`-0123456789`].map(y=>-~x.search(y)?y:` `))


1
una soluzione così elegante, mi piace molto.
Brian H.


3

05AB1E , 17 13 byte

Salvati 4 byte grazie ad Adnan

vðTúyvyÐd+ǝ},

Provalo online!

Spiegazione

v               # loop over elements y in input
 ðTú            # push a space prepended by 10 spaces
    yv          # for each element y in the outer y
      y         # push y
       Ðd+      # push y+isdigit(y)
          ǝ     # insert y at this position in the space-string
           }    # end inner loop
            ,   # print

3

Rubino , 42 byte

Lambda anonima che elabora la matrice di numeri:

->a{a.map{|n|"-0123456789".tr"^#{n}",?\s}}

Provalo online!

In alternativa, un programma completo completamente simile a Perl è molto più breve. Direi che gli -plinterruttori sembrano abbastanza divertenti in questo contesto:

Rubino -pl , 29 byte

$_="-0123456789".tr"^#$_"," "

Provalo online!

Infine, è possibile quanto segue se è accettabile che le stringhe di output vengano quotate:

Rubino -n , 27 byte

p"-0123456789".tr ?^+$_,?\s

Provalo online!


3

JavaScript (Node.js) , 60 byte

  • Grazie a @Andrew Taylor per aver ridotto il join (8 caratteri)
  • Grazie a @Yair Rand per X.match (8 caratteri)
a=>a.map(X=>"-0123456789".replace(/./g,x=>X.match(x)?x:" "))

Provalo online!


Oh, quel jointrucco è adorabile - ma la domanda sembra una matrice di stringhe è l'output OK, quindi forse puoi radere 8 byte rimuovendolo?
Andrew Taylor,

Abbastanza sicuro che puoi salvarne un altro sostituendolo (X+"").includes(x)conRegExp(x).test(X)
Andrew Taylor,

(X+"").match(x)sarebbe ancora più breve. La domanda consente inoltre all'input di essere un array di stringhe, quindi potrebbe anche esserlo X.match(x).
Yair Rand,

2

Japt , 16 byte

Input e output come una matrice di stringhe.

£Ao ¬i- ®iS gXøZ

Provalo


Spiegazione

£                    :Map over each element X
 Ao                  :  Range [0,10)
    ¬                :  Join to a string
     i-              :  Prepend "-"
        ®            :  Map over each character Z
         iS          :    Prepend a space
            g        :    Get the character at index
             XøZ     :      X contains Z? (true=1, false=0)

2

Python 3 , 77 64 byte

-12 byte grazie a @Rod

lambda x:[[[" ",z][z in str(y)]for z in"-0123456789"]for y in x]

Provalo online!

Il mio primo vero tentativo di giocare a golf a Python. Consiglio benvenuto!

Restituisce una matrice 2D di caratteri.


1
Puoi usare '-0123456789'invece range(10)e rilasciare il primo blocco e scambiare str(z)con z, puoi anche passare a python2 e usare `y`invece str(y)( ``è + - equivalente a repr)
Rod

Spazio superfluo in in "-.
Jonathan Frech,


2

Haskell , 47 byte

map(\s->do d<-"-0123456789";max" "[d|elem d s])

Provalo online!

Utilizza maxper inserire uno spazio in cui non esiste alcun elemento, poiché uno spazio è più piccolo di qualsiasi cifra o segno meno.

Se un numero empio di spazi finali è OK, è possibile salvare due byte:

45 byte

map(\s->do d<-'-':['0'..];max" "[d|elem d s])

Provalo online!


2

MATL , 13 byte

"45KY2ht@gm*c

L'input è un array di celle di stringhe. Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

         % Implicit input: cell array of strings, for example {'1','729',...,'11111'}
"        % For each cell
  45     %   Push 45 (ASCII code of '-')
  KY2    %   Push predefined literal '0123456789'
  h      %   Concatenate horizontally: gives '-0123456789'
  t      %   Duplicate
  @      %   Push current cell, for example {'729'}
  g      %   Convert cell to matrix. This effectively gives the cell's contents, '729'
  m      %   Ismember: gives an array of zeros and ones indicating membership of each
         %   char from '-0123456789' in '729'. The result in the example is
         %   [0 0 0 1 0 0 0 0 1 0 1]
  *      %   Multiply, element-wise. Chars are implicity converted to ASCII 
         %   Gives the array [0 0 0 50 0 0 0 0 55 0 57] 
  c      %   Convert ASCII codes to chars. 0 is displayed as space. Gives the string
         %   '   2    7 9'
         % Implicit end
         % Implicilly display each string on a different line

2

J , 32 27 byte

-5 byte grazie a FrownyFrog!

10|.":(10<."."0@[)}11$' '"0

Provalo online!

Soluzione originale:

J , 32 byte

(('_0123456789'i.[)}11$' '"0)@":

Spiegazione:

@": convertire in caratteri e

}11$' '"0 cambia il contenuto di un array di 11 spazi in questi caratteri

'_0123456789'i.[ nei punti indicati dagli indici dei personaggi in questo elenco

Provalo online!


1
10|.":(10<."."0@[)}11$' '"0
FrownyFrog,

@FrownyFrog Bella soluzione, grazie!
Galeno Ivanov,

2

Fogli Google , 124 byte

=Transpose(ArrayFormula(If(IsError(Find(Mid("-0123456789",Row($1:$11),1),Split(A1,",")))," ",Mid("-0123456789",Row($1:$11),1

L'input è un elenco separato da virgole nella cella A1. L'output è compreso nell'intervallo in B1:L?cui ?sono state immesse molte voci. (Puoi inserire la formula dove vuoi, ho appena scelto B1per comodità.) Nota che Fogli aggiungerà automaticamente quattro parentesi di chiusura alla fine della formula, salvandoci quei quattro byte.

Immagine dello schermo

Un altro caso di test e un altro caso di prova

Spiegazione:

  • Mid("-0123456789",Row($1:$11),1) sceglie ciascuno degli 11 personaggi a turno.
  • Find(Mid(~),Split(A1,","))cerca quei caratteri in ciascuno degli elementi di input. Ciò restituisce un valore numerico o, se non viene trovato, un errore.
  • If(IsError(Find(~)," ",Mid(~))restituirà uno spazio se il personaggio non è stato trovato o il personaggio se lo è stato. (Vorrei che ci fosse un modo per evitare di duplicare la Mid(~)porzione ma non ne conosco una.)
  • ArrayFormula(If(~))è ciò che rende i riferimenti multi-cella in Mid(~)eFind(~) funzionano i . È anche ciò che rende una formula in una cella restituendo valori in più celle.
  • Transpose(ArrayFormula(~)) trasporre l'array restituito perché inizia lateralmente.

2

Gelatina , 12 byte

ØD”-;¹⁶e?€Ʋ€

Provalo online!

-2 grazie a Jonathan Allan legge una regola che non ho rispettato.

Si noti che il formato I / O utilizzato nel collegamento TIO non è quello effettivo, che viene immesso come elenco di rappresentazioni di stringhe e output come elenco di righe.


1

Perl 6 , 35 byte

{.map:{map {m/$^a/||' '},'-',|^10}}

Provalo online!

L'output è una matrice di caratteri contenente corrispondenze regex o caratteri spaziali.


Se "l'input può essere in qualsiasi formato ragionevole" potrebbe essere stdin, allora presumibilmente -peti permetterebbe di rinunciare alla .map iniziale, parentesi graffe e scambio $^aper$_
Phil H

@PhilH -pe in -nqualche modo sembrano buggy, almeno su TIO. Per qualche motivo $_non viene passato ai blocchi. Vedi esempio 1 , esempio 2 .
nwellnhof,

1

Java 8, 53 byte

a->a.map(i->"-0123456789".replaceAll("[^"+i+"]"," "))

La mia sfida è più semplice di quanto pensassi che fosse quando l'ho fatta ..

Input e output entrambi come a java.util.stream.Stream<String>.

Spiegazione:

Provalo online.

a->                              // Method with String-Stream as both input and return-type
  a.map(i->                      //  For every String in the input:
    "-0123456789"                //   Replace it with "-0123456789",
    .replaceAll("[^"+i+"]"," ")) //   with every character not in `i` replaced with a space

1

C (gcc) , 159 byte

f(A,l,j,k,b)long*A,k;{char*s,S[99];for(j=~0;++j<l;puts(""))for(sprintf(S,"%ld",k=A[j]),putchar(k<0?45:32),k=47;++k<58;putchar(b?32:k))for(b=s=S;*s;b*=*s++-k);}

Provalo online!


1

R , 96 75 byte

for(i in scan())cat(paste(gsub(paste0("[^",i,"]")," ","-0123456789"),"\n"))

Provalo online!

Grazie a Kevin Cruijssen per aver suggerito questo approccio regex!

Prende input da stdin come interi separati da spazi bianchi e stampa l'ascii-art su stdout.


Non so R troppo bene, quindi sono sicuro che possa essere giocato a golf ulteriormente, ma questo approccio diverso è 12 byte più breve: function(N)for(i in N)cat(paste(gsub(paste("[^","]",sep=i)," ","-0123456789"),"\n")). (Inserire come array di stringhe anziché come array di numeri interi.) Provalo online.
Kevin Cruijssen,

@KevinCruijssen ah, bello, sì, posso anche giocare a golf.
Giuseppe,

1

SOGL V0.12 , 14 13 byte

{ø,{²²⁴WI1ž}P

Provalo qui!

Spiegazione:

{ø,{²²⁴WI1ž}P

{            repeat input times
 ø,            push an empty string and the next input above that
   {       }   for each character in the input
    ²²           push "0123456789"
      ⁴          copy the character on top
       W         and get it's index in that string (1-indexed, 0 for the non-existent "-")
        I        increment that (SOGL is 1-indexed, so this is required)
         1ž      at coordinates (index; 1) in the string pushed earlier, insert that original copy of the character
            P  print the current line

1

SNOBOL4 (CSNOBOL4) , 85 byte

I	X =INPUT	:F(END)
	S ='-0123456789'
R	S NOTANY(X ' ') =' '	:S(R)
	OUTPUT =S	:(I)
END

Provalo online!

I	X =INPUT	:F(END)		;* read input, if none, goto end
	S ='-0123456789'		;* set the string
R	S NOTANY(X ' ') =' '	:S(R)	;* replace characters of S not in X + space with space
	OUTPUT =S	:(I)		;* print S, goto I
END

1

Pyth, 14 byte

VQm*d}dNs+\-UT

Accetta input come elenco di stringhe e genera un elenco di stringhe per ogni riga.
Provalo qui

Spiegazione

VQm*d}dNs+\-UT
VQ                For each string in the input...
  m     s+\-UT    ... and each character in "-0123456789"...
     }dN          ... check if the character is in the string...
   *d             ... and get that character or an empty string.

1

Retina , 26 byte

%"-0123456789"~`.+
[^$&]¶ 

Provalo online! Nota: spazio finale. Spiegazione: %esegue la fase figlio ~una volta per ogni riga di input. ~per prima cosa esegue la sua fase figlio, che avvolge la linea [^e ]<CR><SP>, producendo un programma che sostituisce i caratteri non nella linea con spazi. I "-0123456789"specifica che l'ingresso al programma è la stringa data ( $sostituzioni sono ammessi, ma io non ne hanno bisogno).


1

Perl 5 -n , 30 byte

Non funzionerebbe se -potesse apparire altrove rispetto alla prima posizione

#!/usr/bin/perl -n
say"-0123456789"=~s/[^$_]/ /gr

Provalo online!


Non funzionerebbe se -potesse apparire altrove rispetto alla prima posizione se ciò può essere vero, allora non stai rispondendo a questa sfida, dal momento che non sarebbero più numeri interi. : P
Erik the Outgolfer


1

CJam , 20 byte

qS%{'-10,+s_@-SerN}/

Provalo online!

Accetta input come elenco di numeri interi separati da spazio. Praticamente lo stesso approccio della risposta di @adnans.


1

C (gcc) , 95 94 byte

c,d;f(l,n)char**l;{for(;n--;l++)for(c=0;c<12;)putchar(strchr(*l,d=c++?c+46:45)?d:d^58?32:10);}

Provalo online!

Immettere sotto forma di un elenco di stringhe. Uscita su STDOUT.


È possibile giocare a golf un byte rimuovendo c++e cambiando d=c?c+47:in d=c++?c+46:.
Kevin Cruijssen,

1

K4 , 30 27 byte

Soluzione:

{?[a in$x;a:"-",.Q.n;" "]}'

Esempio:

q)k){?[a in$x;a:"-",.Q.n;" "]}'1 729 4728510 -3832 748129321 89842 -938744 0 11111
"  1        "
"   2    7 9"
" 012 45 78 "
"-  23    8 "
"  1234  789"
"   2 4   89"
"-   34  789"
" 0         "
"  1        "

Spiegazione:

Restituisce "-0123 ..." o "" in base all'input. Interpretato da destra a sinistra. Nessuna competizione per la risposta APL :(

{?[a in$x;a:"-",.Q.n;" "]}' / the solution
{                        }' / lambda for each
 ?[      ;          ;   ]   / if[cond;true;false]
                .Q.n        / string "0123456789"
            "-",            / join with "-"
          a:                / save as a
       $x                   / convert input to string
   a in                     / return boolean list where each a in x
                     " "    / whitespace (return when false)

0

APL + WIN, 33 byte

Richiede l'inserimento dello schermo come stringa

n←11⍴' '⋄n['-0123456789'⍳s]←s←⎕⋄n
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.