Wir definieren Whitespace als eines der drei Zeichen, Tabulator (0x09), Zeilenvorschub (0x0A) oder Leerzeichen (0x20).
Für diese Herausforderung müssen Sie zwei Programme oder Funktionen in derselben Programmiersprache schreiben, die die folgenden Aufgaben ausführen:
Zählen Sie die Leerzeichen in einer bestimmten Zeichenfolge. Zum Beispiel die Eingabe
123 -_- abc def
würde 7 zurückgeben (vorausgesetzt, es gibt keinen nachgestellten Zeilenumbruch).
Teilen Sie eine bestimmte Zeichenfolge bei aufeinanderfolgenden Leerzeichenfolgen. Wenn die Zeichenfolge mit Leerzeichen beginnt oder endet, sollten an den Enden keine leeren Zeichenfolgen zurückgegeben werden. Zum Beispiel die gleiche Eingabe
123 -_- abc def
würde zurückkehren
["123", "-_-", "abc", "def"]
.
In beiden Fällen können Sie eine Eingabe über STDIN, ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis zurückgeben oder es STDOUT ausgeben. Wenn Sie für das zweite Programm auf STDOUT drucken möchten, drucken Sie bitte jede Zeichenfolge in einer eigenen Zeile ohne umgebende Anführungszeichen.
Bei beiden Programmen können Sie davon ausgehen, dass die Eingabe nur druckbares ASCII (0x20 bis 0x7E) und Leerzeichen enthält.
Hier ist der Haken:
- Wenn alle Leerzeichen aus beiden Programmen / Funktionen entfernt werden, müssen die resultierenden Zeichenfolgen identisch sein. Das heißt, Ihre beiden Einreichungen unterscheiden sich möglicherweise nur in der Anzahl und der Platzierung von Leerzeichen.
- Weder Programm noch Funktion dürfen Zeichenfolgen- oder Regex-Literale enthalten (Zeichenliterale sind in Ordnung, vorausgesetzt, Ihre Sprache verfügt über einen bestimmten Zeichentyp).
- Weder Programm noch Funktion dürfen Kommentare enthalten.
- Sie dürfen den Quellcode des Programms weder direkt noch indirekt lesen.
Das ist Code Golf. Ihre Punktzahl ist die Summe der Größen beider Lösungen (in Bytes). Die niedrigste Punktzahl gewinnt.
Bestenlisten
Das folgende Stack-Snippet generiert sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache. Also, auch wenn Sie mit der Sprache Ihrer Wahl nicht die gesamte Herausforderung gewinnen können, warum nicht versuchen, einen Platz auf der zweiten Liste zu ergattern? Es würde mich sehr interessieren, wie die Leute diese Herausforderung in einer Vielzahl von Sprachen angehen!
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
wo N
ist die Gesamtgröße Ihrer Vorlage. Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Sie können auch die einzelnen Zählungen vor der Gesamtzählung angeben, z
# Python 2, 35 + 41 = 76 bytes
Die letzte Nummer, die nicht durchgestrichen ist, wird vom Snippet verwendet.
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 42253;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
quelle
Antworten:
Pyth, 16 + 15 = 31 Bytes
Probieren Sie es hier aus .
Zähler:
Splitter:
Diese definieren jeweils eine Funktion,
y
die eine Zeichenketteneingabe zur Lösung der gewünschten Aufgabe benötigt.Vielen Dank an @FryAmTheEggman für die Idee, Pyths Funktion der modularen Indizierung in Listen zu nutzen, um einen Charakter zu rasieren.
Testfälle:
Erläuterung:
quelle
Python, 54 + 56 = 110 Bytes
Zähler:
Splitter:
Für den Zähler verwenden wir die Tatsache, dass es in Python in Ordnung ist, nur einen Ausdruck in einer Zeile zu haben. Es ist notwendig, eine zu trennen
+1
und0<9or x.split()
zu verhindern , dassNameError
sie geworfen wird, da0<9
diesTrue
diex.split()
Auswertung aufgrund eines Kurzschlusses verhindert.Für den Splitter ist, da die Anzahl der Whitespaces immer nicht negativ
sum(y.isspace()for y in x)+10<9
ist, immerFalse
und die Splitting-Funktion kommt ins Spiel.Alternative 1, 59 + 60 = 119 Bytes
Zähler:
Splitter:
Die Ergebnisse der Zählung und Aufteilung werden in einer Liste mit zwei Elementen gespeichert. Die Liste wird indiziert, indem entweder
min([1])
das Minimum der Liste mit einem Element zurückgegeben wird1
, oderm in([1])
dasFalse
(äquivalent zu0
) zurückgegeben wird, wiem
es nicht in enthalten ist[1]
.Alternative 2, 67 + 69 = 136 Bytes
Zähler:
Splitter:
Wie oben werden die Ergebnisse der Zählung und Aufteilung in einer Liste mit zwei Elementen gespeichert.
sorted
ist eine eingebaute Funktion, die ein wahrer Wert ist, also gibt sienot sorted
zurückFalse
(äquivalent zu0
). Dennnot s or ted
das
eine Funktion und auch Wahrheit ist,not s
istFalse
undted = 1
wird zurückgegeben.Alternative 3, 59 + 60 = 119 Bytes
Zähler:
Splitter:
Dies ist eine Funktion, bei der das Ergebnis des Splitters in der Variablen
a
und das Ergebnis des Zählers in der Variablen gespeichert werdena1
. In diesem Fall kann Python nach wie vor nur einen Ausdruck in einer Zeile verwenden1
. Durch Aufteilen wirda1
festgelegt, was von der Funktion zurückgegeben werden soll.quelle
not sorted
.+1
und0<9or x.split()
erforderlich?m=lambda x:sum(y.isspace()for y in x)+00and x.split()
undm=lambda x:sum(y.isspace()for y in x)+0;0and x.split()
abschneiden (wobei das Semikolon natürlich eine neue Zeile ist)Java 8, 239 + 240 = 479
Zähle das Leerzeichen (gibt Integer zurück)
Auf das Leerzeichen aufteilen (gibt Stream <String> zurück)
Erläuterung:
quelle
Leerzeichen, 75 + 153 = 228
Leerzeichen, Tabulatoren und Zeilenumbrüche werden durch STL ersetzt und der Lesbarkeit halber gefaltet. Konvertieren Sie in eine richtige Whitespace-Datei mit
tr -d \\n | sed 'y/STL/ \t\n/'
.Zähler
Splitter
quelle
Marbelous, 103 + 92 = 195
Zähler:
Splitter:
Testen Sie diese Programme hier. Zylindrische Karten, Include-Bibliotheken und Leerzeichen für leere Zellen müssen alle überprüft werden.
Eingabe und Ausgabe erfolgen über STDIN / STDOUT.
Erläuterung
Zähler:
Der blaue Pfad empfängt Eingaben. Wenn das Zeichen ein Leerzeichen ist (ASCII-Wert kleiner als 0x21), wird der schwarze Pfad verwendet, der mit dem violetten Pfad synchronisiert wird.
Der violette Pfad erhöht einfach
&1
jedes Mal, wenn der schwarze Pfad genommen wird, einen im Synchronizer gespeicherten Marmor .Sobald keine Eingabe mehr erfolgt, wird der rote Pfad genommen, die Anzahl der Whitespace-Zeichen gedruckt und beendet.
Splitter:
Das Programm beginnt mit dem blauen Pfad, der so lange wiederholt wird, bis ein Nicht-Leerzeichen gefunden wurde.
Sobald ein Nicht-Whitespace-Zeichen abgerufen wurde, wird der schwarze Pfad verwendet, der dieses Zeichen druckt und die Ausführung auf den grünen Pfad verschiebt, der wiederholt und gedruckt wird, bis ein Whitespace-Zeichen empfangen wird. Die Ausführung fährt dann mit dem violetten Pfad fort, der
3W
einen Drei-Wege-Splitter enthält.Der linke Zweig verschiebt die Ausführung in den blauen Pfad (und Leerzeichen werden verworfen, bis ein Nicht-Leerzeichen-Zeichen gefunden wird).
Der mittlere Zweig setzt die Kopie der Eingabe auf 0 mit
?0
(generiere eine Zufallszahl zwischen0
und0
) und addiert 10 (0x0A
= Newline), die dann ausgegeben wird.Der richtige Weg wird verworfen.
quelle
CJam, 26 + 27 = 53
59 61 73 77BytesZähler
Splitter
Wie es funktioniert
Die Idee ist einfach: Berechnen Sie beide Leerzeichen und teilen Sie die Zeichenfolge bei aufeinanderfolgenden Leerzeichenfolgen auf. Dann wählen Sie eine von ihnen auf der Grundlage der folgenden Tatsache, die
' !
bedeutet,not of space character
was falsch ist, während'!
der!
Charakter, der wahr ist.Erweiterter Code:
Die Eingabe erfolgt über STDIN und die Ausgabe über STDOUT
Probieren Sie es hier online aus
quelle
Mathematica, 44 + 43 = 87 -
97BytesIch dachte, ich würde der Mischung eine weitere Sprache hinzufügen.
Zähler:
Splitter:
Dies nutzt die Eigenschaft von Mathematica, dass Raumtrennung die gleiche ist wie Multiplikation. Und das Multiplizieren von etwas mit 0 ist immer 0, und das Hinzufügen von 0 zu etwas ist immer idempotent.
Für den Zähler zählen wir zuerst das Leerzeichen und addieren es
0*1*StringSpli*t@#
.StringSpli
undt
sind nicht definiert, aber Mathematica verwendet symbolische Berechnungen, so dass diese nur als unbekannte Variable und Funktion behandelt werden. Das1*
ist (genauso wie0+
) idempotent , das0*
macht es zu einer Null. Es ist notwendig, dieStringSplit
Variablen in zwei Variablen zu trennen , da0
eine Liste manchmal als Skalar-Vektor-Multiplikation behandelt wird, die einen Vektor (Liste) von Nullen ergibt.Für den Splitter verwende ich die Tatsache, dass es
Count
auch gibt, aber ich sehe nicht in Strings. Es wird versucht, alle Unterausdrücke zu zählen , die mit dem Muster übereinstimmen, es handelt sich jedochWhitespace
um ein Muster, das nur für den Inhalt von Zeichenfolgen gilt. AlsoCount
werde immer wiederkommen0
, was dasString
verschwinden lässt. Die Multiplikation des geteilten Arrays mit01 = 1
ist wiederum idempotent.quelle
Ruby,
10791 BytesSplitter (46 Bytes)
Zähler (45 Bytes)
p
ist eine vordefinierte Methode, die ohne Argumente nur zurückgibtnil
. Wir verwenden dies auf verschiedene Arten. Im Splitterp
tut die Initiale nichts.gets(p)
Liest alles von der Standardeingabe ein, da der Begrenzer null ist. Wir bezeichnen dies als integrierte Split-Methode und weisen das Ergebnis zup
. Wenn also keine Argumente angegeben werden, wird es als Variable analysiert.puts p||...
schließt jedes Element derp
Variablen kurz und druckt es in eine eigene Zeile.Im Zähler löschen wir die erste neue Zeile, damit
pp
stattdessen das geteilte Array zugewiesen wird. Da wir es nicht zugewiesen haben,p
ist es immer noch die Methode ohne Rückgabe, sodass der zweite Teil von||
ausgewertet und an übergeben wirdputs
.$_
ist eine magische Variable, die das Ergebnis von enthält. Diegets
Gesamtmenge an Leerzeichen entspricht also der Größe abzüglich der Nicht-Leerzeichen-Zeichen, die enthalten sindpp
. Ich habe das Gefühl, dass es eine kürzere Art des Zählens geben sollte, aber ich kann keine finden, und auf jeden Fall macht es Spaß, das geteilte Array im Zähler zu verwenden.quelle
Python, 169
In Python ist das fast zu einfach!
Zähler:
Splitter:
Sie unterscheiden sich in nur einem Leerzeichen und ich mache keine Tricks wie das Teilen einer Zahl oder eines Variablennamens in zwei Hälften :)
quelle
C 138 + 136 = 274
In jedem Fall ist der Code ein Programm, das genau ein Befehlszeilenargument akzeptiert und das Ergebnis an stdout ausgibt.
\t
sollte durch ein Tabulatorzeichen ersetzt werden. Wenn Sie ein Argument mit Tabulatoren und Zeilenumbrüchen übergeben möchten, müssen Sie herausfinden, wie;).Zählen
Aufteilen
quelle
JavaScript, 95 + 96 = 191 Bytes
Zähler:
Splitter:
Ungolfed:
Die
RegExp(String.fromCharCode(92,115)
Zeile erstellt den mit Leerzeichen übereinstimmenden regulären Ausdruck/\s/
ohne reguläre Ausdrücke oder Zeichenfolgenliterale.In jedem Programm verwenden wir die Variable
v
odervv
. Wir speichern das aufgeteilte Array in dieser Variablen (v
odervv
) und verzweigen dann unser Verhalten auf den Wert vonv
(wird in der Zwischenzeitvv
ignoriert). In der Thekev
hat ein wahrer Wert; Im Splitter hat es einen falschen Wert (weil ervv
stattdessen den Wert hat).Alternative: JavaScript, 250 Byte
Ich habe eine andere Lösung, die aus Gründen der Kürze keine Preise gewinnt, aber ich fand es eine interessante Herausforderung, das automatische Semikolon-Einfügeverhalten von JavaScript zu missbrauchen.
Zähler:
Splitter:
Ungolfed Zähler:
Der Splitter ist bis auf die Leitung genau derselbe:
ist jetzt
JavaScript automatische Semikolon Einfügung normalerweise nicht beendet mehrzeiligen Aussagen früh , wenn sie ohne Zeilenumbruch verstanden werden kann, aber es duldet keine Linie nach bricht
return
,continue
oderbreak
. Daher wird die Zeile einfach als gelesenbreak
, was nur aus der inneren Schleife herausbricht, anstatt aus der äußeren Schleife herauszubrechen. Das "Second-Pass" -Verhalteno = a.filter(j=>j)
wird dann ausgeführt (anstatt im Zähler übersprungen zu werden), da der äußeren Schleife ein zweiter Durchgang gegeben wird.quelle
!!x
anders als beim AutokonvertierenBool
?filter
auto-bools seinen Rückruf nach den gleichen Regeln wie zurückgibt!!
. Vielen Dank!Python,
228198182166146145 BytesZähler ( 72 Bytes ):
Splitter ( 73 Bytes ):
ior1
ist eine Falsey-Variable, aberi or 1
wahr. Das ist der Haupttrick.quelle
i
die leere Zeichenfolge für den Splitter ist? Könnte durch Ändern voniorb
in behoben werdenior1
, wodurch Sie auch das Zeichen zwischen1
und speichern könnenelse
.Befunge 98, 61 + 59 = 120
Zähler:
Splitter:
quelle
Bash, 75 + 79 = 154 Bytes
Dies setzt voraus, dass bash die Ausführung fortsetzen kann, auch wenn einige Zeilen oder Teile einer Skriptzeile (unter bestimmten Umständen) fehlerhaft sind. Whitespace wird verwendet, um die Escape-Zeichen für einige enge Klammern zu deaktivieren und eine Pipe zu brechen, indem sie in eine neue Zeile eingefügt wird.
Splitter:
Zähler:
Die Eingabe erfolgt über ein Kommandozeilenargument, die Ausgabe erfolgt über stdout.
Da dies vom Bash-Fehlerverhalten abhängt, wird vom Benutzer erwartet, dass er stderr ignoriert.
Beispiellauf (Eingabe mit einer neuen Zeile und mehreren zusammenhängenden Leerzeichen):
quelle
Ruby,
114 + 116107 + 109 = 216 BytesDies kann nicht mit der Rubinlösung von Histokraten mithalten, aber ich dachte, es wäre es wert, es trotzdem zu ertragen.
Ich habe
$z
fürnil
undnil.to_s
fürString.new
Das zusätzliche Leerzeichen, das ich am Ende der Eingabe hinzufüge, erzwingt das Hinzufügen des letzten Wortes zum Array (
r
) - ein Wort wird nur am Ende des Arrays hinzugefügt, wenn ein Leerzeichen auf ein Nicht-Leerzeichen folgt. Die Alternative war das Hinzufügen eines weiterenr<<w if w
nach demeach_byte
Block.Zählen
Aufteilen
quelle
Haskell ,
53 + 55 = 108,36 + 38 = 74 BytesZähler
Splitter
Diese Lösung nutzt die Tatsache, dass in Haskell Funktionen eine Instanz der Monad-Typklasse sind und somit als monadische Aktionen in Do-Notation verwendet werden können.
Im ersten Fall ist die resultierende Funktion des do-Blocks das erste Argument von
pure
(was im Wesentlichenconst
für den Funktionstyp gilt), wodurch der Zähler zum Endergebnis wird und der Splitter verworfen wird.Im zweiten Fall
pure
wird nur auf ein einzelnes Argument angewendet, wodurch es zu einer Funktion wird, die eine andere Funktion (den Zähler) zurückgibt. Das Ergebnis wird jedoch niemals verwendet und somit verworfen. Das Endergebnis ist die zweite Zeile des do-Blocks, der Splitter.quelle
[' ','\t','\n']
kann auf gekürzt werden" \t\n"
.(<'!')
zum Testen auf Leerzeichen verwenden.Java 8, 187 + 188 = 375
Zunächst möchte ich sagen, dass diese Antwort stark auf @ Ypnypn basiert. Grundsätzlich habe ich einige Teile durch kürzere ersetzt (einschließlich des Whitespace-abhängigen Teils, den IMO bei dieser Herausforderung am wichtigsten macht), aber der Funktionscode ist größtenteils derselbe.
Zähle das Leerzeichen , 187 (kehrt zurück
int
):Auf den Whitespace aufteilen , 188 (Rückgabe
Stream<String>
):quelle
J, 48 + 49 = 97 Zeichen
Zwei Funktionen, die ein einziges Argument annehmen und zurückgeben. Verwendete die schlechteste Methode, die ich mir vorstellen konnte, um die Regel für das gleiche Leerzeichen zu übertreffen. Es gibt also wahrscheinlich Zeichen, die man retten kann, wenn man eine cleverere Route findet.
Wir definieren das Verb so
a
, dass es zwei verschiedene Aktionen hat, abhängig davon, ob es mit einem Argument oder mit zwei verwendet wird. Mit einem Argument wird(e.u:)&9 10 32
geprüft, ob jedes Zeichen ein Leerzeichen ist oder nicht. Mit zwei Argumenten ist esa:-.~(<;._1~1,}.)
, das einen booleschen Vektor rechts nimmt und das linke Argument an diesen Positionen abschneidet, wobei alle leeren Schnitte mit weggeworfen werdena:-.~
.Dann definieren wir
aa
als Anzahl der wahren Werte im Ergebnis vona
, was nur mit einem Argument Sinn macht. Schließlich verwenden wiraa
odera a
abhängig davon, ob wir das Leerzeichen der Zeichenfolge zählen oder teilen möchten.aa
funktioniert wie erwartet.Der Grund dafür
a a
ist, dass wenn J sieht(f g)y
, es(f g)
einen Haken betrachtet und ihn wie auswertety f (g y)
. In diesem Fallf
ist die dyadischea
oberhalb der das Schneid der Fall ist, undg
ista[aa
, der die Summe aus berechnetaa
, führt es aus und berechnet (monadischen)a
wieder.Auf der REPL:
quelle
Bash, 54 + 50 = 104 Bytes
Zähler
Splitter
quelle
Perl, 37 + 38 = 75
Zähler :
Splitter :
quelle
Perl 6, 31 + 32 = 63 Bytes
Zähler
Probieren Sie es online!
?^1
wird so analysiert,?^ 1
dass der Boolesche Negationsoperator auf 1 angewendet wird , was zu führtFalse
.Splitter
Probieren Sie es online!
? ^1
konvertiert den Bereich 0..0 in Bool, was zur Folge hatTrue
.quelle
Python 2, 98
Teilen (49)
Gibt die Token in einer Liste zurück.
Zählen (49)
Gibt eine Liste mit der Länge eins zurück, die die Anzahl der Leerzeichen enthält. Es wird höchstwahrscheinlich einen Laufzeitfehler verursachen, aber die Funktion
f
kann nach dem Ausführen des Codes verwendet werden.quelle
C (gcc) , 88 + 89 = 177 Bytes
Splitter
Splitter
Zähler
Zähler
Heruntergewirtschaftet
Nimmt Eingaben als Funktionsargument. Die Zählfunktion gibt die Anzahl der Leerzeichen zurück. Die Aufteilungsfunktion verwendet STDOUT für ihre Ausgabe (gibt jedoch im Übrigen auch die Anzahl der Leerzeichen minus eins zurück).
quelle
Zsh , 35 + 35 = 70 Bytes
Ich bin mir nicht sicher, ob ich qualifiziert bin
[^$IFS]
, da es beim Pattern Matching verwendet wird. Hier ist eine 45 + 45-Lösung für den Fall, dass es verboten ist.Teilt:
Anzahl:
Der
:
eingebaute ist gleichwertig zutrue
, wir verwenden es als etwas zwischen einem Kommentar und / dev / null (da Kommentare nicht wir die unerwünschte Erweiterung .Zsh hat eine eingebaute Funktion zum Teilen von Whitespace
${=var}
. Dies macht es schwierig, eine andere logische Kombination zu erstellen, als nur beide auszuführen und die nicht gewünschte zu verwerfen.Probieren Sie es online!
quelle