Javascript golf de gauche

27

introduction

Dans le sillage des retombées du paquet npm de gauche , ayons un code golf pour implémenter le gauche pad.

La fonction de gauche-pad se compose de 2 arguments par défaut et 1 argument supplémentaire, sous la forme de chaîne , longueur , ( padchar ). Si le padchar n'est pas donné, il est normalisé en un caractère espace . Prenons un exemple avec deux arguments:

left_pad("abc", 6)

Tout d'abord, nous observons la longueur de la chaîne, qui est 3 . Après cela, nous devons remplir cette chaîne à gauche jusqu'à ce que la longueur de la chaîne complète ait atteint la longueur indiquée dans la fonction. Dans ce cas 6 . Puisque le padchar n'est pas donné , nous devons le remplir avec des espaces:

   abc

Il s'agit d'une chaîne avec 3 espaces et la chaîne initiale, résultant en une chaîne de longueur 6. Voici un exemple avec le padchar donné:

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

Nous faisons juste la même chose que l'exemple ci-dessus, mais remplaçons les espaces par le padchar. Dans ce cas, le tiret:

---abc

La tâche

Étant donné la chaîne , la longueur et peut - être l'argument supplémentaire padchar , affichez la chaîne remplie à gauche. Vous pouvez supposer que le numéro de longueur est égal ou supérieur à la longueur de la chaîne. Le padchar sera toujours composé d'un caractère.

Cas de 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"

C'est du , donc la soumission avec le plus petit nombre d'octets gagne!

m0sa
la source
13
@ m0sa Il y a encore quelques problèmes. Restreindre le défi au javascript est fortement déconseillé - il n'y a aucune raison pour que d'autres langues ne puissent pas y participer. La spécification doit décrire le comportement souhaité et la plage des entrées autorisées possibles sans avoir besoin de suivre un lien. On ne sait pas clairement comment le troisième paramètre est géré.
xnor
8
Je suis certain qu'une référence à Javascript peut être faite pour la motivation, sans avoir à dire "donc aucune autre langue n'est autorisée à jouer". Si vous êtes particulièrement intéressé à voir les meilleures entrées Javascript, vous pouvez offrir une prime, tout en laissant le défi ouvert à d'autres langues.
trichoplax
6
Les questions dans une seule langue sont interdites ou elles ne le sont pas. S'ils sont interdits, fermez-le. S'ils sont autorisés, laissez le PO restreindre la question à leur guise.
Sklivvz
10
@Sklivvz (et m0sa) Il y a de rares cas où les défis spécifiques à la langue ont du sens, en particulier si le défi nécessite une caractéristique très unique d'une langue pour avoir du sens ou même être un défi en premier lieu. C'est la principale raison pour laquelle ceux-ci sont autorisés et pourquoi je serais également opposé à les interdire complètement. Cela dit, pour un défi qui ne sens que dans toutes les langues, il n'y a aucune raison de limiter à une seule langue. Sinon, nous aurions "Trier un tableau en JavaScript", "Trier un tableau en Ruby", "Trier un tableau en Python" ... et 300 autres défis sans aucun avantage.
Martin Ender
8
@Sklivvz Comme l'a dit trichoplax, c'est une bonne motivation pour un défi, mais cela se résume à une tâche de traitement de chaîne très simple qui a tout autant de sens dans n'importe quelle autre langue. Le défi n'est pas spécifiquement difficile, faisable ou intéressant en JavaScript par rapport à n'importe quelle autre langue (en particulier, quelqu'un pourrait ne pas être au courant du paquetage de gauche, et poser toujours cette question sans restriction de langue, et les réponses en JavaScript ne le feraient pas) t ont été affectés du tout, et personne n'aurait pensé "pourquoi n'est-ce pas JS uniquement?").
Martin Ender

Réponses:

20

Pyth, 13 11 octets

+*.xwd-Qlzz

Essayez-le ici .

Prend l'entrée de STDIN comme chaîne sur la première ligne, longueur sur la deuxième ligne et caractère de remplissage éventuellement sur une troisième ligne.

Poignée de porte
la source
4
Ceci est supposé être uniquement javascript
MMM
22
@MMM Les restrictions de langue dans les défis sont si universellement détestées que je m'attends à ce qu'elles soient sommairement ignorées. Personne n'aime qu'on lui dise " tu ne peux pas participer".
xnor
34
@MMM en.wikipedia.org/wiki/Civil_disobedience
Poignée de porte
2
Collez-le à l'homme! Vous allez poignée de porte! Ne laissez pas vos rêves être des rêves! SIMPLEMENT FAIS-LE!
Mave
4
C'est une société méchante où les modérateurs sont ceux qui font de la désobéissance civile!
Ven
13

JavaScript (ES6), 43 octets

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)
Neil
la source
1
il vous manque le 3ème paramètre
m0sa
@ m0sa Merci, fixe.
Neil
Il échoue au troisième test, maintenant ;-)
Sklivvz
1
@Sklivvz Ugh, c'est ce que j'obtiens pour ne pas lire correctement les exigences.
Neil
Au lieu de p+=s, vous pouvez ajouter 2 octets pour le faire p+=[s], et cela fonctionnera.
Aplet123
7

JavaScript (ES6), 37 43 44 octets

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

Tester:

> 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

Je ne sais pas si vous voulez compter la déclaration de fonction, je l'inline.

Sklivvz
la source
Je pense qu'en général, nous ne comptons pas la déclaration de fonction à moins que la question ne demande spécifiquement un programme complet plutôt qu'une fonction.
Deusovi
sliceest plus court que substr.
Mama Fun Roll
@Deusovi à droite. ce que je veux dire, c'est que je ne ferais pas console.log(f("whatever",10, "*")), maisconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz
7

Javascript ES6, 35 octets

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

Essayez-le. Je crois que c'est l'implémentation la plus courte possible actuellement possible en Javascript.

David
la source
C'est ce que j'allais faire, sauf que ce n'était pas une fonction anonyme.
Aplet123
@ Aplet123 Je pense que d'après la définition du concours de ce qui est attendu, c'est ok. Il demandait simplement la fonction; le nommer n'est pas pertinent dans ce contexte ou du moins c'est ce que je penserais sur la base d'autres réponses.
David
5

Python 3, 33 31 29 octets

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

Assez simple. Merci à @xnor de me le rappeler str.rjustest une chose. : P

Pour la même longueur (également grâce à xnor):

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

Solution précédente:

lambda a,b,x=" ":x*(b-len(a))+a
chat
la source
C'est un peu plus court à faire (x*b+a)[-b:]ou a.rjust(b,x). En fait, str.rjustlui - même fonctionne sans doute pour le tout.
xnor
@xnor J'ai oublié que rjustc'était une fonction intégrée, merci!
cat
Aucun de ceux-ci ne suit la spécification:f(1, 2, 0) === '01';
Valentin Lorentz
@ValentinLorentz J'ai demandé au PO des éclaircissements sur les langues qui ne contraignent pas les nombres aux chaînes par défaut, et je n'ai pas obtenu de réponse. Comme cette question n'a pas de spécification formelle, je vais supposer que les arguments sont tous des chaînes.
cat
Maintenant, il y a une spécification et la solution 1 n'est pas valide (testée sur Python 2.7.10)
CalculatorFeline
5

05AB1E , 11 9 octets

Code:

g-ð³0@×¹«

Explication:

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.

Utilise l' encodage CP-1252 . Essayez-le en ligne .

Adnan
la source
1
Tous ces caractères correspondent à la page de code Jelly (0x672D188330401181FA)
CalculatorFeline
5

JavaScript (ES5), 70 octets

Utilisation de la récursivité ...

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

Ma tentative initiale n'était que de 57 octets:

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

Mais seulement réussi les 2 premiers tests:

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

J'aime toujours le plus court, car dans la pratique, passer des nombres à une fonction de manipulation de chaîne n'est pas une fonctionnalité dont j'aurais besoin.

rjmunro
la source
4

Mathematica, 13 octets

StringPadLeft

Réponse intégrée n ° 3 (la première était Range, la seconde était Surd) Ou moins intégrée: (35 octets)

##2~StringRepeat~(#3-Length@#2)<>#&
CalculatorFeline
la source
Puis-je discrètement voter?
edc65
2
...Pourquoi? Est-ce parce que c'est juste une fonction intégrée? La réponse Python n ° 1 de 41 octets (qui n'est plus valide) n'était qu'un wrapper pour une fonction intégrée.
CalculatorFeline
It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern.(Appel à l'autorité: Martin) (mais aussi du bon sens)
edc65
@ edc65 Meta post connexe . Je suis presque sûr que c'est autorisé, car les intégrés sont généralement autorisés par défaut. Il faut de la créativité et des connaissances de la part de l'utilisateur pour connaître la fonction intégrée pertinente.
mbomb007
1
@ mbomb007 autorisé peut-être - création non. Je n'ai pas signalé cette réponse comme non valide, mais j'ai maintenu mon vote
négatif
3

Julia, 4 octets

lpad

Réussit tous les cas de test:

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

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

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

julia> lpad(1, 2, '-')
"-1"
Fengyang Wang
la source
Ça marche rect 7 cor?
CalculatorFeline
Oui. lpad("rect", 7, "cor") => "correct"
Fengyang Wang
3

Javascript (ES6), 55 octets

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

Créez un tableau de valeurs vide et joignez la version.

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

Est plus lisible mais returnajoute quelques caractères supplémentaires.

implorer
la source
Puisque la question est en suspens, je vais mettre ma réponse sous la réponse JS qui ressemble le plus à la mienne. 43 octets (s, n, c = '') => (Array (n) .join (c) + s) .slice (-n)
Charlie Wynn
Astuce: `pour inline code blocks..
CalculatorFeline
+=renvoie la valeur de son opérande gauche, de sorte que la deuxième version devient plus courte: (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)mais elle devient plus longue lorsque vous ajoutez des chaînes de remplissage multichar.
CalculatorFeline
3

Bash, 57 octets

Paramètres: largeur de chaîne padchar

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

Faites une chaîne d' espaces de largeur .

Convertissez chaque caractère d'espace en padchar .

Écrivez le remplissage puis la chaîne .

philcolbourn
la source
2

Python, 41 octets

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

Sans le droit intégré, 43 octets:

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

(pas ce que l'on attend de lui, mais il passe la suite de tests)

Valentin Lorentz
la source
Vous pouvez supprimer s=stret remplacer spar strpour le même nombre d'octets.
CalculatorFeline
2

Gelée , 12 octets

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

Tant de références variables. Jelly n'était-il pas censé être une langue tacite ?

Essayez-le en ligne!

Comment ça marche

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
la source
padchar (⁵, defaults to 10)ne devrait-il pas par défaut être 20ou 32?
chat
1
Les exposants 3 à 9 sont des constantes qui sont initialisées en arguments (si présents) ou en quelques valeurs par défaut utiles. Le conditionnel ?vérifie s'il a sa valeur par défaut 10 et donne un espace dans ce cas.
Dennis
2

JavaScript ES7, 16 octets

''.padStart.bind

ftw intégré! Fonctionne uniquement sur Firefox 48 et supérieur. Valide car cette fonctionnalité a été ajoutée le 12 mars.

Cela prend une entrée comme:

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

Brochet , 67 octets

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

soupir . La chaîne vide est ""évaluée à true. Pourquoi!?

mixte mixte mixte mixte mixte soupe de brochet ...

chat
la source
Une autre langue avec des vérités stupides.
CalculatorFeline
@CatsAreFluffy oui, Pike est un peu bizarre, mais il a de bons utilitaires de traitement de chaîne.
cat
1

Pyke , 12 octets (non compétitif)

ajout du nœud d'entrée, correction de bugs sur le nœud len, modification des résultats par défaut sur l'affectation du nœud après la publication du défi.

\ =zzjl-z*j+

Explication:

\ =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
Bleu
la source
+1 parce que répondre dans la langue vous aide à l'affiner :)
cat
J'ai modifié le format de votre en-tête pour le rendre plus facile à lire et plus facile pour les scripts utilisateurs, etc. à analyser - annulez-le si vous n'êtes pas d'accord.
cat
Pourquoi le downvote?
Blue
1
@muddyfish Il semble que toutes les réponses non Javascript ici soient sous-évaluées.
Adnan
@AandN c'est tout simplement pas sympa ... Aussi pourquoi je ne pouvais pas voir un motif des 6 meilleures réponses
Blue
1

JavaScript ES6, 38 octets

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

Une solution alternative.

Conor O'Brien
la source
1

JavaScript (ES6), 34 octets

J'ai utilisé une solution récursive.

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

Rubis, 42 octets

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

Paramètres: chaîne, taille, padchar.

Suite de tests ci-dessous; devrait imprimer tous les "vrais", il suffit de tout mettre dans le même fichier.

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
la source
Vous n'avez pas besoin d'utiliser ce nom de méthode ... et vous pouvez probablement en faire également un lambda. (Tous les autres exemples font de même)
Pas que Charles
0

Java 8, 86 88 octets

Ceci est une fonction. Le troisième argument est a varargspour autoriser le caractère optionnel du pad (par défaut ' ')

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

Récursivité! +2 octets (crochets ajoutés en raison d'une erreur de type incompatible)

HyperNeutrino
la source
Ce TypeErrors. Peut toujours tester Ideone (Java 7, mais j'obtiens la même erreur exacte dans Java 8 sur ma boîte) ideone.com/B7gTA5
cat
0

PHP, 54 48 octets

Utilise l'encodage Windows-1252.

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

Courez comme ceci ( -dajouté pour l'esthétique uniquement):

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

Ancienne version (sans le intégré):

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

Tweaks

  • Enregistré 6 octets en utilisant str_padau lieu d'une boucle. Laissant l'ancien pour référence, car les éditeurs sont mal vus
aross
la source
0

R, 50 octets

Retard à la fête, mais c'est parti:

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

Cela imprime simplement la sortie sur stdout mais ne retourne pas réellement la chaîne rembourrée (je ne savais pas si c'était une exigence pour le défi). Si cela est nécessaire, la solution est légèrement plus longue à 61 octets:

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

C, 64 octets

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

Essayez-le ici .

Cole Cameron
la source
2
Ceci n'est pas conforme à la spécification, car il ne prend pas d'espace par défaut lorsqu'un caractère n'est pas fourni.
Poignée de porte
Ce code ne s'exécute pas comme indiqué. gcclaissera undefined reference to function printfpasser et inclure printflui - même, mais pas de chance pour memset, asprintfet strlen. Vous devez ajouter les #include<string.h>définitions ... etc pour le rendre valide.
chat
@tac Hmmm ... J'ai écrit et testé ma réponse complètement dans ideone. Il compile et s'exécute avec succès sur cette plate-forme, bien qu'il indique qu'il l'utilise gcc-5.1. Je ne sais pas s'ils utilisent des drapeaux de compilateur ou ce que vous avez dans les coulisses que je ne connais pas. J'utilisais initialement cela comme justification pour qu'il ne fonctionne pas dans votre environnement, mais maintenant je ne suis pas sûr ...
Cole Cameron
eh bien, c'est gcc 5.2.1sur Linux, donc vous pourrez peut-être vous en tirer Ideone C, 64 bytesmais si vous prétendez que c'est C, faites-le compiler. : p
cat
Je ne suis qu'un débutant chez C: pourquoi fprend quatre paramètres, pas 3? Avez-vous besoin de l'adresse de la chaîne ou ...? de toute façon, fdevrait prendre au plus 3 arguments.
cat