Lieben Sie nicht diese Explosionszeichnungen, in denen eine Maschine oder ein Gegenstand in seine kleinsten Teile zerlegt wird?
Lass uns das mit einer Saite machen!
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die
- gibt eine Zeichenfolge ein, die nur druckbare ASCII-Zeichen enthält ;
- zerlegt die Zeichenkette in Gruppen von Zeichen, die nicht gleich Leerzeichen sind (die "Teile" der Zeichenkette);
- gibt diese Gruppen in einem beliebigen Format aus, wobei zwischen den Gruppen ein gewisses Trennzeichen besteht .
Zum Beispiel angesichts der Zeichenfolge
Ah, abracadabra!
Die Ausgabe wäre die folgenden Gruppen:
! , EIN aaaaa bb c d h rr
Jede Gruppe in der Ausgabe enthält gleiche Zeichen, wobei Leerzeichen entfernt werden. Als Trennzeichen zwischen den Gruppen wurde ein Zeilenvorschub verwendet. Weitere Informationen zu zulässigen Formaten finden Sie weiter unten.
Regeln
Die Eingabe sollte eine Zeichenfolge oder ein Array von Zeichen sein. Es enthält nur druckbare ASCII-Zeichen (einschließlich des Bereichs von Leerzeichen bis Tilde). Wenn Ihre Sprache dies nicht unterstützt, können Sie die Eingabe in Form von Zahlen vornehmen, die ASCII-Codes darstellen.
Sie können davon ausgehen, dass die Eingabe mindestens ein Nicht-Leerzeichen enthält .
Die Ausgabe sollte aus Zeichen bestehen (auch wenn die Eingabe über ASCII-Codes erfolgt). Es muss ein eindeutiges Trennzeichen zwischen den Gruppen geben , das sich von allen Nicht-Leerzeichen unterscheidet, die in der Eingabe erscheinen können.
Wenn die Ausgabe über Funktionsrückgabe erfolgt, kann es sich auch um ein Array oder Zeichenfolgen oder ein Array von Arrays aus Zeichen oder eine ähnliche Struktur handeln. In diesem Fall sorgt die Struktur für die notwendige Trennung.
Ein Trennzeichen zwischen den Zeichen jeder Gruppe ist optional . Wenn es eine gibt, gilt die gleiche Regel: Es darf kein Nicht-Leerzeichen in der Eingabe sein. Außerdem darf es nicht dasselbe Trennzeichen sein, das zwischen Gruppen verwendet wird.
Ansonsten ist das Format flexibel. Hier sind einige Beispiele:
Die Gruppen können wie oben gezeigt durch Zeilenumbrüche getrennte Zeichenfolgen sein.
Die Gruppen können durch beliebige Nicht-ASCII-Zeichen getrennt sein, z
¬
. Die Ausgabe für die obige Eingabe wäre die Zeichenfolge:!¬,¬A¬aaaaa¬bb¬c¬d¬h¬rr
Die Gruppen können durch n > 1 Leerzeichen getrennt sein (auch wenn n variabel ist), wobei Zeichen zwischen jeder Gruppe durch ein einzelnes Leerzeichen getrennt sind:
! , A a a a a a b b c d h r r
Die Ausgabe kann auch ein Array oder eine Liste von Zeichenfolgen sein, die von einer Funktion zurückgegeben werden:
['!', 'A', 'aaaaa', 'bb', 'c', 'd', 'h', 'rr']
Oder ein Array von Zeichen-Arrays:
[['!'], ['A'], ['a', 'a', 'a', 'a', 'a'], ['b', 'b'], ['c'], ['d'], ['h'], ['r', 'r']]
Beispiele für Formate, die nach den Regeln nicht zulässig sind:
- Ein Komma kann nicht als Trennzeichen (
!,,,A,a,a,a,a,a,b,b,c,d,h,r,r
) verwendet werden, da die Eingabe Kommas enthalten kann. - Es ist nicht zulässig, das Trennzeichen zwischen Gruppen (
!,Aaaaaabbcdhrr
) zu löschen oder dasselbe Trennzeichen zwischen Gruppen und innerhalb von Gruppen (! , A a a a a a b b c d h r r
) zu verwenden.
Die Gruppen können in der Ausgabe in beliebiger Reihenfolge angezeigt werden. Zum Beispiel: Alphabetische Reihenfolge (wie in den obigen Beispielen), Reihenfolge des ersten Auftretens in der Zeichenfolge, ... Die Reihenfolge muss nicht konsistent oder sogar deterministisch sein.
Beachten Sie, dass die Eingabe keine Neue - Zeile - Zeichen enthalten kann, und A
und a
sind verschiedene Zeichen (Gruppierung ist case-sentitive ).
Kürzester Code in Bytes gewinnt.
Testfälle
In jedem Testfall wird die erste Zeile eingegeben und die verbleibenden Zeilen werden ausgegeben, wobei sich jede Gruppe in einer anderen Zeile befindet.
Testfall 1:
Ah, Abrakadabra! ! , EIN aaaaa bb c d h rr
Testfall 2:
\ o / \ o / \ o / /// \\\ ooo
Testfall 3:
Ein Mann, ein Plan, ein Kanal: Panama! ! ,, : EIN P aaaaaaaa c ll mm nnnn p
Testfall 4:
"Zeig mir, wie du diesen Trick machst, der mich zum Schreien bringt", sagte sie "" , S aaaaa cc dd eeeeeee hhhhhh ii kk mmmm n ooooo rr ssss tttttt u ww y
Antworten:
Gelee , 5 Bytes
Probieren Sie es online!
Es gibt ein Array zurück, nur dass das Trennzeichen weg ist, wenn es an STDOUT gedruckt wird.
Dies ist in der Tat eine Funktion, die als solche aufgerufen werden kann (in Jelly ist jede Zeile eine Funktion).
quelle
Python 3.5+,
77464441 BytesZiemlich einfach. Durchläuft die eindeutigen Zeichen in der Zeichenfolge, indem es in eine Menge konvertiert wird (unter Verwendung des erweiterten iterierbaren Entpackens von Python 3.5), und verwendet dann ein Listenverständnis, um die explodierten Diagramme zu erstellen, indem die Häufigkeit gezählt wird, mit der jedes Zeichen in der Zeichenfolge vorkommt
str.count
. Wir filtern Leerzeichen heraus, indem wir sie aus der Menge entfernen.Die Reihenfolge der Ausgabe kann von Lauf zu Lauf variieren. Sets sind ungeordnet, daher kann die Reihenfolge, in der ihre Elemente verarbeitet werden, und damit die Ausgabe dieser Antwort, nicht garantiert werden.
Dies ist ein Lambda-Ausdruck; Um es zu benutzen, setzen Sie ein Präfix
lambda
mitf=
.Probieren Sie es auf Ideone!Ideone verwendet Python 3.4, was nicht ausreicht.Anwendungsbeispiel:
3 Bytes gespart dank @shooqie!
quelle
{*s}
fürset(s)
.Retina, 13 Bytes
Das Sortieren ist sehr einfach (es ist ein eingebautes), es trennt die Buchstaben, die 9 Bytes benötigen. Probieren Sie es online!
Die erste Zeile enthält
O
alle Übereinstimmungen des regulären Ausdrucks.
(das ist jedes Zeichen), die uns geben!,Aaaaaabbcdhrr
.Übereinstimmung ist die Standardstufe für die letzte Zeile eines Programms und
!
bewirkt, dass eine durch Zeilenvorschub getrennte Liste der Übereinstimmungen des regulären Ausdrucks gedruckt wird. Der reguläre Ausdruck sucht nach einer oder mehreren Instanzen eines Nicht-Leerzeichens in einer Zeile.quelle
Perl 6 , 28 Bytes
Beachten Sie, dass Taschen wie ein Hash oder ein Set nicht sortiert sind, sodass die Reihenfolge der Ergebnisse nicht garantiert werden kann.
Erläuterung:
quelle
Vim,
50, 46 BytesErklärung / gif kommt später.
quelle
Pyth, 6
Probieren Sie es hier aus oder führen Sie eine Test Suite aus .
Ziemlich einfach,
-zd
entfernt Leerzeichen aus der Eingabe und.gk
gruppiert jedes verbleibende Element nach seinem Wert. Leider habe ich keine Möglichkeit gefunden, automatische Füllvariablen zu verwenden. Beachten Sie, dass die Ausgabe als Python-Zeichenfolge angezeigt wird, sodass bestimmte Zeichen (mit umgekehrten Schrägstrichen) maskiert werden. Wenn Sie möchten, dass es besser lesbar ist, fügen Siej
am Anfang des Codes ein hinzu.quelle
Haskell, 38 Bytes
Grundsätzlich die Lösung von nimi , aber explizit nur die in der Zeichenfolge vorkommenden Buchstaben prüfen.
quelle
2sable , 7 Bytes
Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
JavaScript (ES6), 41 Byte
quelle
" "
im zurückgegebenen Array vorhanden ist? Nicht sicher, ob das erlaubt istjoin()
Ähm , wie wird mit diesen doppelten Backkticks gerufen?.join([''])
.join
konvertiert das dann in die (leere) Zeichenfolge und verwendet diese, um die Array-Elemente zu verbinden. Nicht alle Methoden konvertieren ihre Parameter in Zeichenfolgen, aber diese Technik ist praktisch für diejenigen, die dies tun.Brachylog ,
147 Bytes7 Bytes dank Fatalize.
Probieren Sie es online!
quelle
x
zu entfernen@S
(Leerzeichen). Ich glaube, dieses Ausgabeformat (Liste der Zeichenfolgen) ist gültigHaskell, 40 Bytes
Anwendungsbeispiel:
f "Ah, abracadabra!"
->["!",",","A","aaaaa","bb","c","d","h","rr"]
.Das Muster
v:w
entspricht nur einer Liste mit mindestens einem Element, sodass alle Zeichen, die nicht in der Eingabe enthalten sind, ignoriert werden.Auch 40 Bytes:
quelle
group
vonData.List
. Jedenfalls denke ich, dass diese Syntaxghci
nur die REPL ist und benötigt, es ist also eine eigene Sprache . Ich möchte bei Standard Haskell bleiben.Ruby, 41 + 1 = 42 Bytes
+1 Byte für
-n
Flag.Übernimmt Eingaben über stdin, zB:
quelle
C #
12598 BytesErläuterung
ToArray
Anruf zu entfernen und nur implizit eine IEnumerable zurückzugeben, die insgesamt 27 Bytes spartquelle
Func<string, string[]>
alsos=>s.GroupBy....
R
1981899695 BytesUngolfed:
Diese Lösung funktioniert derzeit nicht ganz, wenn\
es darum geht.Jetzt ist es !
Vielen Dank , dass eine Menge Sie @JDL für Golf aus 102 Bytes!
quelle
for(i in unique(a=strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")
zuzuweisen : - Spart 2 Bytes.<-
wird jedoch 1 Byte gespart!Swift,
10591 BytesDanke an @NobodyNada für 14 Bytes :)
Ja, ich bin ziemlich neu bei Swift ...
Zeichen innerhalb einer Gruppe werden durch einen einzelnen Zeilenumbruch getrennt. Gruppen werden durch zwei Zeilenumbrüche getrennt.
quelle
[Character]
anstelle von a eineString
Eingabe vornehmen, da die Regeln besagen, dass "die Eingabe eine Zeichenfolge oder ein Array von Zeichen sein sollte". Auchprint("")
kann mit nur ersetzt werdenprint()
.print
ohne Argumente hat aus irgendeinem Grund nicht funktioniert, aber der[Character]
Vorschlag war solide. Vielen Dank!Oktave , 61 Bytes
Dies ist eine nervige Funktion, die eine Zeichenfolge als Eingabe verwendet und ein Zellenarray von Zeichenfolgen ausgibt.
Versuchen Sie es bei Ideone .
Wie es funktioniert
sort
sortiert die Eingabezeichenfolge. Insbesondere werden Leerzeichen am Anfang stehen.strtrim
Entfernt führende Leerzeichen.diff(+y)
berechnet aufeinanderfolgende Unterschiede zwischen Zeichen (um Gruppengrenzen zu erkennen) ...diff(find([1 diff(+y) 1])
ergibt also einen Vektor von Gruppengrößen.mat2cell
teilt dann die sortierte Zeichenfolge in Abschnitte mit diesen Größen auf.quelle
Mathematica, 36 Bytes
Eingebaute Funktionen
Gather
undCharacters
erledigen die meiste Arbeit hier.quelle
> <> 49 Bytes
Sehr großzügig in der Ausgabe verschwenderisch, aber ich gehe davon aus, dass es angesichts der Nachsicht der Regeln noch erlaubt ist
Erläuterung:
Passen Sie einige Dinge ziemlich eng an, und verwenden Sie sogar Sprünge, um einige Funktionen zu umgehen, damit ich den Zeiger vertikal bewegen kann.
Grundsätzlich wird jedes ASCII-Zeichen in eine eigene Zeile gesetzt. Wenn keines dieser Zeichen vorhanden ist, ist die Zeile leer
Probieren Sie es online aus
Bearbeiten: Ich habe mich geirrt, es gab einen Fehler im Code, der dazu führen würde, dass er niemals abgeschlossen wird, wenn sich in der Eingabe ein Leerzeichen befindet
quelle
Pyth, 5 Bytes
Probieren Sie es hier aus!
Übernimmt die Eingabe als Python-Zeichenfolge (dh in Anführungszeichen, Anführungszeichen und Schrägstriche, falls erforderlich).
Erläuterung:
Wenn Sie mindestens ein Leerzeichen in der Eingabe garantieren, gibt es eine 4-Byte-Lösung:
Probieren Sie es hier aus!
Erläuterung:
quelle
PowerShell v2 +, 44 Byte
Nimmt Eingaben
$args[0]
als Literalzeichenfolge für Befehlszeilenargumente an. Wandelt das alschar
-array um und verwendet den Operator-n
ote
qual zum Herausziehen von Leerzeichen (ASCII32
). Dies funktioniert, weil Casting eine höhere Priorität hat und wenn ein Array als linker Operator mit einem Skalar als rechter Operator verwendet wird, wirkt es wie ein Filter.Wir übergeben dieses Array von Zeichen an
Group-Object
, das genau das tut, was es sagt. Beachten Sie, dass bei der Übergabe von Zeichen und nicht von Zeichenfolgen die Groß- und Kleinschreibung berücksichtigt wird.Jetzt haben wir ein benutzerdefiniertes Objekt, das Gruppennamen, Zählungen usw. enthält. Wenn wir nur drucken, erhalten wir eine Menge irrelevanter Ausgaben. Also müssen wir diese in einer Schleife Rohr
|%{...}
und jede Iteration-join
die.Group
zusammen in einem einzigen String. Diese resultierenden Zeichenfolgen verbleiben in der Pipeline, und die Ausgabe erfolgt implizit bei Programmabschluss.Beispiel
quelle
Dyalog APL , 11 Bytes
Funktion, die eine Liste von Zeichenfolgen zurückgibt.
(⊂∩¨∪)
der Schnittpunkt des Ganzen und seiner einzigartigen Charaktere~∘' '
außer LeerzeichenTryAPL online!
quelle
Verarbeitung, 109 Bytes
Sortieren Sie das Array und durchlaufen Sie es. Wenn es nicht mit dem zuletzt gedruckten Zeichen übereinstimmt, drucken Sie zuerst eine neue Zeile. Wenn es sich um ein Leerzeichen handelt, überspringen Sie den Druckschritt.
quelle
Javascript (mit externer Bibliothek - Enumerable) (
7867 Bytes)Link zu lib: https://github.com/mvegh1/Enumerable
Code Erklärung: Dies ist, was Enumerable gemacht wurde, um zu tun! Laden Sie den String in die Bibliothek, die ihn in ein char-Array konvertiert. Filtern Sie die Leerraumeinträge heraus. Gruppieren nach char. Schreiben Sie jede Gruppe gemäß dem angegebenen Prädikat in eine Zeile. In diesem Prädikat wird angegeben, dass alle Elemente der aktuellen Gruppe ohne Begrenzer zu einer Zeichenfolge zusammengefasst werden sollen.
quelle
MATL, 7 Bytes
MATL Online Demo
quelle
Perl6,
484745Danke an manatwork für die Verbesserungen.
quelle
$a.trim
scheint für die Bedingung zu tun.$^a.trim&&say $a x$^b
funktioniert also. (Entschuldigen Sie, dass Sie die Hinweise Byte für Byte hinzugefügt haben, aber dies ist mein erster Versuch mit Perl6.){
.Ruby, 46 Bytes
Probieren Sie es online!
Meine ursprüngliche Vollversion, 48 Bytes nach dem Hinzufügen des
n
Flags:quelle
.count(c)
mit.count c
?*
Operator in der Nähe ist und der Parser sich beschwert.map
dann braucht es zusätzliche Parens und((s.chars-[' '])|[]).map
hat die gleiche Anzahl von Zeichen wie(s.chars-[' ']).uniq.map
. Und die andere, kürzere Möglichkeit, eindeutige Zeichen zu überprüfen (über Regex), wird bereits von @Jordan in einer anderen Antwort behandeltPython, 107
Könnte durch Lambda verkürzt werden, aber später
quelle
CJam, 10 Bytes
Ein unbenannter Block, der die Zeichenfolge über dem Stapel erwartet und durch eine Liste von Zeichenfolgen ersetzt.
Probieren Sie es online!
Erläuterung
quelle
Common Lisp, 123
Ungolfed:
Nicht die golffreundlichste Sprache. Dies könnte möglicherweise geändert werden, um eine Liste von Listen zurückzugeben, anstatt eine Zeichenfolge zu drucken.
quelle
Emacs, 36 Tastenanschläge
C-SPACE C-EM-x
sort-r
TABRETURN.RETURN.RETURNC-AC-M-S-%\(\(.\)\2*\)
RETURN\1
C-QC-JRETURN!Ergebnis
A man, a plan, a canal: Panama!
->Erläuterung
sort-r
TAB RETURN .RETURN .RETURN\(\(.\)\2*\)
RETURN\1
C-Q C-JRETURN !sort-regexp-fields
mit Argumenten.
und.
;\(\(.\)\2*\)
->\1\n
bei allen Übereinstimmungen.quelle