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.



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.


¡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

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




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


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

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.

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

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 #.



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!

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

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 .


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!


3

Mathematica, 63 62 bytes

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

Pruébalo en línea!


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

Puede soltar los )))bytes -3 convirtiéndolos en Hojas de cálculo de Google
Taylor Scott




2

Japt , 14 12 bytes

Guardado 2 bytes gracias a @ETHproductions

s r"%d+"_ù0V

Pruébalo en línea


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.


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


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.



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.