Javascript pad sinistro golf


27

introduzione

Sulla scia del pacchetto npm con pad di sinistra fallout del un codice golf per l'implementazione del pad sinistro.

La funzione pad sinistro è composta da 2 argomenti predefiniti e 1 argomento aggiuntivo, nella forma stringa , lunghezza , ( padchar ). Se non viene fornito il padchar, questo è standardizzato per un carattere spazio . Facciamo un esempio con due argomenti:

left_pad("abc", 6)

Innanzitutto, osserviamo la lunghezza della stringa, che è 3 . Dopodiché, dobbiamo riempire questa stringa a sinistra fino a quando la lunghezza della stringa completa non ha raggiunto la lunghezza indicata nella funzione. In questo caso 6 . Poiché il padchar non viene fornito , dobbiamo riempire questo con spazi:

   abc

Questa è una stringa con 3 spazi e la stringa iniziale, risultante in una stringa con lunghezza 6. Ecco un esempio con il padchar dato:

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

Facciamo semplicemente lo stesso dell'esempio sopra, ma sostituiamo gli spazi con il padchar. In questo caso, il trattino:

---abc

L'obiettivo

Data la stringa , la lunghezza e forse l'argomento padchar aggiuntivo, genera la stringa con riempimento a sinistra. Puoi presumere che il numero di lunghezza sia uguale o maggiore della lunghezza della stringa. Il padchar sarà sempre composto da 1 carattere.

Casi test

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"

Questo è , quindi vince l'invio con il minor numero di byte!


13
@ m0sa Ci sono ancora alcuni problemi. Limitare la sfida a JavaScript è fortemente scoraggiato: non c'è motivo per cui altre lingue non possano parteciparvi. Le specifiche dovrebbero descrivere il comportamento desiderato e la gamma di possibili input consentiti senza la necessità di seguire un collegamento. Non è chiaro come sia gestito il terzo parametro.
xnor

8
Sono certo che un riferimento rilevante per Javascript può essere fatto per motivare, senza dover dire "quindi non è permesso giocare altre lingue". Se sei particolarmente interessato a vedere le migliori voci Javascript, puoi offrirti una generosità, lasciando comunque aperta la sfida per altre lingue.
trichoplax,

6
O le domande in una sola lingua sono vietate o non lo sono. Se sono vietati, chiudilo. Se sono autorizzati, lascia che l'OP limiti la domanda a loro piacimento.
Sklivvz,

10
@Sklivvz (e m0sa) Ci sono rari casi in cui le sfide specifiche della lingua hanno un senso, in particolare se la sfida richiede alcune caratteristiche davvero uniche di una lingua per avere senso o addirittura essere una sfida in primo luogo. Questo è il motivo principale per cui sono ammessi quelli e perché mi oppongo anche a non consentirli completamente. Detto questo, per qualsiasi sfida che abbia senso in qualsiasi lingua, non c'è motivo di limitarla a una lingua. Altrimenti, avremmo "Ordina un array in JavaScript", "Ordina un array in Ruby", "Ordina un array in Python" ... e altre 300 sfide senza alcun vantaggio.
Martin Ender,

8
@Sklivvz Come diceva trichoplax, questa è un'ottima motivazione per una sfida, ma si riduce a un compito molto semplice di elaborazione delle stringhe che ha lo stesso senso in qualsiasi altra lingua. La sfida non è specificamente difficile, fattibile o interessante in JavaScript rispetto a qualsiasi altra lingua (in particolare, qualcuno potrebbe non essere a conoscenza del pacchetto pad sinistro, e ancora porre questa domanda senza la restrizione della lingua, e le risposte in JavaScript non sarebbero " non sono stato affatto influenzato, e nessuno avrebbe pensato "perché non è solo JS?").
Martin Ender,

Risposte:


20

Pyth, 13 11 byte

+*.xwd-Qlzz

Provalo qui .

Prende input da STDIN come stringa sulla prima riga, lunghezza sulla seconda riga e padding char su una terza riga.


4
Supponiamo che sia solo javascript
MMM

22
@MMM Le restrizioni linguistiche nelle sfide sono così universalmente non apprezzate che mi aspetto che vengano sommariamente ignorate. A nessuno piace sentirsi dire " non puoi partecipare".
xnor


2
Fagli vedere chi sei! Vai Maniglia della porta! Non lasciare che i tuoi sogni siano sogni! FALLO E BASTA!
Mave,

4
È una società malvagia in cui i moderatori sono quelli che fanno disobbedienza civile!
Ven

13

JavaScript (ES6), 43 byte

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)

1
ti manca il 3o parametro
m0sa

@ m0sa Grazie, risolto.
Neil

Ora fallisce il terzo test ;-)
Sklivvz,

1
@Sklivvz Ugh, questo è quello che ottengo per non aver letto correttamente i requisiti.
Neil

Invece p+=s, puoi aggiungere 2 byte per farlo p+=[s], e funzionerà.
Aplet123,

7

JavaScript (ES6), 37 43 44 byte

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

Test:

> 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

Non sono sicuro che tu voglia contare la dichiarazione di funzione, la inline.


Penso che in generale non contiamo la dichiarazione di funzione a meno che la domanda non richieda specificamente un programma completo piuttosto che una funzione.
Deusovi,

sliceè più corto di substr.
Mama Fun Roll

@Deusovi giusto. quello che voglio dire è che non lo farei console.log(f("whatever",10, "*")), maconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz,

7

Javascript ES6, 35 byte

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

Provalo. Credo che questa sia l'implementazione più breve possibile attualmente in Javascript.


Questo è quello che stavo per fare, tranne che non era una funzione anonima.
Aplet123,

@ Aplet123 Penso che dalla definizione del contest di cosa ci si aspetti sia ok. Stava solo chiedendo la funzione; nominarlo è irrilevante in questo contesto o almeno è quello che penso sulla base di altre risposte.
David,

5

Python 3, 33 31 29 byte

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

Abbastanza semplice. Grazie a @xnor per avermelo ricordato str.rjustè una cosa. : P

Per la stessa lunghezza (anche grazie a xnor):

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

Soluzione precedente:

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

È un po 'più breve da fare (x*b+a)[-b:]o a.rjust(b,x). In realtà, str.rjustse stesso funziona senza dubbio per tutto.
xnor

@xnor Ho dimenticato che rjustera incorporato, grazie!
gatto

Nessuno di questi segue le specifiche:f(1, 2, 0) === '01';
Valentin Lorentz,

@ValentinLorentz Ho chiesto all'OP chiarimenti sulle lingue che per impostazione predefinita non obbligano i numeri a stringhe e non hanno ricevuto risposta. Poiché questa domanda non ha specifiche formali, suppongo che gli argomenti siano tutti stringhe.
gatto

Ora c'è una specifica e la soluzione 1 non è valida (testata su Python 2.7.10)
CalculatorFeline

5

05AB1E , 11 9 byte

Codice:

g-ð³0@×¹«

Spiegazione:

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.

Utilizza la codifica CP-1252 . Provalo online .


1
Tutti questi caratteri si inseriscono nella tabella codici Jelly (0x672D188330401181FA)
CalcolatriceFeline

5

JavaScript (ES5), 70 byte

Utilizzo della ricorsione ...

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

Il mio tentativo iniziale era di soli 57 byte:

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

Ma ha superato solo i primi 2 test:

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

Mi piace ancora quello più corto, perché in pratica, passare i numeri a una funzione di manipolazione delle stringhe non è una caratteristica di cui avrei bisogno.


4

Mathematica, 13 byte

StringPadLeft

Risposta n. 3 solo incorporata (prima era Range, seconda era Surd) O meno incorporata: (35 byte)

##2~StringRepeat~(#3-Length@#2)<>#&

Posso sottovalutare tranquillamente?
edc65,

2
...Perché? È perché questo è solo un builtin? La risposta # 1 di Python da 41 byte (che non è più valida) era solo un wrapper per un builtin.
CalcolatriceFeline

It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern.(Appello all'autorità: Martin) (ma anche buon senso)
edc65,

@ edc65 Meta post correlato . Sono abbastanza sicuro che sia consentito, poiché gli incorporati sono generalmente consentiti per impostazione predefinita. Richiede creatività e conoscenza da parte dell'utente per conoscere la relativa funzione integrata.
mbomb007,

1
@ mbomb007 consentito forse - creatività no. Non ho contrassegnato questa risposta come invalida, ma
mantengo il

3

Julia, 4 byte

lpad

Passa tutti i casi di test:

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

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

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

julia> lpad(1, 2, '-')
"-1"

Funziona per rect 7 cor?
CalcolatriceFeline

Sì. lpad("rect", 7, "cor") => "correct"
Fengyang Wang,

3

Javascript (ES6), 55 byte

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

Crea una matrice vuota di valori e unisciti alla versione.

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

È più leggibile ma returnaggiunge alcuni caratteri in più.


Poiché la domanda è in attesa, inserirò la mia risposta nella risposta JS che è più simile alla mia. 43 byte (s, n, c = '') => (Array (n) .join (c) + s) .slice (-n)
Charlie Wynn

Suggerimento: `per inline code blocks..
CalcolatriceFeline

+=restituisce il valore dell'operando di sinistra, quindi la seconda versione diventa più corta: (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)ma diventa più lunga quando si aggiungono stringhe di riempimento multichar.
CalcolatriceFeline

3

Bash, 57 byte

Parametri: larghezza della stringa padchar

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

Crea una stringa di spazi di larghezza .

Converti ogni personaggio spaziale in padchar .

Scrivi padding quindi stringa .


2

Python, 41 byte

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

Senza rjust incorporato, 43 byte:

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

(non quello che ci si aspetta che faccia, ma passa la suite di test)


È possibile rimuovere s=stre sostituire scon strper lo stesso numero di byte.
CalcolatriceFeline

2

Gelatina , 12 byte

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

Così tanti riferimenti variabili. Jelly non doveva essere una lingua tacita ?

Provalo online!

Come funziona

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

padchar (⁵, defaults to 10)non dovrebbe essere predefinito 20o 32?
gatto

1
I caratteri da 3 a 9 sono costanti inizializzati su argomenti (se presenti) o su alcuni utili valori predefiniti. Il condizionale ?controlla se ha il suo valore predefinito 10 e in questo caso genera uno spazio.
Dennis,

2

JavaScript ES7, 16 byte

''.padStart.bind

built-in ftw! Funziona solo su Firefox 48 e versioni successive. Valido in quanto questa funzione è stata aggiunta il 12 marzo.

Questo richiede input come:

(''.padStart.bind)(arg1)(arg2,arg3)

1

Pike , 67 byte

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

sospiro . La stringa vuota ""restituisce true. Perché!?

zuppa di luccio mista mista mista mista


Un'altra lingua con stupide verità.
CalcolatriceFeline

@CatsAreFluffy sì, Pike è un po 'strano, ma ha delle belle utility per l'elaborazione delle stringhe.
gatto

1

Pyke, 12 bytes (noncompeting)

aggiunto nodo di input, correzione di bug sul nodo len, modifica dei risultati predefiniti su nodo di assegnazione dopo la pubblicazione della sfida.

\ =zzjl-z*j+

Spiegazione:

\ =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

+1 because answering in the language is helping you refine it :)
cat

I've edited the format of your header to make it easier to read & easier for userscripts, etc to parse -- roll it back if you disagree.
cat

Why the downvote?
Blue

1
@muddyfish It seems that every non-Javascript answer here is downvoted.
Adnan

@AandN thats just not nice... Also why I couldn't see a pattern from the top 6 answers
Blue

1

JavaScript ES6, 38 bytes

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

An alternate solution.


1

JavaScript (ES6), 34 bytes

I used a recursive solution.

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

0

Ruby, 42 bytes

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

Parameters: string, size, padchar.

Test suite below; should print all "true"s, just put everything in the same file.

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"

You don't need to use that method name... and you can probably make it a lambda, too. (All the other examples do similar)
Not that Charles

0

Java 8, 86 88 bytes

This is a function. The third argument is a varargs to allow the optional pad char (defaults to ' ')

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

Recursion! +2 bytes (added brackets because of incompatible type error)


This TypeErrors. Can always test Ideone (Java 7, but I get the same exact error in Java 8 on my box) ideone.com/B7gTA5
cat

0

PHP, 54 48 bytes

Uses Windows-1252 encoding.

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

Run like this (-d added for easthetics only):

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

Old version (without the builtin):

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

Tweaks

  • Saved 6 bytes by using str_pad instead of a loop. Leaving the old one for reference, as builtins are frowned upon

0

R, 50 bytes

Late to the party again but here it goes:

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

This simply prints the output to stdout but does not actually return the padded string (wasn't sure if this is a requirement for the challenge). If this is needed, the solution is slightly longer at 61 bytes:

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

-3

C, 64 bytes

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

Try it here.


2
This does not comply with the specification, as it does not default to space when a character is not provided.
Doorknob

This code doesn't run as given. gcc will let undefined reference to function printf pass and include printf itself, but no such luck for memset, asprintf, and strlen. You need to add the #include<string.h>... etc definitions to make this valid.
cat

@tac Hmmm...I wrote and tested my answer completely within ideone. It compiles and runs successfully on that platform, though it states that it uses gcc-5.1. I'm not sure if they're using compiler flags or what-have-you behind the scenes that I'm not aware of. I was initially using this as my justification for it not running in your environment, but now I'm not sure...
Cole Cameron

well, this is gcc 5.2.1 on Linux, so you might be able to get away with saying Ideone C, 64 bytes but if you're gonna claim it's C, make it compile. :p
cat

I'm only a beginner at C: Why does f take four parameters, not 3? Are you requiring the address of the string, or...? either way, f should take at most 3 arguments.
cat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.