BEARBEITEN: Wenn Sie Lisp verwenden, habe ich unten einige Richtlinien zum Zählen von Bytes angegeben.
Ziel: Erstellen Sie die kürzeste Funktion, die eine Zeichenfolge in nicht-Ziffern aufteilt und ein Array zurückgibt, das nur aus Ziffern in jeder Zeichenfolge besteht, ohne reguläre Ausdrücke zu verwenden. Führende Nullen sind in jede Zeichenfolge aufzunehmen.
Aktueller Stand (unterteilt in Kategorien):
- C / C ++ / C # / Java: 68 (C) ....
- GolfScript / APL / J: 13 (APL)
- Alle anderen: 17 (Bash, benutzt
tr
), 24 (Ruby)
Regeln:
(Ich entschuldige mich für die Langeweile)
- Das Format muss eine Funktion mit einem einzelnen Zeichenfolgenargument sein. Bei Bedarf können bis zu zwei zusätzliche Argumente für die ordnungsgemäße Rückgabe des Arrays hinzugefügt werden (z. B. benötigt sh / csh / DOS Batch eine zusätzliche Variablenreferenz für die Rückgabe usw.).
- Die Deklaration der primären Funktion zählt nicht und andere Standardbibliotheken werden auch nicht importiert. `# include`s,` import`s und `using`s zählen nicht. Alles andere macht. Dies beinhaltet `# define`s und Hilfsfunktionen. Entschuldigung für die Verwirrung. Hier finden Sie eine hilfreiche Anleitung, was zählt / nicht zählt (in C-Syntax geschrieben).
// zählt nicht zur Gesamtsumme, kann weggelassen werden, es sei denn // nicht offensichtlich, wie die Hälfte von Javas Standardbibliothek. #include <stdio.h> import some.builtin.Class // zählt nicht, siehe oben #define printf p // zählt zur Gesamtsumme / * Alle anderen Präprozessoranweisungen usw. zählen. * / int i = 0; // zählt someFunction (); // zählt char [] [] myMainSplitFunction (char [] [] Array) {// zählt nicht // Hier zählt alles return returnArray; // Auch das zählt. } // zählt nicht / * Alles hier zählt, einschließlich der Erklärung * / char [] [] someHelperFunction (char [] string) { // Zeug } // auch das zählt
- Die Ausgabe muss ein String-Array oder ähnliches sein (Array-Listen in Java und ähnlich sind akzeptabel). Beispiele für akzeptierten Ausgang:
String[]
,char[][]
,Array
,List
, undArray
(Objekt). - Das Array darf nur String-Primitive oder String-Objekte variabler Länge enthalten. In der Rückgabe sollten keine leeren Zeichenfolgen vorhanden sein, mit Ausnahme der folgenden. Hinweis: Die Zeichenfolgen müssen eine Folge aufeinanderfolgender Übereinstimmungen enthalten, z. B. die folgende Beispieleingabe und -ausgabe.
- Wenn es keine Übereinstimmungen gibt, sollte der Funktionskörper
null
ein leeres Array / eine leere Liste oder ein Array / eine Liste mit einer leeren Zeichenfolge zurückgeben. - Keine externen Bibliotheken erlaubt.
- DOS-Zeilenenden zählen als ein Byte, nicht als zwei (bereits in Meta behandelt, muss aber hervorgehoben werden)
- Und die größte Regel hier: keine regulären Ausdrücke erlaubt.
Dies ist eine Code-Golf- Frage, also gewinnt die kleinste Größe. Viel Glück!
Und hier sind einige Beispiele für Ein- und Ausgänge (mit C-Stil-Escapezeichen):
Eingabe: "abc123def456" Ausgabe: ["123", "456"] Eingabe: "aitew034snk582: 3c" Ausgabe: [034, 582, 3] Eingabe: "as5493tax54 \\ [email protected]" Ausgabe: [5493, 54, 430, 52, 9] Eingabe: "sasprs] riss \" re \\ forz " Ausgabe: null, [], [""] oder ähnlich
Bitte geben Sie an, wie viele Bytes Ihre Antworten benötigen und wie immer viel Spaß beim Golfen!
Richtlinien für Lisp
In Lisp-Dialekten zählt Folgendes:
;;; Option 1 (defun extract-strings (ab); Zählt nicht (Zeug) ;;; Hier zählt alles ); Zählt nicht ;;; Option 2 (defun extract-strings (string & aux (start 0) (end 0)); Zählt nicht (Zeug) ;;; Hier zählt alles ); Zählt nicht.Alle anderen Lambdas zählen vollständig zur Byteanzahl.
Antworten:
APL, 13 Zeichen
(oder 28/30 Bytes, lesen Sie unten)
Ich sehe, Sie haben GolfScript von Ihrer Frage ausgeschlossen. Ich verstehe Ihr Gefühl, aber ich hoffe, dass diese Community APL nicht verbannen wird, denn es ist eine wirklich bemerkenswerte Programmiersprache mit einer langen Geschichte, ganz zu schweigen von viel Spaß beim Programmieren. Vielleicht könnte es einfach anders bewertet werden, wenn die Leute fühle es ist unfair im Wettbewerb. Ich werde meine Gedanken zu diesem Thema in dem von Ihnen verlinkten Thread veröffentlichen.
Aus dem gleichen Grund habe ich meinen APL-Posts immer eine Fußnote hinzugefügt, in der behauptet wird, dass APL mit 1 Zeichen = 1 Byte bewertet werden könnte. Meine Behauptung beruht auf der Tatsache, dass einige (meist kommerzielle) APL-Implementierungen immer noch ihre eigene ältere Einzelbyte-Codierung unterstützen, wobei die APL-Symbole den oberen 128-Byte-Werten zugeordnet sind. Aber vielleicht ist das zu viel. In diesem Fall möchten Sie diesen Eintrag mit 28 Bytes in UTF-16 oder 30 Bytes in UTF-8 bewerten.
Erläuterung
Beispiele
Das Standardausgabeformat für ein Array von Zeichenfolgen macht weder deutlich, wie viele Zeichenfolgen sich im Array befinden, noch wie viele Leerzeichen. Eine schnelle Manipulation zum Hinzufügen von Anführungszeichen sollte jedoch klar genug sein:
quelle
∊⍕¨⍳10
Sie nicht einfach verwenden⎕D
? Das sollte die Konstante sein'0123456789'
. Zumindest Dyalog APL und NARS2000 unterstützen dies.Python 47
Implementierung
Demo
Algorithmus
Konvertieren Sie jedes nicht-stellige Zeichen in ein Leerzeichen und teilen Sie die resultierende Zeichenfolge. Ein einfacher und klarer Ansatz.
Und eine unterhaltsame Lösung mit itertools (71 Zeichen)
quelle
Rubin, 70
Online Version zum Testen
Da die Konvertierung eines nicht-stelligen Zeichens in ein int in Ruby (mit to_i) 0 ergibt, ist die Konvertierung jedes Zeichens in int und zurück in char die nicht-reguläre Methode, um nach einer Ziffer zu suchen ...
quelle
Bash, 26 (Funktionsinhalt: 22 + Arrayzuweisungs-Overhead 4)
Dies wird die andere
bash
Antwort nicht schlagen , aber es ist interessant, weil es Sie dazu bringen könnte, doppelt zu nehmen:Verwendung ist:
//+([!0-9])/
Sieht auf den ersten Blick wie eine reguläre Ersetzung aus, ist es aber nicht. Es handelt sich um eine Bash-Parameter-Erweiterung , die Mustervergleichsregeln anstelle von Regeln für reguläre Ausdrücke folgt .Die Rückgabe echter Bash-Array-Typen aus Bash-Funktionen ist mühsam. Daher habe ich mich dafür entschieden, stattdessen eine durch Leerzeichen getrennte Liste zurückzugeben und dann in ein Array in einer Array-Zuweisung außerhalb des Funktionsaufrufs zu konvertieren. Aus Gründen der Fairness
(` `)
sollte der Funktionsaufruf in meiner Punktzahl enthalten sein.quelle
Mathematica 32
Verwendung
Das Äquivalent mit regulären Ausdrücken ist viel länger !:
quelle
Bash,
21 Bytes17/21 Bytes (verbessert durch DigitalTrauma )Erstellen einer durch Leerzeichen getrennten Liste mit
tr
Ersetzt eine beliebige Ziffer durch ein Leerzeichen
Verwendung
Bearbeiten
Wie in den Kommentaren unten gezeigt, kann der Code auf 17 Byte reduziert werden:
und da das Ergebnis nicht unbedingt ein Bash-Array ist, sollte die Verwendung so sein
und das extra
(``)
sollte gezählt werdenquelle
(blah)
statt{blah;}
:split()(tr -c 0-9 \ <<<$1)
. Auf diese Weise beträgt Ihr Funktionskörper nur 17 Zeichen.a=($(split "12 3a bc123")); echo ${a[@]}
. Es könnte argumentiert werden, dass "($ ())" in Ihrer Punktzahl gezählt wirdtr
Ansatz untersuchte, versuchte ich dies mit einer Parametererweiterung .tr
ist definitiv der bessere Ansatz zum Golfen.tr
mit dem Expansionsoperator zu umgehen? Es würde zu etwas kommen($(tr...))
, und wo die Funktionsdeklaration nicht zählt, würden die äußeren Klammern nicht gegen Sie zählen. Es wäre nur der Befehlsersetzungsteil.(``)
Konstrukt 1-Zeichen besser als das($())
eine und wird bevorzugt.Smalltalk (Smalltalk / X), 81
f-Wert: 'abc123def456' -> OrderedCollection ('123' '456')
f-Wert: 'aitew034snk582: 3c' -> OrderedCollection ('034' '582' '3')
f-Wert: 'as5493tax54 \ [email protected]' -> OrderedCollection ('5493' '54' '430' '52' '9')
f value: 'sasprs] tore \ "re \ forz' -> OrderedCollection ()
seufz - Smalltalk neigt dazu, sehr lange Funktionsnamen zu verwenden ...
quelle
asCollectionOfSubCollectionsSeparatedByAnyForWhich
ಠ_ಠ Dieser Name ist zu langR 81
Die Funktion akzeptiert eine Zeichenfolge und gibt eine Liste von Zeichenfolgen zurück.
Beispiele:
-
-
-
Hinweis:
$x
ist der Name des Listenelements.quelle
Perl, 53
Bearbeiten: keine Übereinstimmungen gefunden wurden, gibt sub nun eine Liste mit einer leeren Zeichenfolge (anstelle einer leeren Liste) nach Bedarf zurück.
Es vermeidet auch Splitting auf einzelnes Leerzeichen, als es löst ‚Split auf jeden white-space‘ Verhalten, das wahrscheinlich die Regeln verstößt. Ich könnte ein
/ /
Trennzeichen verwenden, das sich auf ein einzelnes Leerzeichen aufteilt , aber paradoxerweise sieht es so aus, als würde man ein reguläres Ausdrucksmuster verwenden. Ich könnteunpack
auf Kosten einiger zusätzlicher Zeichen diesplit
Kontroversen beseitigen, aber ich denke, dass es in Ordnung ist, ein wörtliches Zeichen (außer Leerzeichen) aufzuteilen.Und nein, Perls Transliterationsoperator führt keine regulären Ausdrücke aus. Ich kann den Bereich von 0 bis 9 abrollen
0123456789
wenn das das Problem ist.quelle
C, 68 Bytes (nur der Körper der Funktion)
Das erste Argument ist die Eingabezeichenfolge, das zweite ist das Ausgabearray, bei dem es sich um ein NULL-terminiertes Zeichenfolgenarray handelt.
a
Vor dem Aufruf der Funktion muss ausreichend Speicherplatz reserviert werden (worst case:)sizeof(char*)*((strlen(s)+1)/2)
.Die Eingabezeichenfolge wird von der Funktion geändert (jedes nicht-stellige Zeichen wird durch ersetzt
'\0'
).Anwendungsbeispiel
Ausgabe
Ungolf-Version:
quelle
VBScript, 190 (164 ohne Funktionsdeklaration)
Ich bin zwar überhaupt nicht wettbewerbsfähig, aber ich bin überrascht, dass VBScript diesbezüglich so kurz herauskommt, da es so ausführlich ist (13 Byte für die CRs allein). Es durchläuft die Zeichenfolge, ersetzt alle nicht numerischen Zeichen durch Leerzeichen, reduziert dann das gesamte Leerzeichen auf einzelne Leerzeichen und teilt es dann mit einem Leerzeichenbegrenzer auf.
Testfälle
quelle
Common Lisp (1 nach dem Buchstaben; ≈173 nach dem Geist)
Hier ist eine lesbare Version. Die Byte - Zählung ist ziemlich hoch , weil der langen Namen in Dingen wie
digit-char-p
undposition-if
undvector-push-extend
.Das Konzept der "Funktionsdeklaration" ist irgendwie vage. Hier ist eine Version, die nur ein Byte (das Zeichen) enthält
x
im Funktionskörper). alles andere ist in den Hilfsvariablen der Lamba-Liste der Funktion (Teil der Funktionsdeklaration) gebündelt:Die tatsächliche Anzahl der Bytes hängt davon ab, wie viele Hilfsdeklarationen in den Body verschoben werden müssten, damit dies als akzeptabel angesehen wird. Einige lokale Umbenennungen von Funktionen würden ebenfalls helfen (z. B. Verkürzen
position-if
da sie zweimal vorkommen, Verwenden von Variablen mit einem Buchstaben usw.).Dieses Rendering des Programms hat 220 Zeichen:
Wenn nichts anderes, sollte dies Common Lisps & aux-Variablen fördern .
Dies lässt sich
loop
natürlich prägnanter formulieren mit :Das
loop
Formular, in dem zusätzlicher Speicherplatz entfernt wurde, enthält 173 Zeichen:quelle
(result
bis zur letzten Klammer zählen, um der Körper zu sein. Der Teil, der den Namen und die Parameter definiert, ist die Deklaration.result
wird als Parameter hier erklärt; Es hat nur eine sehr nicht triviale Initialisierungsform. Dies ist im Prinzip dasselbe wie ein optionales Argument mit einem Standardwert, der durch einen komplexen Ausdruck berechnet wird. (In einfacheren Fällen ist es leicht vorstellbar, dasschar* substring( char *str, int begin, int end(0) )
in einer Sprache mit einer C-ähnlichen Syntax angegeben wird, dass diesend
optional ist0
. Wenn dies nicht angegeben wird, lautet der Wert . Ich möchte nur die Tatsache hervorheben, dass einige dieser Begriffe(defun fn (string &aux (start 0) (end 0)
würde nicht zählen, aber alles, was im Lambda verbleibt, würde zählen).JavaScript, 240 Byte
Und für diejenigen von euch, die neugierig sind, hier ist mein wahrscheinlich riesiges Golf:
Oben in hübscher Schrift:
Oben im normalen beschreibenden Code
quelle
PHP 134
quelle
array_filter
. Dadurch werden automatisch alle Einträge entfernt, diefalse
bei der Umwandlung in boolesche Werte vorhanden sind.C 158
Da in C keine Array-Druckfunktionen integriert sind, musste ich diese Arbeit selbst erledigen, daher entschuldige ich mich, dass in jeder Ausgabe ein Endkomma steht. Im Wesentlichen liest dieser Code die Zeichenfolge, wenn es sich nicht um eine Ziffer handelt, die durch '\ 0' ersetzt wird, und dann durchlaufe ich den Code und drucke alle Ziffernketten aus. (EOF = 0)
quelle
#define
s, Variablendeklarationen usw. zählen, die Funktionsdeklaration jedoch nicht.char[][]
legal notiert ist. Wenn Sie als das (oderchar**
) zurückkehren, wird es Ihnen gut gehen.C # 98
Zunächst wird die LINQ-
.Select()
Erweiterungsmethode verwendet, um alle Nicht-Ziffern in Kommas umzuwandeln.string.Replace()
wäre vorzuziehen, da esstring
eher ein als einIEnumerable<char>
, aber zurückgibtstring.Replace()
nur ein einzelnes Zeichen oder eine Zeichenfolge annehmen und kein Prädikat wie verwenden kannchar.IsDigit()
oder verwenden kann47<c&c<58
.Wie bereits erwähnt, gibt die
.Select()
Anwendung auf eine Zeichenfolge ein zurückIEnumerable<char>
Wir müssen sie also wieder in eine Zeichenfolge umwandeln, indem wir sie in ein Array umwandeln und das Array an die übergebenstring
Konstruktor übergeben.Zuletzt teilen wir die Zeichenkette mit Kommas auf
string.Split()
.(StringSplitOptions)1
Dies ist eine kürzere Art zu sagenStringSplitOptions.RemoveEmptyEntries
, die automatisch mehrere aufeinanderfolgende Kommas und Kommas am Anfang / Ende der Zeichenfolge berücksichtigt.quelle
char.IsDigit(c)
können Sie'/'<c&&c<':'
47<c&&c<58
. (Ehrlich gesagt bin ich überrascht, dass es mit Zahlen funktioniert, aber anscheinend schon).,
, den Leerraum zureturn new string(s.Select(c=>47<c&c<58?c:' ').ToArray()).Split().Where(a=>a!="").ToArray();
JS / Node:
168162147138 ZeichenVerschönerte Version:
quelle
console.log(r)
einige andere Dinge entfernen könnenRubin, 24
Definiert Ziffern mit negativen Leerzeichen innerhalb des druckbaren ASCII-Bereichs.
quelle
php , 204
Beschreibender Code:
Dies ist ein ziemlich langer Code und ich bin sicher, dass es eine viel kürzere PHP-Version für diesen Code Golf geben wird. Das könnte ich mir in PHP einfallen lassen.
quelle
array()
mit[]
,array_push($output[$count], $arr[$i]);
mit$output[$count][]=$arr[$i];
und dieord()
Schecks mit ersetzenis_numeric()
. und Sie müssen nicht einmal die Zeichenfolge teilen, um über die Zeichen zu iterieren. Außerdem zählt nur der innere Code der Funktion, so dass Sie diePython
quelle
Python
10483@ Abhijit Antwort ist weit schlau, dies ist nur eine "verkleinerte" Version von dem, was ich im Sinn hatte.
Dies liefert keine Ausgabe, daher funktioniert der Code, wenn er einzeln ausgeführt wird, da einige Variablen in der Deklaration definiert sind.
quelle
PHP
9889Wie in der bash-Antwort von DigitalTrauma wird hier kein regulärer Ausdruck verwendet.
Testfälle:
quelle
Haskell 31
Die Zeichenfolge wird auf alle nicht numerischen Zeichen aufgeteilt, und die leeren Zeichenfolgen, die durch aufeinanderfolgende Trennzeichen generiert werden, werden entfernt.
quelle
VBA 210, 181 ohne Funktionsdeklaration
quelle
Rebol (66 Zeichen)
Ungolfed und eingewickelt in Funktionserklärung:
Beispielcode in der Rebol-Konsole:
quelle
JavaScript,
1049789Golf gespielt:
Bearbeiten: Wenn die Schleifen das Ende des Arrays verlassen,
c
istundefined
das falsch und beendet die Schleife.27.02 .: Mit wird
?:
die Wortgewandtheit von gespeichertif/else
.Der Wagenrücklauf im Gehäuse dient der Lesbarkeit und ist nicht Teil der Lösung.
Ungolfed:
Die Idee ist, jedes Zeichen an den letzten Eintrag im Array anzuhängen, wenn es eine Ziffer ist, und sicherzustellen, dass der letzte Array-Eintrag andernfalls eine Zeichenfolge ist.
quelle
Javascript, 72
Ungolfed
Sample Input / Output
JSFiddle
quelle
if(+a[i]+1)b+=a[i];else if(b)c.push(b),b=""
mitb=+a[i]+1?b+a[i]:b?(c.push(b),""):b
.(c.push(b),"")
schien klug, das habe ich nie gesehen.R 52
Diese Funktion teilt Strings nach Zeichenklassen auf (dies ist kein regulärer Ausdruck! :)). Die Klasse besteht aus N - numerischen Zeichen und P {N} bedeutet die Negation dieser Klasse. o = T bedeutet, dass leere Teilzeichenfolgen weggelassen werden.
quelle
PHP 99
Ausgabe
quelle
JavaScript 88
88 Zeichen ohne Zählfunktion n (x) {}
quelle