El desafío principal de ceros

31

El reto

Dados dos enteros como entrada ( xy y), salida xcomo una cadena con tantos ceros iniciales necesarios para que sean ycaracteres largos sin el signo.

Reglas

  • Si xtiene más de ydígitos, salida xcomo cadena sin modificación.

  • No se acepta la salida como entero, incluso si no hay ceros a la izquierda.

  • Cuando xes negativo, mantenga el estado -actual y opere con el valor absoluto.

  • Negativo ydebe tratarse como 0, lo que significa que la salida xes como es (pero como cadena)

Ejemplos:

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"

El código más corto en bytes gana, se aplican las lagunas estándar.

Brian H.
fuente
1
¿Puedo tomar x como cadena?
LiefdeWen
que (-1,1)da
Adám
@ Adám lo agregó a los ejemplos.
Brian H.
1
¿Es +aceptable un signo inicial para números positivos?
Tom Carpenter

Respuestas:

4

Japt , 13 8 bytes

Toma la primera entrada ( x) como una cadena.

®©ùTV}'-

Intentalo

Ahorró 5 bytes masivos gracias a ETHproductions.


Explicación

Entrada implícita de cadena U=xy entero V=y.

® }'-se divide Uen una matriz en el símbolo menos, se asigna sobre él y se une a una cadena con un símbolo menos.

©es AND lógico ( &&), por lo que si el elemento actual es verdadero (una cadena no vacía), rellene left ( ù) con 0 ( T) a la longitud V.

Lanudo
fuente
¡Buena esa! Puede ahorrar bastante simplemente mapeando -: ethproductions.github.io/japt/…
ETHproductions
@ETHproductions: Gran llamada. Gracias. Hace mucho tiempo que no lo hago, ¡olvidé por completo que puedes dividir, asignar y volver a unir una cadena todo en un solo método!
Shaggy
Sí, supongo que esa funcionalidad debería trasladarse a q, que sería q-_©ùTVguardar 1 byte :-)
ETHproductions
@ETHproductions, si entiendo ese derecho, ¿está sugiriendo que si una función se pasa como un segundo argumento de S.q()(darnos S.q(s,f)), entonces Sse dividiría s, ejecutaría fy se uniría a ella s? ¡Me gusta! :)
Shaggy
Sí, me hablo con Oliver y no se trata de hacer que (si se aprueba una función, realice la funcionalidad normal, correr a través de la función, y deshacer el primer cambio, N.s, S/A.y, N.ìhacer esto ya) con un montón de métodos? Tuve una conversación con alguien, pero no recuerdo quién ahora: s
ETHproductions
6

05AB1E , 11 10 bytes

Entrada dada como amount_of_digits, number

ÎIÄg-×ì'-†

Pruébalo en línea!

Explicación

Î            # 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
fuente
Parece que esta es la respuesta ganadora hasta ahora, si no se mejora mañana, la aceptaré.
Brian H.
has sido superado :(
Brian H.
@BrianH. De hecho, tengo :)
Emigna
6

Python, 29 bytes

Tomar entrada como f(x,y). Usando el %operador de Python .

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

Pruébalo en línea!

Colera Su
fuente
5

Java (OpenJDK 8) , 47 bytes

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

Pruébalo en línea!

Al principio pensé, fácil, 30 caracteres máximo (que es bastante corto al manipular cadenas en Java). Entonces ocurrieron las excepciones.

Olivier Grégoire
fuente
5

JavaScript (ES6), 42

Parámetros recursivos en orden inverso, primero y luego x. Y curry

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

Prueba

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
fuente
Aunque impresionante, siento que esta respuesta elude las reglas ligeramente al definir la función en f(y)(x)lugar de f(x,y).
styletron
Leyendo sobre las reglas de "curry", quería agregar que mi objeción era más con los parámetros invertidos y no con el curry en sí.
styletron
1
@styletron el orden de los parámetros no se especifica en el desafío. Entonces puedo aprovechar esto
edc65
Dang, se y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)acerca tanto ...
ETHproductions
No tengo problemas con las personas que invierten el orden de entrada.
Brian H.
5

Python 3.6 , 28 37 bytes

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

Pruébalo en línea!(Caso de prueba de la respuesta de Colera Su)

Aprovechando la nueva forma de formatear cadenas en Python 3.6

+9 bytes para manejar y<0

Lescurel
fuente
Parece que esto falla cuando yes negativo: tio.run/##K6gsycjPM/…
Shaggy
En efecto. Así que estoy con 37 bytes.
Lescurel
5

bash, 27 , 25 bytes

-2 bytes gracias a Bruce Forte

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

pruébalo en línea

Nahuel Fouilleul
fuente
1
Puede guardar dos bytes alineando la longitud del relleno. También otra interesante (28 bytes): printf %\ 0$[1+$1]d $2|xargs.
ბიმო
quizás quieras decir printf %\ 0$[1+$2]d $1|xargs, no recordaba este formato para los números con signo y también el truco de xargs para eliminar el espacio
inicial
5

Casco , 12 bytes

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

Pruébalo en línea!

Explicación

Ö±Ω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
fuente
5

R, 56 48 bytes

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

Pruébalo en línea!

-8 bytes gracias a djhurio

Explicación

  • sprintf("%0zd",x)regresa xcomo una cadena rellenada con ceros para ser de longitudz
  • paste0("%0",y+(x<0),"d")construye la cadena "%0zd", donde zestá y, más 1 six es menor que cero
  • Si zes menor que el número de dígitos x, xse imprime como una cadena como es
Duckmayr
fuente
48 bytesfunction(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
djhurio
@djhurio genial! Creo que eso justificaría otra respuesta en lugar de una edición mía, ¿qué dices?
duckmayr
Puedes hacerlo como una edición. Esta solución no es muy diferente, solo usa diferentes funciones.
djhurio
4

Alice , 23 bytes

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

Pruébalo en línea!

La entrada debe estar separada por salto de línea con el número en la primera línea y el ancho en la segunda.

Explicación

/...
\...@/

Este es el marco habitual para programas lineales en modo ordinal. El único inconveniente en este caso es este bit:

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

Esto hace que la IP entre en modo Cardinal verticalmente y se ejecute solo &en modo Cardinal antes de reanudarse en modo Ordinal.

Al desplegar el flujo de control en zigzag, se obtiene:

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.

Aquí hay dos alternativas, también en 23 bytes, que usan Cardinal H( abs ) para deshacerse de -:

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

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

En principio, este es un comando más corto, pero &no cabe en una posición donde hay una cadena de 1 carácter en la pila, por lo que debemos omitirla con a #.

Martin Ender
fuente
4

Carbón , 16 13 bytes

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

Pruébalo en línea!

Esto es lo más corto que podría obtener usando carbón sin imprimir espacios en blanco iniciales o finales. Al menos ahora estoy empezando a entender cómo usar elModulo función para formatear cadenas.

El código deverbosed es el siguiente:

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 guardados gracias a Neil!
Charlie
fuente
1
Imprimir -o nada es realmente fácil en Carbón: imprimir 1 imprime -mientras imprimir 0 imprime nada. Entonces, el ternario es superfluo, ahorrando 3 bytes.
Neil
Si intercambias el InputNumber()con el Cast(q), creo que puedes cambiar a una comparación de cadena para guardar otro byte.
Neil
@Neil ¡Sabía que podía simplificar el Ternary!
Charlie
4

Retina , 39 bytes

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

Pruébalo en línea!

La entrada debe estar separada por comas con el número primero y el ancho segundo.

Martin Ender
fuente
4

PHP, 45 bytes

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

o

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

Ejecutar -nro probarlos en línea .

Tito
fuente
Obteniendo un error al ejecutar el código en ese enlace.
Shaggy
@Shaggy La segunda versión requiere PHP 7.1
Titus
Seguí y seguí sobre esto, y llegué exactamente a esta respuesta. Creo que esta es la versión óptima
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]])&


Pruébalo en línea!

J42161217
fuente
3

Mathematica, 63 62 bytes

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

Pruébalo en línea!

MatjazGo
fuente
2
Bienvenido a PPCG! Creo que esto no está haciendo lo que quieres. Probablemente quisiste decir en IntegerLengthlugar de IntegerDigits. Puede guardar un byte utilizando en IntegerLength@#lugar de IntegerLength[#]sin embargo.
Martin Ender
¡Gracias! Estaba copiando el código de otra computadora a mano donde lo estaba probando y de hecho escribí mal IntegerDigits para IntegerLength. Debería funcionar ahora. También he agregado un enlace TIO con todos los casos de prueba en la descripción del desafío (+1) que muestra que funciona como se esperaba. ¡Gracias también por la sugerencia de guardar un byte adicional! No sé cómo me lo perdí antes. :)
MatjazGo
2

Excel, 29 bytes

Uso de la TEXTfuncionalidad de Excel ("Convierte un valor en texto en un formato de número específico").

xen A1, yen B1

=TEXT(A1,REPT("0",MAX(1,B1)))
Wernisch
fuente
Puede soltar los )))bytes -3 convirtiéndolos en Hojas de cálculo de Google
Taylor Scott
2

Octava , 44 bytes

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

Pruébalo en línea!

Stewie Griffin
fuente
1
Para 31 bytes
Tom Carpenter,
Si se permiten signos iniciales + para números positivos (esperando recibir noticias de op si está bien), esto funciona para 28 .
Tom Carpenter
2

Ruby , 31 28 bytes

Gracias Carl por guardar 3 bytes usando interpolación.

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

Pruébalo en línea!

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

Japt , 14 12 bytes

Guardado 2 bytes gracias a @ETHproductions

s r"%d+"_ù0V

Pruébalo en línea

Oliver
fuente
Es un poco más barato mantener el signo menos y simplemente meterse con los dígitos:
Pruébelo
@ETHproductions: O tome xcomo una cadena de 10 bytes .
Shaggy
@ETHproductions gracias amigos. Lo actualizaré cuando vuelva a mi escritorio.
Oliver
@Shaggy Parece que publicaste tu propia respuesta, así que usaré el truco de ETHproduction. Gracias sin embargo.
Oliver
Oliver, ese 10 bytes es solo la solución de 12 bytes de @ ETHproduction actualizada a Japt 2.0a0 con Uuna cadena que nos permite jugar golf con los primeros 2 caracteres.
Shaggy
2

PowerShell , 25 40 bytes

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

Pruébalo en línea!

Explicación

Esto llama .ToString()al número con una cadena de formato generada, pero la multiplica por -1, 0 o 1 en función de si $b(y ) es negativo, 0 o positivo respectivamente; esto es para manejar negativoy valores que las cadenas de formato no tienen por sí mismas.

Esto parece requerir envolver números negativos en una subestación ()para que funcione, lo cual es solo una peculiaridad de la invocación cuando se usan literales; si se pasan variables de tipo entero, no necesitaría eso.

briantista
fuente
Parece que ambos fallan cuando yes negativo.
Shaggy
@ Shaggy ugh buena captura. Se eliminó la segunda solución por completo y se arregló la primera, ¡gracias!
briantist
¡Ay, 15 bytes! ¡Lo siento!
Shaggy
@ Shaggy je, uno de estos días escribiré el lenguaje de golf basado en PowerShell en el que he estado pensando. Esto realmente me empujó a investigar un poco más y a estar más cerca de comenzarlo, así que gracias por eso;)
briantist
2

C # 6.0, 35 bytes

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

Solución alternativa (51 bytes)

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

C (gcc) , 45 bytes

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

Pruébalo en línea!

Explicación

printf Formatea tres argumentos:

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

%sformatea la cadena "-"+(x>=0). "-"es en realidad sólo una dirección, algo así 41961441. En la memoria, esto se parece a esto:

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

Cuando se formatea en una cadena, C toma la dirección (por ejemplo, 41961441) y continúa adquiriendo caracteres hasta que se cumple un byte nulo (0x00). Cuando x es menor que cero, el valor "-"+(x>=0)tiene el de la dirección original (41961441). De lo contrario, x>=0es 1, por lo que la expresión se convierte "-"+1, lo que señala el byte nulo después "-", que no imprime nada.

%0*iimprime un número entero rellenado con un número especificado de 0s. ydenota este número. Acolchamos abs(x)para evitar lo negativo en algunos argumentos.

Conor O'Brien
fuente
1

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

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

Pruébalo en línea

Nahuel Fouilleul
fuente
Bucles infinitamente encendido10,-1
Zaid
arreglado+5 bytes
Nahuel Fouilleul
encontró otra solución-5 bytes
Nahuel Fouilleul
Dulce. También estoy trabajando en uno ... estad atentos
Zaid
Lo logré en 26 bytes
Zaid