Ziffern in ihren Gassen


32

Eingang:

Eine Liste von ganzen Zahlen

Ausgabe:

Platzieren Sie jede Ziffer (und das Minuszeichen) in der angegebenen Reihenfolge auf einer eigenen Spur -0123456789, wobei doppelte Ziffern ignoriert werden.

Beispiel:

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

Ausgabe:

-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        

Herausforderungsregeln:

  • Doppelte Ziffern in der Nummer werden ignoriert.
  • I / O kann in jedem vernünftigen Format vorliegen. Die Eingabe kann als Liste / Array von Zeichenfolgen oder als Zeichen-Array erfolgen. Die Ausgabe kann als Liste von Zeichenfolgen, Zeichen, Zeichenmatrix usw. erfolgen.
  • Nachgestellte Leerzeichen sind optional.
  • Beliebig viele führende oder nachfolgende neue Zeilen sind optional (jedoch nicht zwischen den Zeilen).
  • Die Eingabe enthält immer mindestens eine Ganzzahl
  • Sie werden eine ganze Reihe von zumindest unterstützen , -2,147,483,648obwohl 2,147,483,647(32-Bit).
  • Die Eingangsliste wird nie enthalten -0, 00(oder mehr als zwei Nullen) oder ganze Zahlen mit führenden Nullen (dh 012).
  • Wenn Ihre Sprache ein anderes Symbol für negative Zahlen verwendet (wie ein oberes ¯), können Sie dieses auch verwenden, sofern es konsistent ist.
  • Zwischen den Ziffern darf ein Leerzeichen stehen (also kann eine Zeile ohne 5 oder 8 - 0 1 2 3 4 6 7 9anstelle von stehen -01234 67 9), solange dies konsistent ist (und daher sollte auch ein Leerzeichen zwischen -und stehen 0).

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.

Testfälle:

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

Wären Leerzeichen zwischen den Ziffern in der Ausgabe zulässig?
Shaggy

Können wir das obere Minus ¯anstelle von verwenden -?
Uriel

Die fehlenden Ziffern noch mit Leerzeichen ersetzt werden würde , so, in Ihrem Beispiel würde es 3 Räume zwischen 4 und 6 und 7 & 9: "-0 1 2 3 4 <space> 6 7 <space> 9"(Mehrere Räume in den Kommentaren kollabiert bekommen, aus irgendeinem Grund)
Shaggy

1
Ich hatte gehofft, diesen an dir vorbei zu schleichen! : D Gepunktet!
Shaggy

Antworten:


4

Stax , 8 Bytes

║V≡u╝─é╢

Führen Sie es aus und debuggen Sie es

Bei Standardeingabe wird eine Nummer pro Zeile benötigt. Sie ermittelt den Zielindex jedes Zeichens und ordnet ihn diesem Index des Ergebnisses zu. Wenn der Index außerhalb der Grenzen liegt, wird das Array mit Nullen erweitert, bis es passt. Während der Ausgabe 0wird ein Leerzeichen. Der Rest sind Zeichencodes.

Ausgepackt, ungolfed und kommentiert, so sieht es aus.

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

Führen Sie dieses aus


Wie soll man eine Liste der Länge eins eingeben? (Wenn es nur der Wert oder der Wert und eine neue Zeile ist, funktioniert es nicht.)
Jonathan Allan

1
Oh ja, guter Punkt. Eine alternative Form der Eingabe, die auch für einzelne Werte funktioniert, ist ["7"]. Dieses Format kann auch mehrere Werte verarbeiten, z ["34", "43"].
rekursive

6

05AB1E , 13 Bytes

Code:

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

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Erläuterung:

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
Nett! Die Ersetzungsroute war kürzer als die Einfügungsroute, die ich sehe :)
Emigna

2
@Emigna Die Insert-Route ist auch ein sehr interessanter Ansatz. Tatsächlich denke ich, dass Sie mit vðTúyvyÐd+ǝ},;) 4 Bytes sparen können .
Adnan

1
Brillant! Ich wusste nicht, dass ǝdas so weiter funktionieren würde -0. Aber jetzt, wo ich es verstehe, ist es tatsächlich eine Zahl und keine Zeichenkette, wie ich es zum ersten Mal las: P
Emigna

Ooooof ... ich war bei 23bytes. Der 05AB1E (Wortspiel auf die Menschheit).
Magic Octopus Urn


4

JavaScript, 59 58 Bytes

Eingabe und Ausgabe als Array von Zeichenfolgen.

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

Versuch es

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>


Original

Nimmt Eingaben als ein Array von Zeichenfolgen und gibt ein Array von Zeichenarrays aus

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


1
so eine elegante lösung gefällt mir sehr gut.
Brian H.


3

05AB1E , 17 13 Bytes

4 Bytes gespart dank Adnan

vðTúyvyÐd+ǝ},

Probieren Sie es online!

Erläuterung

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

Rubin , 42 Bytes

Anonymes Lambda, das das Array von Zahlen verarbeitet:

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

Probieren Sie es online!

Alternativ ist ein vollständig Perl-ähnliches Vollprogramm viel kürzer. Ich würde sagen, -plSchalter sehen in diesem Zusammenhang ziemlich lustig aus:

Ruby -pl , 29 Bytes

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

Probieren Sie es online!

Schließlich ist Folgendes möglich, wenn die Ausgabezeichenfolgen in Anführungszeichen gesetzt werden dürfen:

Ruby -n , 27 Bytes

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

Probieren Sie es online!


3

JavaScript (Node.js) , 60 Byte

  • Vielen Dank an @Andrew Taylor für die Reduzierung des Joins (8 Zeichen)
  • Vielen Dank an @Yair Rand für X.match (8 Zeichen)
a=>a.map(X=>"-0123456789".replace(/./g,x=>X.match(x)?x:" "))

Probieren Sie es online!


Oh, dieser joinTrick ist reizend - aber die Frage lautet, dass ein Array von Zeichenfolgen in Ordnung ausgegeben wird. Vielleicht können Sie 8 Bytes rasieren, indem Sie es entfernen?
Andrew Taylor

Sie können (X+"").includes(x)mit ziemlicher Sicherheit einen anderen retten, indem Sie ihn durchRegExp(x).test(X)
Andrew Taylor

(X+"").match(x)wäre noch kürzer. Die Frage ermöglicht es auch, dass die Eingabe ein Array von Zeichenfolgen ist, so dass dies sogar möglich ist X.match(x).
Yair Rand

2

Japt , 16 Bytes

Eingabe und Ausgabe als Array von Zeichenfolgen.

£Ao ¬i- ®iS gXøZ

Versuch es


Erläuterung

£                    :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 Bytes

-12 Bytes dank @Rod

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

Probieren Sie es online!

Mein erster richtiger Golfversuch in Python. Beratung willkommen!

Gibt ein 2D-Array von Zeichen zurück.


1
Sie können '-0123456789'stattdessen verwenden range(10)und den ersten Block ablegen und str(z)mit tauschen z. Sie können auch zu python2 wechseln und `y`stattdessen verwenden str(y)( ``entspricht + - repr)
Rod

Überflüssiger Platz in in "-.
Jonathan Frech


2

Haskell , 47 Bytes

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

Probieren Sie es online!

Fügt maxein Leerzeichen ein, bei dem kein Element vorhanden ist, da ein Leerzeichen kleiner als eine Ziffer oder ein Minuszeichen ist.

Wenn eine gottlose Anzahl von nachgestellten Leerzeichen in Ordnung ist, können zwei Bytes gespeichert werden:

45 Bytes

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

Probieren Sie es online!


2

MATL , 13 Bytes

"45KY2ht@gm*c

Die Eingabe ist ein Zellenarray von Zeichenfolgen. Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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

-5 Bytes dank FrownyFrog!

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

Probieren Sie es online!

Ursprüngliche Lösung:

J , 32 Bytes

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

Erläuterung:

@": in Zeichen umwandeln und

}11$' '"0 Ändern Sie den Inhalt eines Arrays mit 11 Leerzeichen in diese Zeichen

'_0123456789'i.[ an den Stellen, die durch die Indizes der Zeichen in dieser Liste angegeben sind

Probieren Sie es online!


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

@FrownyFrog Schöne Lösung, danke!
Galen Ivanov

2

Google Sheets , 124 Bytes

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

Die Eingabe ist eine durch Kommas getrennte Liste in der Zelle A1. Die Ausgabe liegt in dem Bereich, B1:L?in dem ?jedoch viele Einträge eingegeben wurden. (Sie können die Formel beliebig platzieren. Ich habe sie nur aus Gründen der B1Übersichtlichkeit ausgewählt.) Beachten Sie, dass Sheets automatisch vier schließende Klammern am Ende der Formel anfügt und uns diese vier Bytes erspart.

Bildschirmfoto

Ein weiterer Testfall und ein weiterer Testfall

Erläuterung:

  • Mid("-0123456789",Row($1:$11),1) wählt nacheinander jedes der 11 Zeichen aus.
  • Find(Mid(~),Split(A1,","))sucht nach diesen Zeichen in jedem der Eingabeelemente. Dies gibt entweder einen numerischen Wert oder einen Fehler zurück, falls dieser nicht gefunden wird.
  • If(IsError(Find(~)," ",Mid(~))Gibt ein Leerzeichen zurück, wenn das Zeichen nicht gefunden wurde, oder das Zeichen, wenn es gefunden wurde. (Ich wünschte, es gäbe einen Weg, um zu vermeiden, dass das dupliziert wirdMid(~) Teils aber ich kenne keinen.)
  • ArrayFormula(If(~))Das ist es, was die mehrzelligen Referenzen in Mid(~)und Find(~)funktionieren lässt. Es ist auch das, was eine Formel in einer Zelle dazu bringt, Werte in mehreren Zellen zurückzugeben.
  • Transpose(ArrayFormula(~)) transponieren Sie das zurückgegebene Array, da es seitwärts beginnt.

2

Gelee , 12 Bytes

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

Probieren Sie es online!

-2 Danke an Jonathan Allan , der eine Regel gelesen hat, die ich nicht gelesen habe.

Beachten Sie, dass das in der TIO-Verbindung verwendete E / A-Format nicht das tatsächliche Format ist, das als Liste von Zeichenfolgendarstellungen eingegeben und als Liste von Zeilen ausgegeben wird.


1

Perl 6 , 35 Bytes

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

Probieren Sie es online!

Die Ausgabe ist eine Zeichenmatrix, die entweder Regex-Übereinstimmungen oder Leerzeichen enthält.


Wenn 'Eingaben in einem vernünftigen Format möglich sind' stdin sein könnte, dann -pewürden Sie vermutlich auf die anfängliche .map, geschweifte Klammern und den Austausch $^afür$_
Phil H

@PhilH -pund -nscheinen irgendwie fehlerhaft , zumindest auf TIO. Aus irgendeinem Grund $_wird nicht an Blöcke übergeben. Siehe Beispiel 1 , Beispiel 2 .
Nwellnhof

1

Java 8, 53 Bytes

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

Meine eigene Herausforderung ist einfacher als ich dachte, als ich es geschafft habe.

Ein- und Ausgabe sowohl als java.util.stream.Stream<String> .

Erläuterung:

Probieren Sie es online aus.

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

R , 96 75 Bytes

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

Probieren Sie es online!

Vielen Dank an Kevin Cruijssen, der diesen Regex-Ansatz vorgeschlagen hat!

Übernimmt die Eingabe von stdin als durch Leerzeichen getrennte Ganzzahlen und druckt die ASCII-Grafik in stdout.


Ich weiß nicht , R zu gut, also bin ich sicher , kann sie weiter golfed werden, aber diese anderen Ansatz ist 12 Bytes kürzer: function(N)for(i in N)cat(paste(gsub(paste("[^","]",sep=i)," ","-0123456789"),"\n")). (Eingabe als String-Array statt als Integer-Array.) Probieren Sie es online aus.
Kevin Cruijssen

@ KevinCruijssen ah, schön, ja, ich kann das auch runter spielen.
Giuseppe

1

SOGL V0.12 , 14 13 Bytes

{ø,{²²⁴WI1ž}P

Probieren Sie es hier aus!

Erläuterung:

{ø,{²²⁴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 Bytes

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

Probieren Sie es 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 Bytes

VQm*d}dNs+\-UT

Nimmt Eingaben als Liste von Zeichenfolgen und gibt eine Liste von Zeichenfolgen für jede Zeile aus.
Probieren Sie es hier aus

Erläuterung

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

Netzhaut , 26 Bytes

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

Probieren Sie es online! Hinweis: Leerzeichen am Ende. Erläuterung: %Führt die untergeordnete Stufe ~einmal für jede Eingabezeile aus. ~Führt zuerst die untergeordnete Stufe aus, die die Zeile umschließt [^und ]<CR><SP>ein Programm erstellt, das Zeichen, die nicht in der Zeile stehen, durch Leerzeichen ersetzt. Das "-0123456789"gibt an, dass die Eingabe für dieses Programm die angegebene Zeichenfolge ist ( $Ersetzungen sind zulässig, aber ich brauche sie nicht).


1

Perl 5 -n , 30 Bytes

Würde nicht funktionieren wenn - es irgendwo anders als auf der ersten Position erscheinen könnte

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

Probieren Sie es online!


Würde nicht funktionieren, wenn -es irgendwo anders auftauchen könnte als auf der ersten Position, wenn dies zutrifft, dann beantworten Sie diese Herausforderung nicht, da es sich nicht mehr um ganze Zahlen handelt. : P
Erik der Outgolfer



1

C (GCC) , 95 94 Bytes

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

Probieren Sie es online!

Eingabe in Form einer Liste von Zeichenfolgen. Ausgabe an STDOUT.


Sie können Golf spielen ein Byte durch das Entfernen c++und Ändern d=c?c+47:an d=c++?c+46:.
Kevin Cruijssen

1

K4 , 30 27 Bytes

Lösung:

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

Beispiel:

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        "

Erläuterung:

Rückgabe "-0123 ..." oder "" basierend auf der Eingabe. Von rechts nach links interpretiert. Keine Konkurrenz für die APL-Antwort :(

{?[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 Bytes

Fordert zur Eingabe des Bildschirms als Zeichenfolge auf

n←11⍴' '⋄n['-0123456789'⍳s]←s←⎕⋄n
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.