Golfe esquerdo do Javascript

27

Introdução

Na esteira da esquerda-pad pacote npm precipitação , vamos ter um golf código para a implementação deixou-pad.

A função do teclado esquerdo consiste em 2 argumentos padrão e 1 argumento adicional, no formato string , length , ( padchar ). Se o padchar não for fornecido, isso será padronizado para um caractere de espaço . Vamos dar um exemplo com dois argumentos:

left_pad("abc", 6)

Primeiro, observamos o comprimento da corda, que é 3 . Depois disso, precisamos preencher esta string à esquerda até que o comprimento da string completa atinja o comprimento indicado na função. Nesse caso 6 . Como o padchar não é fornecido , precisamos preenchê- lo com espaços:

   abc

Esta é uma string com 3 espaços e a string inicial, resultando em uma string com comprimento 6. Aqui está um exemplo com o padchar fornecido:

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

Apenas fazemos o mesmo que o exemplo acima, mas substituímos os espaços pelo padchar. Nesse caso, o hífen:

---abc

A tarefa

Dada a sequência , o comprimento e, talvez, o argumento adicional de argumento , produz a sequência preenchida à esquerda. Você pode supor que o número do comprimento seja igual ou superior ao comprimento da string. O padchar sempre será composto de 1 caractere.

Casos de teste

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"

Isso é , então a submissão com o menor número de bytes vence!

m0sa
fonte
13
@ m0sa Ainda existem alguns problemas. Restringir o desafio ao javascript é fortemente desencorajado - não há razão para que outros idiomas não possam participar. A especificação deve descrever o comportamento desejado e o intervalo de possíveis entradas permitidas sem a necessidade de seguir um link. Não está claro como o terceiro parâmetro está sendo tratado.
Xnor
8
Estou certo de que uma referência relevante ao Javascript pode ser feita para motivar, sem precisar dizer "portanto, nenhum outro idioma pode ser reproduzido". Se você estiver particularmente interessado em ver as melhores entradas Javascript, poderá oferecer uma recompensa por isso, deixando o desafio em aberto para outros idiomas.
Trichoplax
6
As perguntas em um único idioma são proibidas ou não. Se eles forem proibidos, feche isso. Se eles forem permitidos, deixe o OP restringir a pergunta como quiserem.
22416 Sklivvz
10
@Sklivvz (e m0sa) Existem casos raros em que os desafios específicos de um idioma fazem sentido, principalmente se o desafio exigir algum recurso muito exclusivo de um idioma para fazer sentido ou até ser um desafio em primeiro lugar. Essa é a principal razão pela qual elas são permitidas e por que eu também me oporia a desautorizá-las completamente. Dito isto, para qualquer desafio que faz faz sentido em qualquer idioma, não há nenhuma boa razão para restringi-lo a um idioma. Caso contrário, teríamos "Classificar uma matriz em JavaScript", "Classificar uma matriz em Ruby", "Classificar uma matriz em Python" ... e mais 300 desafios sem nenhum benefício.
Martin Ender
8
@ Sklivvz Como o Trichoplax disse, essa é uma boa motivação para um desafio, mas tudo se resume a uma tarefa muito simples de processamento de strings que faz tanto sentido em qualquer outro idioma. O desafio não é especificamente difícil, factível ou interessante em JavaScript, em comparação com qualquer outro idioma (em particular, alguém pode não saber sobre o pacote esquerdo, e ainda assim fazer essa pergunta sem a restrição de idioma, e as respostas em JavaScript não seriam ' não foi afetado, e ninguém teria pensado "por que isso não é apenas JS?").
Martin Ender

Respostas:

20

Pitão, 13 11 bytes

+*.xwd-Qlzz

Experimente aqui .

Recebe entrada de STDIN como a sequência na primeira linha, o comprimento na segunda linha e o caractere de preenchimento opcionalmente na terceira linha.

Maçaneta da porta
fonte
4
Este é suposto ser javascript única
MMM
22
As restrições de idioma do @MMM nos desafios são tão odiadas universalmente que eu espero que sejam sumariamente ignoradas. Ninguém gosta de saber que você não pode participar.
Xnor
2
Cole-o ao homem! Você vai maçaneta! Não deixe seus sonhos serem sonhos! APENAS FAÇA!
Mave
4
É uma sociedade perversa, onde os moderadores são os que fazem desobediência civil!
Ven
13

JavaScript (ES6), 43 bytes

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)
Neil
fonte
1
você está perdendo o terceiro parâmetro
m0sa
@ m0sa Obrigado, corrigido.
Neil
Ele falhar o terceiro teste, agora ;-)
Sklivvz
1
@ Sklivvz Ugh, é o que recebo por não ler os requisitos corretamente.
Neil
Em vez de p+=s, você pode adicionar 2 bytes para fazê-lo p+=[s], e ele funcionará.
Aplet123
7

JavaScript (ES6), 37 43 44 bytes

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

Teste:

> 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

Não tenho certeza se você deseja contar a declaração da função, eu inline isso.

Sklivvz
fonte
Penso que, geralmente, não contamos a declaração da função, a menos que a pergunta solicite especificamente um programa completo em vez de uma função.
Deusovi 24/03
sliceé mais curto que substr.
Mama Fun Rolo
@Deusovi certo. o que quero dizer é que eu não faria console.log(f("whatever",10, "*")), masconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz
7

Javascript ES6, 35 bytes

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

Tente. Acredito que esta seja a implementação mais curta possível atualmente em Javascript.

David
fonte
Era isso que eu ia fazer, exceto que não era uma função anônima.
Aplet123
@ Aplet123 Acho que pela definição do concurso do que é esperado, está tudo bem. Estava apenas pedindo a função; nomeá-lo é irrelevante neste contexto ou, pelo menos, é o que eu pensaria com base em outras respostas.
David
5

Python 3, 33 31 29 bytes

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

Bastante direto. Graças a @xnor por me lembrar str.rjusté uma coisa. : P

Para o mesmo comprimento (também graças ao xnor):

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

Solução anterior:

lambda a,b,x=" ":x*(b-len(a))+a
gato
fonte
É um pouco mais curto para fazer (x*b+a)[-b:]ou a.rjust(b,x). Na verdade, str.rjustele próprio funciona sem dúvida para a coisa toda.
Xnor
@ xnor eu esqueci que rjustera um builtin, obrigado!
cat
Nenhuma dessas segue as especificações: #f(1, 2, 0) === '01';
Valentin Lorentz
@ValentinLorentz Pedi ao OP esclarecimentos sobre idiomas que não obrigam números a seqüências de caracteres por padrão e não obtiveram resposta. Como essa pergunta não tem especificação formal, vou assumir que os argumentos são todos strings.
cat
Agora há uma especificação e a solução 1 é inválida (testada no Python 2.7.10)
CalculatorFeline
5

05AB1E , 11 9 bytes

Código:

g-ð³0@×¹«

Explicação:

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.

Usa a codificação CP-1252 . Experimente online .

Adnan
fonte
1
Todos estes caracteres caber na página de código Jelly (0x672D188330401181FA)
CalculatorFeline
5

JavaScript (ES5), 70 bytes

Usando recursão ...

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

Minha partida inicial foi de apenas 57 bytes:

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

Mas apenas passou nos dois primeiros testes:

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

Ainda gosto do mais curto, porque, na prática, passar números para uma função de manipulação de string não é um recurso que eu precisaria.

rjmunro
fonte
4

Mathematica, 13 bytes

StringPadLeft

Resposta interna apenas # 3 (a primeira foi Range, a segunda foi Surd) Ou menos incorporada: (35 bytes)

##2~StringRepeat~(#3-Length@#2)<>#&
CalculatorFeline
fonte
Posso votar em silêncio?
edc65
2
...Por quê? É porque isso é apenas um builtin? A resposta # 1 de 41 bytes do Python (que não é mais válida) era apenas um invólucro para um builtin.
CalculatorFeline
It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern. (Apelo à autoridade: Martin) (mas também ao bom senso)
edc65
@ edc65 Meta-publicação relacionada . Tenho certeza de que é permitido, pois os embutidos geralmente são permitidos por padrão. Requer criatividade e conhecimento por parte do usuário para conhecer a função interna relevante.
mbomb007
1
@ mbomb007 permitido talvez - criativo não. Não sinalizei esta resposta como inválida, mas mantenho meu voto negativo
edc65
3

Julia, 4 bytes

lpad

Passa em todos os casos de teste:

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

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

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

julia> lpad(1, 2, '-')
"-1"
Fengyang Wang
fonte
Isso funciona rect 7 cor?
CalculatorFeline
Sim. lpad("rect", 7, "cor") => "correct"
Fengyang Wang 27/03
3

Javascript (ES6), 55 bytes

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

Crie uma matriz vazia de valores e participe da versão.

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

É mais legível, mas returnadiciona mais alguns caracteres.

reclamar
fonte
Como a pergunta está em espera, colocarei minha resposta na resposta JS mais parecida com a minha. 43 bytes (s, n, c = '') => (Matriz (n) .join (c) + s) .slice (-n)
Charlie Wynn
Dica: `para inline code blocks..
CalculatorFeline
+=retorna o valor de seu operando esquerdo, portanto a segunda versão fica mais curta: (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)mas fica mais longa quando você adiciona seqüências de preenchimento multichar.
CalculatorFeline
3

Bash, 57 bytes

Parâmetros: largura da cadeia padchar

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

Faça uma sequência de espaços de largura .

Converta cada caractere de espaço em padchar .

Escreva o preenchimento e depois a corda .

philcolbourn
fonte
2

Python, 41 bytes

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

Sem o ajuste interno, 43 bytes:

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

(não o que se espera, mas passa no conjunto de testes)

Valentin Lorentz
fonte
Você pode remover s=stre substituir scom stra mesma contagem de bytes.
CalculatorFeline
2

Gelatina , 12 bytes

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

Tantas referências de variáveis. Jelly não deveria ser uma linguagem tácita ?

Experimente online!

Como 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
fonte
padchar (⁵, defaults to 10)não deveria usar como padrão 20ou 32?
gato
1
O sobrescrito 3 a 9 são constantes que são inicializadas em argumentos (se presentes) ou em alguns valores padrão úteis. A condicional ?verifica se ele tem seu valor padrão 10 e gera um espaço nesse caso.
Dennis
2

JavaScript ES7, 16 bytes

''.padStart.bind

ftw embutido! Funciona apenas no Firefox 48 e superior. Válido como este recurso foi adicionado em 12 de março.

Isso leva a entrada como:

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

Pike , 67 bytes

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

suspiro . A cadeia vazia é ""avaliada como true.Por quê!?

misto misto misto misto misto ...

gato
fonte
Outra linguagem com verdades estúpidas.
CalculatorFeline
@CatsAreFluffy Sim, Pike é meio estranho, mas tem bons utilitários de processamento de cordas.
cat
1

Pyke , 12 bytes (não competitivo)

nó de entrada adicionado, correção de bug no nó len, altere os resultados padrão no nó de atribuição após o lançamento do desafio.

\ =zzjl-z*j+

Explicação:

\ =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
fonte
+1 porque responder no idioma está ajudando você a refiná-lo :) #
cat
Editei o formato do seu cabeçalho para facilitar a leitura e facilitar a leitura dos scripts do usuário, etc. - reverta-o se você não concordar.
cat
Por que o voto negativo?
Azul
1
@muddyfish Parece que todas as respostas não Javascript aqui estão com voto negativo.
Adnan
@AandN isso é apenas não agradável ... Também por isso que eu não podia ver um padrão a partir do topo 6 respostas
Azul
1

JavaScript ES6, 38 bytes

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

Uma solução alternativa.

Conor O'Brien
fonte
1

JavaScript (ES6), 34 bytes

Eu usei uma solução recursiva.

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

Ruby, 42 bytes

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

Parâmetros: string, tamanho, padchar.

Conjunto de teste abaixo; deve imprimir todos os "verdadeiros", basta colocar tudo no mesmo arquivo.

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
fonte
Você não precisa usar esse nome de método ... e provavelmente também pode torná-lo um lambda. (Todos os outros exemplos fazer similar)
Não que Charles
0

Java 8, 86 88 bytes

Esta é uma função. O terceiro argumento é a varargspara permitir o pad pad opcional (o padrão é ' ')

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

Recursão! +2 bytes (colchetes adicionados devido a erro de tipo incompatível)

HyperNeutrino
fonte
Este TypeErrors. Sempre pode testar Ideone (Java 7, mas eu recebo o mesmo erro exato em Java 8 na minha caixa) ideone.com/B7gTA5
cat
0

PHP, 54 48 bytes

Usa a codificação Windows-1252.

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

Execute assim ( -dadicionado apenas 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

Versão antiga (sem o builtin):

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

Tweaks

  • Economizou 6 bytes usando em str_padvez de um loop. Deixando o antigo para referência, pois os componentes internos são desaprovados
aross
fonte
0

R, 50 bytes

Tarde para a festa novamente, mas aqui vai:

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

Isso simplesmente imprime a saída em stdout, mas na verdade não retorna a string acolchoada (não tinha certeza se isso é um requisito para o desafio). Se isso for necessário, a solução será um pouco mais longa em 61 bytes:

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

C, 64 bytes

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

Experimente aqui .

Cole Cameron
fonte
2
Isso não está de acordo com a especificação, pois não padroniza o espaço quando um caractere não é fornecido.
Maçaneta
Este código não é executado como indicado. gccvai deixar undefined reference to function printfpassar e incluem printf-se, mas não sorte para memset, asprintf, e strlen. Você precisa adicionar as #include<string.h>definições ... etc para tornar isso válido.
cat
@ tac Hmmm ... eu escrevi e testei minha resposta completamente dentro de ideone. Ele compila e roda com êxito nessa plataforma, embora afirme que usa gcc-5.1. Não tenho certeza se eles estão usando sinalizadores de compilador ou o que você tem nos bastidores que eu não conheço. Eu estava inicialmente usando esta como a minha justificativa para não correr em seu ambiente, mas agora eu não tenho certeza ...
Cole Cameron
bem, isso é gcc 5.2.1no Linux, então você pode se safar dizendo isso, Ideone C, 64 bytesmas se você quiser dizer que é C, faça-o compilar. : p
cat
Eu sou apenas iniciante na C: Por que fquatro parâmetros, não três? Você está exigindo o endereço da string ou ...? de qualquer forma, fdeve levar no máximo 3 argumentos.
cat