Javascript left-pad golf

27

Introducción

A raíz de las consecuencias del paquete npm del pad izquierdo , tengamos un código de golf para implementar el pad izquierdo.

La función de pad izquierdo consta de 2 argumentos predeterminados y 1 argumento adicional, en forma de cadena , longitud , ( padchar ). Si no se proporciona el padchar, se estandariza a un carácter de espacio . Tomemos un ejemplo con dos argumentos:

left_pad("abc", 6)

Primero, observamos la longitud de la cuerda, que es 3 . Después de esto, necesitamos rellenar esta cadena a la izquierda hasta que la longitud de la cadena completa haya alcanzado la longitud dada en la función. En este caso 6 . Como no se proporciona el padchar , debemos rellenar esto con espacios:

   abc

Esta es una cadena con 3 espacios y la cadena inicial, que resulta en una cadena con longitud 6. Aquí hay un ejemplo con el padchar dado:

left_pad("abc", 6, "-")

Simplemente hacemos lo mismo que en el ejemplo anterior, pero reemplazamos los espacios con el padchar. En este caso, el guión:

---abc

La tarea

Dada la cadena , la longitud y tal vez el argumento adicional padchar , genera la cadena con relleno izquierdo. Puede suponer que el número de longitud es igual o mayor que la longitud de la cadena. El padchar siempre constará de 1 personaje.

Casos de prueba

left_pad("string", length, ("padchar")) === "left-padded string"

left_pad("foo", 5) === "  foo"
left_pad("foobar", 6) === "foobar"
left_pad("1", 2, "0") === "01"
left_pad("1", 2, "-") === "-1"

Este es el , por lo que gana el envío con el menor número de bytes.

m0sa
fuente
13
@ m0sa Todavía hay algunos problemas. Se desaconseja restringir el desafío de JavaScript: no hay ninguna razón por la que otros idiomas no puedan participar en esto. La especificación debe describir el comportamiento deseado y el rango de posibles entradas permitidas sin necesidad de seguir un enlace. No está claro de antemano cómo se maneja el tercer parámetro.
xnor
8
Estoy seguro de que se puede hacer una referencia relevante para Javascript como motivación, sin tener que decir "por lo tanto, no se permite jugar a otros idiomas". Si está particularmente interesado en ver las mejores entradas de Javascript, podría ofrecer una recompensa por ello, mientras deja el desafío abierto para otros idiomas.
trichoplax
66
O las preguntas de un solo idioma están prohibidas o no lo están. Si están prohibidos, cierra esto. Si están permitidos, deje que el OP restrinja la pregunta como quiera.
Sklivvz
10
@Sklivvz (y m0sa) Hay casos raros en los que los desafíos específicos del idioma tienen sentido, particularmente si el desafío requiere alguna característica única de un idioma para tener sentido o incluso ser un desafío en primer lugar. Esa es la razón principal por la que están permitidos y por qué también me opondría a rechazarlos por completo. Dicho esto, para cualquier desafío que hace tiene sentido en cualquier idioma, no hay una buena razón para limitar a un solo idioma. De lo contrario, tendríamos "Ordenar una matriz en JavaScript", "Ordenar una matriz en Ruby", "Ordenar una matriz en Python" ... y 300 desafíos más sin ningún beneficio.
Martin Ender
8
@Sklivvz Como dijo trichoplax, esta es una buena motivación para un desafío, pero se reduce a una tarea muy simple de procesamiento de cadenas que tiene el mismo sentido en cualquier otro idioma. El desafío no es específicamente difícil, factible o interesante en JavaScript en comparación con cualquier otro idioma (en particular, alguien podría no haber sabido sobre el paquete left-pad, y todavía hacer esta pregunta sin la restricción de idioma, y ​​las respuestas en JavaScript no no se ha visto afectado en absoluto, y nadie hubiera pensado "¿por qué no es solo JS?").
Martin Ender

Respuestas:

20

Pyth, 13 11 bytes

+*.xwd-Qlzz

Probar aquí .

Toma información de STDIN como la cadena en la primera línea, la longitud en la segunda línea y el relleno de caracteres opcionalmente en una tercera línea.

Pomo de la puerta
fuente
44
Se supone que esto es solo JavaScript
MMM
22
@MMM Las restricciones de idioma en los desafíos son tan universalmente desagradables que espero que se ignore sumariamente. A nadie le gusta que le digan " no puedes participar".
xnor
2
¡Pegalo al hombre! ¡Ve a pomo de la puerta! ¡No dejes que tus sueños sean sueños! ¡SIMPLEMENTE HAZLO!
Mave
44
¡Es una sociedad perversa donde los moderadores son los que hacen la desobediencia civil!
Ven
13

JavaScript (ES6), 43 bytes

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)
Neil
fuente
1
te estás perdiendo el tercer parámetro
m0sa
@ m0sa Gracias, arreglado.
Neil
No pasa la tercera prueba, ahora ;-)
Sklivvz
1
@Sklivvz Ugh, eso es lo que obtengo por no leer los requisitos correctamente.
Neil
En lugar de p+=s, puede agregar 2 bytes para hacerlo p+=[s], y funcionará.
Aplet123
7

JavaScript (ES6), 37 43 44 bytes

(a,n,c=' ')=>((c+'').repeat(n)+a).substr(-n)

Prueba:

> f=(a,n,c)=>((c?c:" ").repeat(n)+a).substr(-n)
< function (a,n,c)=>((c?c:" ").repeat(n)+a).substr(-n)
> f('foo', 5) === '  foo';
< true
> f('foobar', 6) === 'foobar';
< true
> f(1, 2, 0) === '01';
< true
> f(1, 2, '-') === '-1';
< true

No estoy seguro si desea contar la declaración de función, lo incluiría en línea.

Sklivvz
fuente
Creo que, en general, no contamos la declaración de función a menos que la pregunta solicite específicamente un programa completo en lugar de una función.
Deusovi
slicees más corto que substr.
Mama Fun Roll
@Deusovi a la derecha. lo que quiero decir es que no haría console.log(f("whatever",10, "*")), peroconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz
7

Javascript ES6, 35 bytes

(s,l,c=' ')=>c.repeat(l-s.length)+s

Intentalo. Creo que esta es la implementación más corta posible actualmente en Javascript.

David
fuente
Esto es lo que iba a hacer, excepto que no era una función anónima.
Aplet123
@ Aplet123 Creo que, según la definición del concurso de lo que se espera, está bien. Solo estaba pidiendo la función; nombrarlo es irrelevante en este contexto o al menos eso es lo que pensaría en base a otras respuestas.
David
5

Python 3, 33 31 29 bytes

lambda a,b,x=" ":a.rjust(b,x)

Bastante sencillo. Gracias a @xnor por recordarme que str.rjustes una cosa. :PAGS

Para la misma longitud (también gracias a xnor):

lambda a,b,x=" ":(x*b+a)[-b:]

Solución previa:

lambda a,b,x=" ":x*(b-len(a))+a
gato
fuente
Es un poco más corto de hacer (x*b+a)[-b:]o a.rjust(b,x). En realidad, str.rjustpodría decirse que funciona para todo.
xnor
@xnor se me olvidó que rjustestaba integrado, ¡gracias!
gato
Ninguno de estos sigue las especificaciones:f(1, 2, 0) === '01';
Valentin Lorentz
@ValentinLorentz Le pedí al OP que me aclarara los idiomas que no obligan a los números a las cadenas de forma predeterminada, y no obtuvieron una respuesta. Como esta pregunta no tiene una especificación formal, voy a asumir que los argumentos son todas cadenas.
gato
Ahora hay una especificación, y la solución 1 no es válida (probado en Python 2.7.10)
CalculatorFeline
5

05AB1E , 11 9 bytes

Código:

g-ð³0@×¹«

Explicación:

g          # Implicit first input, take the length.
 -         # Substract the length with the second input.
  ð³       # Push a space and if the third input exists, also the third input.         
    0@     # Reposition the first element of the stack to the top (zero-indexed).
      ×    # Multiply the character with the difference in length.
       ¹«  # Concatenate the first input to the string.

Utiliza la codificación CP-1252 . Pruébalo en línea .

Adnan
fuente
1
Todos estos caracteres encajan en la página de códigos Jelly (0x672D188330401181FA)
CalculatorFeline
5

JavaScript (ES5), 70 bytes

Usando la recursividad ...

function f(s,c,p,u){return(s+'').length<c?f((p==u?' ':p+'')+s,c,p):s}

Mi primer intento fue de solo 57 bytes:

function f(s,c,p){return s.length<c?f((p||" ")+s,c,p):s}

Pero solo pasó las 2 primeras pruebas:

> f('foo', 5) === '  foo';
true
> f('foobar', 6) === 'foobar';
true
> f(1, 2, 0) === '01';
false
> f(1, 2, '-') === '-1';
false

Todavía me gusta el más corto, porque en la práctica, pasar números a una función de manipulación de cadenas no es una característica que necesitaría.

rjmunro
fuente
4

Mathematica, 13 bytes

StringPadLeft

Respuesta integrada solo # 3 (primero fue Range, segundo fue Surd) O menos integrada: (35 bytes)

##2~StringRepeat~(#3-Length@#2)<>#&
CalculadoraFeline
fuente
¿Puedo votar en voz baja?
edc65
2
...¿Por qué? ¿Es porque esto es solo una construcción? La respuesta # 1 de 41byte Python (que ya no es válida) fue solo una envoltura para un builtin incorporado.
CalculatorFeline
It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern.(Llamamiento a la autoridad: Martin) (pero también sentido común)
edc65
@ edc65 Meta publicación relacionada . Estoy bastante seguro de que está permitido, ya que los complementos generalmente están permitidos por defecto. Se requiere creatividad y conocimiento por parte del usuario para conocer la función incorporada relevante.
mbomb007
1
@ mbomb007 permitido quizás - creativo no. No
marqué
3

Julia, 4 bytes

lpad

Pasa todos los casos de prueba:

julia> lpad("foo", 5)
"  foo"

julia> lpad("foobar", 6)
"foobar"

julia> lpad(1, 2, 0)
"01"

julia> lpad(1, 2, '-')
"-1"
Fengyang Wang
fuente
¿Funciona para rect 7 cor?
CalculatorFeline
Sí. lpad("rect", 7, "cor") => "correct"
Fengyang Wang
3

Javascript (ES6), 55 bytes

(a,n,c=' ',s=a+'')=>(new Array(++n-s.length).join(c)+s)

Cree una matriz vacía de valores y una versión de unión.

(a,n,c=' ')=>{a+=''; return new Array(++n-a.length).join(c)+a}

Es más legible pero returnagrega algunos caracteres más.

por favor
fuente
Como la pregunta está en espera, pondré mi respuesta debajo de la respuesta JS que se parece más a la mía. 43 bytes (s, n, c = '') => (Array (n) .join (c) + s) .slice (-n)
Charlie Wynn
Consejo: `para inline code blocks..
CalculatorFeline
+=devuelve el valor de su operando izquierdo, por lo que la segunda versión se acorta: (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)pero se vuelve más larga cuando agrega cadenas de relleno multicar.
CalculatorFeline
3

Bash, 57 Bytes

Parámetros: ancho de cadena padchar

printf -vX %$2s;Y="${X// /${3- }}$1";echo -n "${Y:${#1}}"

Haz una cadena de espacios de ancho .

Convierte cada personaje espacial en padchar .

Escriba el relleno y luego la cadena .

philcolbourn
fuente
2

Python, 41 bytes

lambda a,b,x=' ':str(a).rjust(b,str(x))

Sin el rjust incorporado, 43 bytes:

lambda a,b,x=' ':str(x)*int(b/2%3)+str(a)

(no es lo que uno espera que haga, pero pasa el conjunto de pruebas)

Valentin Lorentz
fuente
Se puede quitar s=stry reemplazar scon stra misma cuenta de bytes.
CalculatorFeline
2

Jalea , 12 bytes

L⁴_ẋ@⁵⁵⁶<?¤³

Tantas referencias variables. ¿No se suponía que Jelly era un lenguaje tácito ?

Pruébalo en línea!

Cómo funciona

L⁴_ẋ@⁵⁵⁶<?¤³  Main link
              Arguments: string (³), length (⁴), padchar (⁵, defaults to 10)

L             Compute the length of ³.
 ⁴_           Subtract the length from ⁴.
          ¤   Combine the two links to the left into a niladic chain:
     ⁵          Yield ⁵.
      ⁵⁶<?      Yield ⁵ if ⁵ < ⁵, else ⁶.
              Comparing a number with itself gives 0 (falsy), but comparing a
              string / character list with itself gives [0] (truthy).
   ẋ@         Repeat the result to the right as many times as specified in the
              result to the left.
           ³  Print the previous return value and return ³.
Dennis
fuente
padchar (⁵, defaults to 10)¿No debería ser por defecto 20o 32?
gato
1
Los superíndices 3 a 9 son constantes que se inicializan a argumentos (si están presentes) o algunos valores predeterminados útiles. El condicional ?verifica si tiene su valor predeterminado 10 y produce un espacio en ese caso.
Dennis
2

JavaScript ES7, 16 bytes

''.padStart.bind

incorporados ftw! Solo funciona en Firefox 48 y superior. Válido ya que esta característica se agregó el 12 de marzo.

Esto toma datos como:

(''.padStart.bind)(arg1)(arg2,arg3)
Downgoat
fuente
1

Lucio , 67 bytes

mixed n(mixed a,int b,mixed x){return x!=""?x:" "*(b-strlen(a))+a;}

suspiro . La cadena vacía se ""evalúa como true. ¿¡Por qué!?

mixto mixto mixto mixto mixto sopa de lucio ...

gato
fuente
Otro lenguaje con verdades estúpidas.
CalculatorFeline
@CatsAreFluffy, sí, Pike es un poco raro, pero tiene buenas utilidades de procesamiento de cadenas.
gato
1

Pyke , 12 bytes (sin competencia)

nodo de entrada agregado, corrección de errores en el nodo len, cambiar los resultados predeterminados en el nodo de asignación después de que se publicó el desafío.

\ =zzjl-z*j+

Explicación:

\ =z         - assign default input for `z` to be " " (Will still prompt but no input will return a space instead)
    zj       -     j = input()
      l      -    len(j)
       -     -   eval_or_not_input() - ^
        z*   -  ^*input()
          j+ - ^+j
Azul
fuente
+1 porque responder en el idioma te ayuda a refinarlo :)
gato
He editado el formato de su encabezado para que sea más fácil de leer y más fácil de analizar para los guiones de usuario, etc.
gato
¿Por qué el voto negativo?
Azul
1
@muddyfish Parece que todas las respuestas que no son de Javascript aquí tienen un voto negativo.
Adnan
@AandN eso no es bueno ... También por qué no pude ver un patrón de las 6 respuestas principales
Azul
1

JavaScript ES6, 38 bytes

(s,l,c=" ")=>(c.repeat(l)+s).slice(-l)

Una solución alternativa.

Conor O'Brien
fuente
1

JavaScript (ES6), 34 bytes

Usé una solución recursiva.

f=(s,l,c=' ')=>s[l-1]?s:f(c+s,l,c)
Huntro
fuente
0

Ruby, 42 bytes

def left_pad(s,t,p=" ");p*(t-s.size)+s;end

Parámetros: cuerda, tamaño, padchar.

Conjunto de pruebas a continuación; debería imprimir todos los "verdaderos", simplemente ponga todo en el mismo archivo.

puts left_pad("foo", 5) == "  foo"
puts left_pad("foobar", 6) == "foobar"
puts left_pad("1", 2, "0") == "01"
puts left_pad("1", 2, "-") == "-1"
jose_castro_arnaud
fuente
No necesita usar ese nombre de método ... y probablemente también pueda convertirlo en lambda. (Todos los otros ejemplos son similares)
No es que Charles
0

Java 8, 86 88 bytes

Esta es una función. El tercer argumento es varargspara permitir el pad opcional char (el valor predeterminado es ' ')

String p(String s,int l,char...p){return s.length()<l?p((p.length>0?p[0]:' ')+s,l,p):s;}

Recursión! +2 bytes (corchetes agregados debido a un error de tipo incompatible)

Hiperneutrino
fuente
Este tipo de errores. Siempre puedo probar Ideone (Java 7, pero obtengo el mismo error exacto en Java 8 en mi caja) ideone.com/B7gTA5
cat
0

PHP 54 48 bytes

Utiliza la codificación de Windows-1252.

function(&$s,$l,$p=~ß){$s=str_pad($s,$l,$p,0);};

Ejecutar así ( -dagregado solo para easthetics):

php -r '$f = function(&$s,$l,$p=~ß){$s=str_pad($s,$l,$p,0);}; $s="foo";$f($s,5);echo"$s\n";' 2>/dev/null

Versión anterior (sin el incorporado):

function(&$s,$l,$p=~ß){for(;strlen($s)<$l;)$s=$p.$s;};

Ajustes

  • Guardado 6 bytes mediante el uso en str_padlugar de un bucle. Dejando el viejo como referencia, ya que las construcciones están mal vistas
aross
fuente
0

R, 50 bytes

Tarde a la fiesta otra vez pero aquí va:

function(s,n,p=" ")cat(rep(p,n-nchar(s)),s,sep="")

Esto simplemente imprime la salida en stdout pero en realidad no devuelve la cadena acolchada (no estaba seguro de si este es un requisito para el desafío). Si esto es necesario, la solución es un poco más larga a 61 bytes:

function(s,n,p=" ")paste0(c(rep(p,n-nchar(s)),s),collapse="")
Billywob
fuente
-3

C, 64 bytes

f(s,n,c,p){return memset(p,c,asprintf(&p,"%*s",n,s)-strlen(s));}

Pruébalo aquí .

Cole Cameron
fuente
2
Esto no cumple con la especificación, ya que no tiene un espacio predeterminado cuando no se proporciona un carácter.
Pomo de la puerta
Este código no se ejecuta como se indica. gccpermitirá que undefined reference to function printfpase e incluir printfen sí, pero no hubo suerte para memset, asprintfy strlen. Debe agregar las #include<string.h>definiciones ... etc. para que esto sea válido.
gato
@tac Hmmm ... Escribí y probé mi respuesta completamente dentro de ideone. Se compila y se ejecuta con éxito en esa plataforma, aunque indica que la usa gcc-5.1. No estoy seguro de si están utilizando indicadores del compilador o de lo que tienes detrás de escena de lo que no soy consciente. Inicialmente estaba usando esto como mi justificación para que no se ejecute en su entorno, pero ahora no estoy seguro ...
Cole Cameron
bueno, esto está gcc 5.2.1en Linux, por lo que puede salirse con la suya, Ideone C, 64 bytespero si va a reclamar que es C, compílelo. : p
gato
Solo soy un principiante en C: ¿Por qué ftoma cuatro parámetros, no 3? ¿Necesita la dirección de la cadena o ...? De cualquier manera, fdebe tomar como máximo 3 argumentos.
gato