Javascript Links-Pad-Golf

27

Einführung

Lassen Sie uns nach dem Fallout des npm-Pakets mit dem linken Pad einen Code für die Implementierung des linken Pads erstellen.

Die Funktion für das linke Feld besteht aus 2 Standardargumenten und 1 zusätzlichen Argument in der Form Zeichenfolge , Länge ( padchar ). Wenn das Padchar nicht angegeben ist, wird dies auf ein Leerzeichen standardisiert . Nehmen wir ein Beispiel mit zwei Argumenten:

left_pad("abc", 6)

Zuerst beobachten wir die Länge der Zeichenkette, die 3 ist . Danach müssen wir diese Zeichenfolge links auffüllen, bis die Länge der vollständigen Zeichenfolge die in der Funktion angegebene Länge erreicht hat. In diesem Fall 6 . Da das Padchar nicht angegeben ist , müssen wir dieses mit Leerzeichen auffüllen :

   abc

Dies ist eine Zeichenfolge mit 3 Leerzeichen und der Anfangszeichenfolge, die zu einer Zeichenfolge mit der Länge 6 führt. Hier ist ein Beispiel mit dem angegebenen Padchar:

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

Wir machen einfach dasselbe wie im obigen Beispiel, ersetzen jedoch die Leerzeichen durch das Padchar. In diesem Fall lautet der Bindestrich:

---abc

Die Aufgabe

Geben Sie unter Berücksichtigung der Zeichenfolge , der Länge und möglicherweise des zusätzlichen Argumentes padchar die links aufgefüllte Zeichenfolge aus. Sie können davon ausgehen, dass die Länge gleich oder größer als die Länge der Zeichenfolge ist. Das Padchar besteht immer aus 1 Zeichen.

Testfälle

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"

Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!

m0sa
quelle
13
@ m0sa Es gibt noch ein paar Probleme. Es wird dringend davon abgeraten, die Herausforderung auf JavaScript zu beschränken. Es gibt keinen Grund, warum andere Sprachen nicht daran teilnehmen können. Die Spezifikation sollte das gewünschte Verhalten und den Bereich möglicher zulässiger Eingaben beschreiben, ohne einem Link folgen zu müssen. Es ist nicht ohne weiteres klar, wie der dritte Parameter behandelt wird.
Xnor
8
Ich bin mir sicher, dass ein Javascript-relevanter Verweis zur Motivation gemacht werden kann, ohne sagen zu müssen "daher dürfen keine anderen Sprachen spielen". Wenn Sie besonders daran interessiert sind, die besten Javascript-Einträge zu sehen, können Sie eine Prämie dafür anbieten, während Sie die Herausforderung für andere Sprachen offen lassen.
Trichoplax
6
Einzelne Fragen sind entweder verboten oder nicht. Wenn sie verboten sind, schließen Sie diese. Wenn sie erlaubt sind, lassen Sie das OP die Frage nach Belieben einschränken.
Sklivvz
10
@Sklivvz (und m0sa) Es gibt seltene Fälle, in denen sprachspezifische Herausforderungen sinnvoll sind, insbesondere wenn für die Herausforderung ein bestimmtes Merkmal einer Sprache erforderlich ist, um sinnvoll zu sein oder überhaupt eine Herausforderung zu sein. Das ist der Hauptgrund, warum diese erlaubt sind und warum ich es ablehnen würde, sie komplett zu verbieten. Wie gesagt, für jede Herausforderung, macht Sinn in jeder Sprache, es gibt keinen guten Grund , es auf eine Sprache zu beschränken. Andernfalls hätten wir "Ein Array in JavaScript sortieren", "Ein Array in Ruby sortieren", "Ein Array in Python sortieren" ... und 300 weitere Herausforderungen, die keinen Nutzen bringen.
Martin Ender
8
@Sklivvz Wie Trichoplax sagte, ist dies eine gute Motivation für eine Herausforderung, aber es läuft auf eine sehr einfache Aufgabe zur Verarbeitung von Saiten hinaus, die in jeder anderen Sprache genauso sinnvoll ist. Die Herausforderung ist in JavaScript im Vergleich zu anderen Sprachen nicht besonders schwierig, machbar oder interessant (insbesondere jemand, der möglicherweise nicht über das Linkspad-Paket Bescheid weiß und diese Frage immer noch ohne die Spracheinschränkung stellt, und die Antworten in JavaScript nicht. ' Sie waren überhaupt nicht betroffen, und niemand hätte gedacht, "warum ist das nicht nur JS?".
Martin Ender

Antworten:

20

Pyth, 13 11 Bytes

+*.xwd-Qlzz

Probieren Sie es hier aus .

Übernimmt die Eingabe von STDIN als Zeichenfolge in der ersten Zeile, die Länge in der zweiten Zeile und optional das Füllzeichen in einer dritten Zeile.

Türknauf
quelle
4
Dies soll nur Javascript sein
MMM
22
@MMM Spracheinschränkungen bei Herausforderungen sind so allgemein unerwünscht, dass ich davon ausgehe, dass sie in Kürze ignoriert werden. Niemandem wird gerne gesagt, dass man nicht teilnehmen kann.
Xnor
2
Bleib beim Mann! Du gehst Türklinke! Lass deine Träume keine Träume sein! MACH ES EINFACH!
Mave
4
Es ist eine böse Gesellschaft, in der die Moderatoren den zivilen Ungehorsam tun!
Ven
13

JavaScript (ES6), 43 Byte

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)
Neil
quelle
1
Sie vermissen den 3. Parameter
m0sa
@ m0sa Danke, behoben.
Neil
Jetzt besteht der dritte Test nicht
;-)
1
@Sklivvz Ugh, das bekomme ich, weil ich die Anforderungen nicht richtig gelesen habe.
Neil
Stattdessen p+=skönnen Sie 2 Bytes hinzufügen, damit es p+=[s]funktioniert.
Aplet123
7

JavaScript (ES6), 37 43 44 Bytes

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

Prüfung:

> 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

Ich bin mir nicht sicher, ob Sie die Funktionsdeklaration zählen möchten.

Sklivvz
quelle
Ich denke, dass wir die Funktionsdeklaration im Allgemeinen nicht zählen, es sei denn, die Frage verlangt ausdrücklich ein vollständiges Programm und keine Funktion.
Deusovi
sliceist kürzer als substr.
Mama Fun Roll
@ Deusovi richtig. was ich meine ist, dass ich nicht tun würde console.log(f("whatever",10, "*")), aberconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz
7

Javascript ES6, 35 Bytes

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

Versuch es. Ich glaube, dies ist die kürzestmögliche Implementierung, die derzeit in Javascript möglich ist.

David
quelle
Dies ist, was ich tun wollte, außer es war keine anonyme Funktion.
Aplet123
@ Aplet123 Ich denke nach der Definition des Wettbewerbs, was erwartet wird, ist das in Ordnung. Es wurde nur nach der Funktion gefragt; es zu benennen ist in diesem Zusammenhang irrelevant, oder zumindest würde ich das basierend auf anderen Antworten denken.
David
5

Python 3, 33 31 29 Bytes

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

Ziemliech direkt. Danke an @xnor , dass du mich str.rjustdaran erinnert hast . : P

Bei gleicher Länge (auch dank xnor):

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

Vorherige Lösung:

lambda a,b,x=" ":x*(b-len(a))+a
Katze
quelle
Es ist etwas kürzer zu machen (x*b+a)[-b:]oder a.rjust(b,x). Eigentlich str.rjustfunktioniert es wohl für die ganze Sache.
Xnor
@xnor Ich habe vergessen, rjustwar ein eingebautes, danke!
Katze
Keine davon folgt der Spezifikation:f(1, 2, 0) === '01';
Valentin Lorentz
@ValentinLorentz Ich habe das OP um Klärung über Sprachen gebeten, die standardmäßig keine Zahlen in Zeichenfolgen umwandeln und keine Antwort erhalten. Da diese Frage keine formale Spezifikation hat, gehe ich davon aus, dass die Argumente allesamt Zeichenfolgen sind.
Katze
Jetzt gibt es eine Spezifikation und Lösung 1 ist ungültig (getestet auf Python 2.7.10)
CalculatorFeline
5

05AB1E , 11 9 Bytes

Code:

g-ð³0@×¹«

Erläuterung:

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.

Verwendet die CP-1252- Codierung. Probieren Sie es online aus .

Adnan
quelle
1
Alle diese Zeichen passen in die Jelly-Codepage (0x672D188330401181FA)
CalculatorFeline
5

JavaScript (ES5), 70 Byte

Rekursion verwenden ...

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

Mein erster Versuch war nur 57 Bytes:

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

Hat aber erst die ersten 2 Tests bestanden:

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

Ich mag immer noch die kürzere, weil ich in der Praxis keine Funktion benötige, um Zahlen an eine Zeichenfolgenmanipulationsfunktion zu übergeben.

rjmunro
quelle
4

Mathematica, 13 Bytes

StringPadLeft

Eingebaute Antwort # 3 (erste war Range, zweite war Surd) oder weniger eingebaut: (35 Bytes)

##2~StringRepeat~(#3-Length@#2)<>#&
CalculatorFeline
quelle
Darf ich leise abstimmen?
Edc65
2
...Warum? Liegt es daran, dass dies nur ein eingebautes ist? Die 41-Byte-Python-Antwort # 1 (die nicht mehr gültig ist) war nur ein Wrapper für ein eingebautes.
CalculatorFeline
It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern.(Appell an die Behörde: Martin) (aber auch gesunden Menschenverstand)
edc65
@ edc65 Zugehöriger Metapost . Ich bin mir ziemlich sicher, dass dies zulässig ist, da integrierte Funktionen in der Regel standardmäßig zulässig sind. Es erfordert Kreativität und Wissen des Benutzers, um die relevante eingebaute Funktion zu kennen.
mbomb007
1
@ mbomb007 vielleicht erlaubt - Creative-Nr. Ich habe diese Antwort nicht als ungültig markiert, aber meine Gegenstimme
edc65
3

Julia, 4 Bytes

lpad

Besteht alle Testfälle:

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

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

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

julia> lpad(1, 2, '-')
"-1"
Fengyang Wang
quelle
Funktioniert es für rect 7 cor?
CalculatorFeline
Ja. 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)

Erstellen Sie ein leeres Array von Werten und verbinden Sie die Version.

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

Ist besser lesbar, returnfügt aber noch ein paar Zeichen hinzu.

Bitte
quelle
Da die Frage in der Warteschleife liegt, werde ich meine Antwort unter die Antwort von JS stellen, die meiner am ähnlichsten ist. 43 Bytes (s, n, c = '') => (Array (n). Join (c) + s). Slice (-n)
Charlie Wynn
Tipp: `für inline code blocks..
CalculatorFeline
+=Gibt den Wert des linken Operanden zurück, sodass die zweite Version kürzer (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)wird. Sie wird jedoch länger, wenn Sie Zeichenfolgen mit mehreren Zeichen zum Auffüllen hinzufügen.
CalculatorFeline
3

Bash, 57 Bytes

Parameter: Stringbreite padchar

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

Bilden Sie eine Schnur der Breite .

Wandle jedes Leerzeichen in padchar um .

Schreibe padding und dann string .

Philcolbourn
quelle
2

Python, 41 Bytes

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

Ohne das eingebaute Recht, 43 Bytes:

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

(nicht das, was man erwartet, aber es besteht die Testsuite)

Valentin Lorentz
quelle
Sie können entfernen s=strund ersetzen smit strfür gleiche Byte - Zählung.
CalculatorFeline
2

Gelee , 12 Bytes

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

So viele variable Referenzen. Sollte Jelly nicht eine stillschweigende Sprache sein?

Probieren Sie es online!

Wie es funktioniert

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
quelle
padchar (⁵, defaults to 10)sollte es nicht standardmäßig 20oder 32?
Katze
1
Hochgestellte 3 bis 9 sind Konstanten, die mit Argumenten (falls vorhanden) oder einigen nützlichen Standardwerten initialisiert werden. Die Bedingung ?prüft, ob sie den Standardwert 10 hat, und gibt in diesem Fall ein Leerzeichen zurück.
Dennis
2

JavaScript ES7, 16 Byte

''.padStart.bind

eingebaute ftw! Funktioniert nur mit Firefox 48 und höher. Gültig, da diese Funktion am 12. März hinzugefügt wurde.

Dies erfordert Eingaben wie:

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

Hecht , 67 Bytes

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

Seufzer . Die leere Zeichenfolge ""ergibt true. Warum!?

gemischt gemischt gemischt gemischt gemischt Hechtsuppe ...

Katze
quelle
Eine andere Sprache mit dummen Wahrheiten.
CalculatorFeline
@CatsAreFluffy Ja, Pike ist ein bisschen seltsam, aber es hat nette Dienstprogramme zur Verarbeitung von Strings.
Katze
1

Pyke , 12 Bytes (nicht konkurrierend)

Input Node hinzugefügt, Bugfix auf Len Node, Standardergebnisse auf Assign Node ändern nachdem die Challenge gepostet wurde.

\ =zzjl-z*j+

Erläuterung:

\ =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
Blau
quelle
+1, weil das Beantworten in der Sprache Ihnen hilft, es zu verfeinern :)
Katze
Ich habe das Format Ihres Headers bearbeitet, um das Lesen zu vereinfachen und das Parsen von User-Skripten usw. zu vereinfachen. Wenn Sie nicht damit einverstanden sind, setzen Sie es zurück.
Katze
Warum die Gegenstimme?
Blue
1
@muddyfish Es scheint, dass jede Antwort, die kein Javascript ist, herabgestuft wird.
Adnan
@ UndN das ist einfach nicht schön ... Auch, warum ich kein Muster aus den Top 6 Antworten sehen konnte
Blue
1

JavaScript ES6, 38 Byte

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

Eine alternative Lösung.

Conor O'Brien
quelle
1

JavaScript (ES6), 34 Byte

Ich habe eine rekursive Lösung verwendet.

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

Ruby, 42 Bytes

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

Parameter: string, size, padchar.

Testsuite unten; sollten alle "true" s drucken, stecke einfach alles in die selbe datei.

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
quelle
Sie müssen diesen Methodennamen nicht verwenden ... und Sie können ihn wahrscheinlich auch zu einem Lambda machen. (Alle anderen Beispiele machen es ähnlich.)
Nicht dass Charles am
0

Java 8, 86 88 Bytes

Dies ist eine Funktion. Das dritte Argument ist a varargs, um das optionale Pad-Zeichen zuzulassen (Standardeinstellung ist ' ').

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

Rekursion! +2 Bytes (Klammern wegen inkompatiblem Typfehler hinzugefügt)

HyperNeutrino
quelle
Dieser TypeErrors. Kann Ideone immer testen (Java 7, aber ich bekomme den gleichen genauen Fehler in Java 8 auf meiner Box) ideone.com/B7gTA5
cat
0

PHP, 54 48 Bytes

Verwendet die Windows-1252-Codierung.

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

Laufen Sie wie folgt (-d folgt (nur für Easthetics hinzugefügt):

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

Alte Version (ohne das eingebaute):

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

Optimierungen

  • 6 Bytes mit str_padanstelle einer Schleife gespeichert . Lassen Sie die alte als Referenz, da Builtins verpönt sind
aross
quelle
0

R, 50 Bytes

Wieder zu spät zur Party, aber hier ist es:

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

Dies druckt einfach die Ausgabe auf stdout, gibt aber nicht die aufgefüllte Zeichenfolge zurück (war nicht sicher, ob dies eine Anforderung für die Herausforderung ist). In diesem Fall ist die Lösung mit 61 Byte etwas länger:

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

C 64 Bytes

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

Probieren Sie es hier aus .

Cole Cameron
quelle
2
Dies entspricht nicht der Spezifikation, da standardmäßig kein Leerzeichen verwendet wird, wenn kein Zeichen angegeben wird.
Türklinke
Dieser Code läuft nicht wie angegeben. gcclassen undefined reference to function printfPass und schließen printfsich, aber kein solches Glück für memset, asprintf, und strlen. Sie müssen die #include<string.h>... etc-Definitionen hinzufügen , um dies gültig zu machen.
Katze
@tac Hmmm ... Ich habe meine Antwort komplett innerhalb von ideone geschrieben und getestet. Es wird auf dieser Plattform kompiliert und erfolgreich ausgeführt, obwohl es angibt, dass es verwendet gcc-5.1. Ich bin nicht sicher, ob sie Compiler-Flags oder What-Have-You hinter den Kulissen verwenden, die mir nicht bekannt sind. Ich war mit anfangs dies als meine Rechtfertigung für sie nicht in Ihrer Umgebung ausgeführt wird , aber jetzt bin ich nicht sicher ...
Cole Cameron
Nun, das ist gcc 5.2.1unter Linux, also können Sie vielleicht mit dem Sprichwort davonkommen, Ideone C, 64 bytesaber wenn Sie behaupten, dass es C ist, lassen Sie es kompilieren. : p
cat
Ich bin nur ein Anfänger bei C: Warum f man vier Parameter, nicht 3? Benötigen Sie die Adresse des Strings oder ...? In beiden Fällen fsollten höchstens 3 Argumente verwendet werden.
Katze