Die führenden Nullen fordern heraus

31

Die Herausforderung

Geben Sie zwei Ganzzahlen als Eingabe ( xund y) ein und geben Sie sie xals Zeichenfolge mit so vielen führenden Nullen aus, dass die yZeichen ohne Vorzeichen lang sind.

Regeln

  • Wenn xmehr als yZiffern vorhanden sind, wird die Ausgabe xohne Änderung als Zeichenfolge ausgeführt.

  • Die Ausgabe als Ganzzahl wird nicht akzeptiert, auch wenn keine führenden Nullen vorhanden sind.

  • Wenn xnegativ, behalten Sie den Ist- Zustand bei -und arbeiten Sie mit dem Absolutwert.

  • Negativ ysollte als 0 behandelt werden, was bedeutet, dass Sie so ausgeben, xwie es ist (aber als Zeichenfolge)

Beispiele:

IN: (1,1)   OUT: "1"
IN: (1,2)   OUT: "01"
IN: (10,1)  OUT: "10"
IN: (-7,3)  OUT: "-007"
IN: (-1,1)  OUT: "-1"
IN: (10,-1) OUT: "10"
IN: (0,0)   OUT: "0"
IN: (0,1)   OUT: "0"
IN: (0,4)   OUT: "0000"

Kürzester Code in Bytes gewinnt, Standardlücken gelten.

Brian H.
quelle
1
Kann ich x als String nehmen?
LiefdeWen
was gibt (-1,1)es
Adám
@ Adám hat es zu den Beispielen hinzugefügt.
Brian H.
1
Ist ein +Vorzeichen für positive Zahlen akzeptabel?
Tom Carpenter

Antworten:

4

Japt , 13 8 Bytes

Nimmt die erste Eingabe ( x) als Zeichenfolge.

®©ùTV}'-

Versuch es

Dank ETHproductions konnten satte 5 Bytes eingespart werden.


Erläuterung

Implizite Eingabe von Zeichenfolge U=xund Ganzzahl V=y.

® }'-Teilt sich Uin ein Array auf dem Minus-Symbol, ordnet es darüber zu und fügt es einer Zeichenfolge mit einem Minus-Symbol wieder hinzu.

©&&Ist logisch AND ( ), wenn das aktuelle Element wahr ist (eine nicht leere Zeichenfolge), füllen Sie left ( ù) mit 0 ( T) auf V.

Zottelig
quelle
Schön! Sie können einiges sparen, indem Sie einfach Folgendes-
zuordnen
@ETHproductions: Großartiger Anruf. Vielen Dank. Es ist schon so lange her, dass ich völlig vergessen habe, dass Sie eine Zeichenfolge in einer Methode teilen, zuordnen und wieder zusammenfügen können!
Shaggy
Ja, ich nehme an, dass die Funktionalität verschoben werden qsollte q-_©ùTV, um dann 1 Byte zu sparen :-)
ETHproductions
@ETHproductions, wenn ich das richtig verstehe, schlagen Sie vor, dass, wenn eine Funktion als zweites Argument von übergeben wird S.q()(uns zu geben S.q(s,f)), dann Saufgespalten s, durchlaufen fund wieder verbunden würde s? Ich mag das! :)
Shaggy
Ja, habe ich zu Oliver reden und nicht Sie , das zu tun (wenn eine Funktion übergeben, tut die normale Funktionalität, durch die Funktion ausführen, und lösen Sie die erste Änderung, N.s, S/A.y, N.ìtun dies bereits) mit einem Bündel von Methoden? Ich hatte ein Gespräch mit jemandem, ich kann mich nur nicht erinnern, wer jetzt ist: s
ETHproductions
6

05AB1E , 11 10 Bytes

Eingabe erfolgt als amount_of_digits, number

ÎIÄg-×ì'-†

Probieren Sie es online!

Erläuterung

Î            # push 0 and first input
 IÄ          # push the absolute value of the second input
   g         # length
    -        # subtract, (input1-len(abs(input2))
     ×       # repeat the zero that many times
      ì      # prepend to the second input
       '-†   # move any "-" to the front
Emigna
quelle
Scheint so, als ob dies die beste Antwort ist. Wenn es morgen nicht besser wird, werde ich es akzeptieren.
Brian H.
Sie wurden outgolfed :(
Brian H.
@BrianH. In der Tat habe ich :)
Emigna
6

Python, 29 Bytes

Eingabe übernehmen als f(x,y). Verwenden des Python- %Operators

lambda x,y:'%0*d'%(y+(x<0),x)

Probieren Sie es online!

Colera Su
quelle
5

C #, 56 Bytes

Probieren Sie es online!

a=>b=>(a<0?"-":"")+((a<0?-a:a)+"").PadLeft(b<0?0:b,'0')
LiefdeWen
quelle
5

Java (OpenJDK 8) , 47 Byte

x->y->"".format("%0"+((y<1?1:y)-(x>>31))+"d",x)

Probieren Sie es online!

Anfangs dachte ich, einfach, maximal 30 Zeichen (was ziemlich kurz ist, wenn man Strings in Java manipuliert). Dann passierten die Ausnahmen.

Olivier Grégoire
quelle
5

JavaScript (ES6), 42

Rekursiv, Parameter in umgekehrter Reihenfolge, zuerst y, dann x. Und Currys

y=>r=x=>x<0?'-'+r(-x):`${x}`.padStart(y,0)

Prüfung

var F=
y=>r=x=>x<0?'-'+r(-x):`${x}`.padStart(y,0)

;`IN: (1,1)   OUT: "1"
IN: (1,2)   OUT: "01"
IN: (10,1)  OUT: "10"
IN: (-7,3)  OUT: "-007"
IN: (-1,1)  OUT: "-1"
IN: (10,-1) OUT: "10"
IN: (0,0)   OUT: "0"
IN: (0,1)   OUT: "0"
IN: (0,4)   OUT: "0000"`
.split(`\n`).map(r => r.match(/[-\d]+/g))
.forEach(([x,y,k])=>{
  o = F(y)(x)
  ok = o == k
  console.log(ok?'OK':'KO',x,y,'->', o)
})

edc65
quelle
Ich finde, dass diese Antwort zwar beeindruckend ist, aber die Regeln leicht umgeht, indem sie die Funktion definiert und f(y)(x)nicht f(x,y).
Styletron
Als ich mich mit den "Currying" -Regeln befasste, wollte ich hinzufügen, dass mein Einwand eher bei den umgekehrten Parametern und nicht beim Currying selbst lag.
Styletron
1
@styletron Die Reihenfolge der Parameter ist in der Challenge nicht angegeben. Also kann ich das ausnutzen
edc65
Dang, y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)kommt so nah ...
ETHproductions
Ich habe keine Probleme mit Menschen, die die Eingabereihenfolge umkehren.
Brian H.
5

Python 3.6 , 28 37 Bytes

lambda x,y:f'{x:0{(y,0)[y<0]+(x<0)}}'

Probieren Sie es online! (Testfall aus der Antwort von Colera Su)

Nutzen Sie die neue Methode zum Formatieren von Zeichenfolgen in Python 3.6

+9 Bytes zu handhaben y<0

Lescurel
quelle
Sieht so aus, als ob dies fehlschlägt, wenn yes negativ ist: tio.run/##K6gsycjPM/…
Shaggy
Tatsächlich. Also bin ich mit 37 Bytes fertig.
Lescurel
5

Bash, 27 , 25 Bytes

-2 Bytes dank Bruce Forte

printf %0$[$2+($1<0)]d $1

versuche es online

Nahuel Fouilleul
quelle
1
Sie können zwei Bytes sparen, indem Sie die Auffülllänge einfügen. Auch eine andere interessante (28 Byte): printf %\ 0$[1+$1]d $2|xargs.
2.
vielleicht meinen Sie printf %\ 0$[1+$2]d $1|xargs, ich nicht dieses Format für Zahlen mit Vorzeichen erinnere mich auch xargs Trick führenden Raum zu entfernen
Nahuel FOUILLEUL
5

Schale , 12 Bytes

Ö±Ωo≥⁰#±:'0s

Probieren Sie es online!

Erläuterung

Ö±Ωo≥⁰#±:'0s  Inputs are y=4 and x=-20
           s  Convert x to string: "-20"
        :'0   Prepend '0'
  Ω           until
      #±      the number of digits
   o≥⁰        is at least y: "00-20"
Ö±            Sort by is-digit: "-0020"
              Print implicitly.
Zgarb
quelle
5

R, 56 48 Bytes

function(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)

Probieren Sie es online!

-8 Bytes dank Djhurio

Erläuterung

  • sprintf("%0zd",x)Gibt xals Zeichenfolge zurück, die mit Nullen aufgefüllt ist, um eine Länge zu habenz
  • paste0("%0",y+(x<0),"d")Konstruiert die Zeichenfolge "%0zd", wobei zist y, plus 1, wenn xkleiner als Null ist
  • Wenn zkleiner als die Anzahl der Ziffern in ist x, xwird der Ausdruck unverändert als Zeichenfolge ausgegeben
duckmayr
quelle
48 Bytesfunction(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
Djhurio
@ Djhurio brillant! Ich denke, das würde eine andere Antwort rechtfertigen als eine Bearbeitung von mir. Was sagen Sie?
duckmayr
Sie können es als eine Bearbeitung vornehmen. Diese Lösung unterscheidet sich nicht so sehr, sondern verwendet nur eine andere Funktion.
Djhurio
4

Alice , 23 Bytes

/oRe./'+Ao
\I*tI&0-R$@/

Probieren Sie es online!

Die Eingabe sollte mit der Nummer in der ersten Zeile und der Breite in der zweiten Zeile durch einen Zeilenvorschub getrennt sein.

Erläuterung

/...
\...@/

Dies ist der übliche Rahmen für lineare Programme im Ordinalmodus. Der einzige Haken in diesem Fall ist dieses Bit:

.../...
...&...

Dies bewirkt, dass die IP vertikal in den Kardinalmodus wechselt und nur den Befehl ausführt & Kardinalmodus bevor sie wieder in den Ordinalmodus wechselt.

Das Entfalten des Zickzack-Kontrollflusses ergibt dann:

IRt.&'-A$o*eI/&/0+Ro@

I    Read the first line of input (the value) as a string.
R    Reverse the string.
t.   Split off the last character and duplicate it.
&    Fold the next command over this string. This doesn't really do anything,
     because the string contains only one character (so folding the next
     command is identical to executing it normally).
'-   Push "-".
A    Set intersection. Gives "-" for negative inputs and "" otherwise.
$o   If it's "-", print it, otherwise it must have been a digit which we
     leave on the stack.
*    Join the digit back onto the number. If the number was negative, this
     joins the (absolute value of the) number to an implicit empty string,
     doing nothing.
e    Push an empty string.
I    Read the width W.
/&/  Iterate the next command W times.
0    Append a zero. So we get a string of W zeros on top of the absolute
     value of the input number.
+    Superimpose. This takes the character-wise maximum of both strings
     and appends extraneous characters from the longer string. Since the
     string of zeros can never be larger than the digits in the input,
     the input itself will be uneffected, but extraneous zeros are appended,
     padding the string to the required length.
R    Reverse the result.
o    Print it.
@    Terminate the program.

Hier sind zwei Alternativen, ebenfalls bei 23 Bytes, die Cardinal H( abs ) verwenden, um das loszuwerden -:

/R.I&0-RoH
\Ie#\'+Ao\@/

/R.H#/.+Xo
\Ie\I&0QRo@/

Im Prinzip sind diese Befehle kürzer, aber &sie passen nicht in eine Position, in der sich eine 1-Zeichen-Zeichenfolge auf dem Stapel befindet. Wir müssen sie daher mit einem überspringen #.

Martin Ender
quelle
4

Kohle , 16 13 Bytes

‹N⁰﹪⁺⁺%0ηd↔Iθ

Probieren Sie es online!

Dies ist der kürzeste Zeitraum, in dem ich Charcoal verwenden kann, ohne führende oder nachfolgende Leerzeichen zu drucken. Zumindest fange ich jetzt an zu verstehen, wie man die ModuloFunktion zum Formatieren von Strings verwendet.

Der deverbosed Code lautet wie folgt:

Print(Less(InputNumber(),0));    # Prints a - if the first input is less than 0
Print(Modulo(Add(Add("%0",h),"d"),Abs(Cast(q))));   # q: first input;  h: second input
  • 3 Bytes gespart dank Neil!
Charlie
quelle
1
In -Charcoal ist es wirklich einfach zu drucken oder nichts zu drucken : Beim Drucken von 1 wird gedruckt, -während beim Drucken von 0 nichts gedruckt wird. Der Ternär ist also überflüssig und spart 3 Bytes.
Neil
Wenn Sie das InputNumber()mit tauschen Cast(q), können Sie meines Erachtens dann zu einem Zeichenfolgenvergleich wechseln, um ein weiteres Byte zu speichern.
Neil
@Neil Ich wusste, dass ich das vereinfachen könnte Ternary!
Charlie
4

Retina , 39 Bytes

\d+$
$*0
((\d)*),(?<-2>-0+|0)*(0*)
$3$1

Probieren Sie es online!

Die Eingabe sollte durch Kommas getrennt sein, wobei die Nummer an erster Stelle und die Breite an zweiter Stelle stehen.

Martin Ender
quelle
4

PHP, 45 Bytes

printf("%0".($argv[2]+(0>$n=$argv[1])).d,$n);

oder

[,$n,$e]=$argv;printf("%0".($e+(0>$n)).d,$n);       # requires PHP 7.1 or later

Laufen Sie mit -nroder probieren Sie sie online aus .

Titus
quelle
Beim Ausführen des Codes in diesem Link wird ein Fehler angezeigt.
Shaggy
@ Shaggy Die zweite Version erfordert PHP 7.1
Titus
Ich ging weiter und weiter und kam zu genau dieser Antwort. Ich glaube, dies ist die optimale Version
Ismael Miguel
3

Mathematica, 118 Bytes

(j=ToString;If[#2<=0,j@#,If[(z=IntegerLength@#)>=#2,t=z,t=#2];s=j/@PadLeft[IntegerDigits@#,t];If[#>=0,""<>s,"-"<>s]])&


Probieren Sie es online!

J42161217
quelle
3

Mathematica, 63 62 Bytes

If[#<0,"-",""]<>IntegerString[#,10,Max[#2,IntegerLength@#,1]]&

Probieren Sie es online!

MatjazGo
quelle
2
Willkommen bei PPCG! Ich denke, das macht nicht ganz das, was du willst. Sie meinten wahrscheinlich IntegerLengthstatt IntegerDigits. Sie können ein Byte speichern, indem Sie IntegerLength@#stattdessen verwenden IntegerLength[#].
Martin Ender
Vielen Dank! Ich habe den Code von Hand von einem anderen Computer kopiert, wo ich ihn getestet habe, und habe tatsächlich IntegerDigits für IntegerLength falsch geschrieben. Es sollte jetzt funktionieren. Ich habe auch einen TIO-Link mit allen Testfällen in der Herausforderungsbeschreibung (+1) hinzugefügt, der zeigt, dass es wie erwartet funktioniert. Vielen Dank auch für den Vorschlag, ein zusätzliches Byte zu speichern! Ich weiß nicht, wie ich es früher verpasst habe. :)
MatjazGo
2

Excel, 29 Bytes

Verwenden von Excel TEXT Funktionalität ("Konvertiert einen Wert in Text in einem bestimmten Zahlenformat").

xin A1, yin B1

=TEXT(A1,REPT("0",MAX(1,B1)))
Wernisch
quelle
Sie können die )))für -3 Bytes löschen, indem Sie in Google Sheets
Taylor Scott
2

Oktave , 44 Bytes

@(x,y)fprintf(['%0',num2str(y+(x<0)),'d'],x)

Probieren Sie es online!

Stewie Griffin
quelle
1
Für 31 Bytes
Tom Carpenter
Wenn für positive Zahlen Vorzeichen (+) zulässig sind (wenn ok, warten Sie darauf, von op zu hören), funktioniert dies für 28 .
Tom Carpenter
2

Ruby , 31 28 Bytes

Vielen Dank an Carl, dass er 3 Bytes durch Interpolation eingespart hat.

->x,y{"%0#{y+(x<0?1:0)}d"%x}

Probieren Sie es online!

Jérémie Bonal
quelle
2
28: -> x, y {"% 0 # {y + (x <0? 1: 0)} d"% x}
Carl
2

Japt , 14 12 Bytes

2 Bytes gespart dank @ETHproductions

s r"%d+"_ù0V

Probieren Sie es online aus

Oliver
quelle
Es ist ein bisschen billiger, das Minus-Zeichen
beizubehalten
@ETHproductions: Oder xals String für 10 Bytes .
Shaggy
@ETHproductions danke fellas. Ich werde es aktualisieren, wenn ich wieder an meinem Schreibtisch bin.
Oliver
@ Shaggy Sieht so aus, als hättest du deine eigene Antwort gepostet, also verwende ich den Trick von ETHproduction. Trotzdem danke.
Oliver
Oliver, dieses 10-Byte-Modell ist nur die 12-Byte-Lösung von @ ETHproduction, die auf Japt 2.0a0 aufgerüstet wurde und Ues uns ermöglicht, die ersten beiden Zeichen abzuspielen .
Shaggy
2

PowerShell , 25 bis 40 Byte

param($a,$b)$a|% *g $("D$b"*($b|% *o 0))

Probieren Sie es online!

Erläuterung

Dies ruft .ToString()die Zahl mit einer generierten Formatzeichenfolge auf, multipliziert sie jedoch mit -1, 0 oder 1, je nachdem, ob $b( y) negativ, 0 oder positiv ist. Dies dient dazu, negative yWerte zu verarbeiten , die Formatstrings nicht von sich aus haben.

Dies scheint zu erfordern, dass negative Zahlen in eine Unteranweisung eingeschlossen werden, ()damit dies funktioniert. Dies ist nur eine Eigenheit des Aufrufs, wenn Literale verwendet werden. Wenn Variablen vom Typ Integer übergeben werden, wird dies nicht benötigt.

Briantist
quelle
Es sieht so aus, als ob beide fehlschlagen, wenn sie ynegativ sind.
Shaggy
@ Shaggy ugh guter Fang. Zweite Lösung komplett entfernt und erste behoben, danke!
Briantist
Autsch, 15 Bytes! Es tut uns leid!
Shaggy
@ Shaggy heh, eines Tages schreibe ich tatsächlich die PowerShell-basierte Golfsprache, über die ich nachgedacht habe. Das hat mich tatsächlich dazu gebracht, ein bisschen mehr zu recherchieren und näher daran zu
rücken
2

C # 6.0, 35 Bytes

(x,y)=>(x.ToString($"D{y<0?0:y}"));

Alternative Lösung (51 Bytes)

(x,y)=>(x.ToString(string.Format("D{0}",y<0?0:y)));
user76514
quelle
1

C (gcc) , 45 Bytes

f(x,y){printf("%s%0*i","-"+(x>=0),y,abs(x));}

Probieren Sie es online!

Erläuterung

printf formatiert drei Argumente:

%s      ->    "-"+(x>=0)
%0*i    ->    y
        ->    abs(x)

%sformatiert die Zeichenfolge "-"+(x>=0). "-"ist eigentlich nur eine adresse, sowas 41961441. Im Gedächtnis sieht das ungefähr so ​​aus:

MEMORY ADDRESS | 41961441  41961442 ...
VALUE          | 45 ('-')  0 (0x00) ...

Bei der Formatierung in eine Zeichenfolge nimmt C die Adresse (z. B. 41961441) und erfasst so lange Zeichen, bis ein Nullbyte (0x00) erreicht wird. Wenn x kleiner als Null ist, hat der Wert "-"+(x>=0)den der ursprünglichen Adresse (41961441). Andernfalls x>=0ist 1, so dass der Ausdruck wird "-"+1, der auf das nachfolgende Null-Byte verweist"-" , das nichts ausgibt.

%0*iGibt eine Ganzzahl aus, die mit einer angegebenen Anzahl von 0s aufgefüllt ist . ybezeichnet diese Nummer. Wir füllen abs(x)auf, um das Negative in einigen Argumenten zu vermeiden.

Conor O'Brien
quelle
1

Perl 5, 22 + 1 (- n) = 23 Bytes

printf"%0*d",<>+/-/,$_

Probieren Sie es online aus

Nahuel Fouilleul
quelle
Endlos wiederholbar10,-1
Zaid
Behoben+5 bytes
Nahuel Fouilleul
fand eine andere Lösung-5 bytes
Nahuel Fouilleul
Süss. Ich arbeite auch an einem ... bleib dran
Zaid
Ich schaffte es in 26 Bytes
Zaid