Wenn es darum geht, Süßigkeiten zu essen, halte ich mich an höhere Standards als der typische Laie. Es gibt ein empfindliches Gleichgewicht zwischen "Verwechseln" und "Das Beste zum Schluss".
In dieser Herausforderung erhalten Sie eine Zeichenfolge, in der jedes Zeichen ein Bonbon darstellt. Verschiedene Zeichen (Groß- und Kleinschreibung beachten) stehen für verschiedene Arten von Süßigkeiten. Ihr Programm muss dann die richtige Reihenfolge für den Verzehr von Süßigkeiten anhand der folgenden Prozedur ermitteln. Sie können entweder ein vollständiges Programm (STDIN / STDOUT) oder eine benannte Funktion schreiben, um diese Aufgabe auszuführen.
Nehmen wir an, mein Süßigkeitenvorrat ist oroybgrbbyrorypoprr
. Zuerst sortiere ich die Süßigkeiten in Stapel des gleichen Typs, wobei größere Mengen oben liegen, wobei niedrigere ASCII-Zeichenwerte als Auslöser dienen.
rrrrrr
oooo
bbb
yyy
pp
g
Dann nehme ich jede Reihe Süßigkeiten und verteile sie in gleichmäßigen Abständen. Wenn es zum Beispiel 3 Süßigkeiten gibt, wird eine 1/3 des Weges, 2/3 des Weges und am Ende platziert.
.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g
Dann gehe ich jede Spalte durch, um meine endgültige Süßigkeitenbestellung zu erstellen rorbyroprbyorrobypg
.
Eingang
Eine Zeichenfolge, die den Süßigkeitenbestand enthält. Die Eingabe für das obige Beispiel könnte gewesen sein:
oroybgrbbyrorypoprr
Ausgabe
Eine Zeichenfolge, die die Süßigkeiten enthält, wurde in der richtigen Reihenfolge des Verbrauchs reorganisiert.
rorbyroprbyorrobypg
Wertung
Das ist Code Golf. Die kürzeste Antwort in Bytes gewinnt. Es gelten die Standardregeln für Code-Golf.
Antworten:
CJam,
78 68 61 45 42 39 3130 BytesÜbernimmt die Eingabezeichenfolge über STDIN
Inspiriert von rekursiven Ansätzen, aber ein bisschen anders. Überhaupt kein Transponieren oder Rechteck nötig !.
Wie es funktioniert:
(Schade, dass CJam mit Pyth nicht mehr fertig werden kann, weil so viel Bloat wie Syntax benötigt wird)
Probieren Sie es hier aus
quelle
{_@_@{_@\%}h;/*}
mit:
.Pyth , 25
Verwendet einen völlig neuen Algorithmus, der von dieser Antwort inspiriert ist .
Schritt für Schritt:
Zuerst haben wir die Zeichen nach ihrer Häufigkeit sortiert und die Verbindungen alphabetisch getrennt. Das ist
o_/zZSz
.o
ist dasselbe wie bei Pythonsorted(<stuff>,key=<stuff>)
, mit einem Lambda-Ausdruck für den Schlüssel, außer dass er als Zeichenfolge beibehalten wird.Dann generieren wir eine Liste der Präfixe dieses Strings von Länge
len(z)
zu Länge 1.>
Entspricht Pythons<stuff>[<int>:]
.Anschließend ordnen wir diese Liste der Präfix-Zeichenfolgen nach der Bruchstelle des ersten Zeichens des Präfixes auf dem in der Frage gezeigten rechteckigen Layout neu an, wobei 0 der linke Rand und 1 der rechte Rand ist.
/NhN
Zählt, wie oft das erste Zeichen im Präfix im Präfix vorkommt, während/zhN
die Anzahl der Vorkommen des ersten Zeichens im Präfix in der Zeichenfolge als Loch angegeben wird. Dies weist jedem Präfix, das von jedem Zeichen in einer Gruppe angeführt wird, einen anderen Bruch zu, von1/k
dem am weitesten rechts liegenden Vorkommen dieses Zeichens bisk/k
zum am weitesten links liegenden. Wenn Sie die Präfixliste nach dieser Nummer neu ordnen, erhalten Sie die entsprechende Position im Layout. Die Aufteilung der Krawatten erfolgt nach der vorherigen Reihenfolge, die zuerst gezählt und dann nach Wunsch alphabetisch sortiert wurde.Schließlich müssen wir das erste Zeichen aus jeder Präfixzeichenfolge extrahieren, sie zu einer einzelnen Zeichenfolge kombinieren und sie ausdrucken. Extrahieren der ersten Zeichen ist
hC
.C
Führt eine Matrixtransponierung für die Liste durch.zip(*x)
Tatsächlichh
extrahiert Python 3. die erste Zeile der resultierenden Matrix. Dies ist tatsächlich die einzige Zeile, da das Vorhandensein des 1-Zeichen-Präfix verhindert, dass andere vollständige Zeilen gebildet werden.s
fasst die Zeichen in diesem Tupel zu einer einzigen Zeichenfolge zusammen. Drucken ist implizit.Prüfung:
Inkrementelle Programmteile zu
oroybgrbbyrorypoprr
:Alte Antwort:
Pyth , 34
Dieses Programm berechnet, wie oft eine bestimmte Unterliste repliziert werden muss. Die Unterliste sieht aus wie
['', '', '', '', ... , 'r']
. Die Gesamtlänge dieser Unterliste ergibt sich aus der Häufigkeit aller anderen Bonbonsu*G/zHS{-zd1
. Die vollständige Unterliste wird erstellt, indem die Liste der leeren Zeichenfolge so oft wie möglich repliziert]k
und anschließend ein Element mit entferntt
und der Bonbonname am Ende mit hinzugefügt wird+d
.Diese Unterliste wird dann so oft repliziert, wie diese Süßigkeit in der Eingabe gefunden wird
/zd
, um sicherzustellen, dass die Liste jeder Süßigkeit gleich lang ist.Mit dieser Funktion, die in der richtigen Reihenfolge (
o_/zNS{z
) auf alle eindeutigen Bonbons abgebildet wird , haben wir ein Rechteck, das dem in der Frageanweisung ähnelt, aber leere Zeichenfolgen anstelle von Punkten enthält. Wenn Sie eine Matrixtransponierung (C
) gefolgt von zwei Summierungen (ss
) durchführen, erhalten Sie die endgültige Zeichenfolge.Nachprüfung:
quelle
Perl 5 - 62
61 Code + 1 Flag.
Teilen Sie die Eingabe zunächst in das Zeichenfeld - auf
/./g
.Fügen Sie jedem Buchstaben einen Vorkommensindex hinzu und lassen Sie dabei die Anzahl der Variablen
$a
..$z
mitmap++$$_.$_
. Jetzt ist das Array:Konvertieren Sie es dann in eine Sortierschlüssel-Verkettung aus Verhältnis
$_/$$1
, Zählwert~$_
und ASCII-Wert$_
. Dies führt zu (hier mit zusätzlichen Leerzeichen zur Klarheit).Dies kann in lexikografischer (Standard-) Reihenfolge sortiert werden. Am Ende letzten Buchstaben extrahieren und ausdrucken:
print map/(.$)/
quelle
Python 3.x - 124 Bytes
quelle
Mathematica,
123119118 BytesDefiniert eine benannte Funktion
f
. Ungolfed:Die Verwendung integrierter rationaler Typen schien hierfür eine gute Idee zu sein. Natürlich ist dies nicht in der Nähe von CJam. Grundsätzlich stelle ich das in der Challenge gezeigte Gitter als eine Liste von Paaren dar. Das erste im Paar ist der Zeichencode, das zweite ist die Position als Bruch kleiner oder gleich 1 (die letzte Spalte ist 1). Nachdem ich sichergestellt habe, dass die einzelnen Zeichen bereits in der richtigen Reihenfolge sind, muss ich diese nur stabil nach dem genannten Bruch sortieren, um das gewünschte Ergebnis zu erzielen.
quelle
Pyth 45
47 48 51Dies könnte auch mit ziemlicher Sicherheit weiter golfen werden;)
Erstellt eine Liste mit Listen, wobei jede innere Liste aus einer Reihe leerer Zeichenfolgen und dem Namen der Süßigkeit besteht. Diese Liste wird transponiert und dann werden die inneren Listen verbunden, gefolgt von diesen Listen, die verbunden werden.
Danke @isaacg, dass du mich an die Summe erinnert hast!
quelle
s
auf einer Liste von Zeichenfolgen funktioniert alsj""
.APL: 38
Erläuterung:
Kann auf tryapl.org getestet werden
quelle
R - 166 Zeichen
ungolfed version
Erläuterung:
order
sortieren ist in der Sortierung stabil, behält also die häufigste / lexikalische Benennungsreihenfolge bei, wenn ein Gleichstand im Index vorliegt, besonders wichtig bei den letzten Bonbons)Die Matrixnatur des Problems ließ mich denken, dass R vielleicht eine Chance hat, aber die beste wörtliche Interpretation des Algorithmus, den ich tun konnte, waren 211 Zeichen:
ungolfed:
quelle
Pyth, 29 Bytes
Dies ist eine direkte Übersetzung meines CJam Answe R in Pyth
Probieren Sie es hier online aus
Diese Lösung hat eine ziemlich lange Geschichte und @isaacg hat mir sehr geholfen, diese neue Sprache zu verstehen.
Im Idealfall ist dies die genaue Wort-zu-Wort-Übersetzung meines CJam-Codes ( 17 Byte ):
was bedeutet:
Leider gibt Python in a nichts zurück
+=
Aufruf , so dass es sich nicht um einen gültigen Python-Code handelte, also auch um einen ungültigen Python-Code, da ein Lambda nur eine return-Anweisung sein kann.Dann habe ich verschiedene Methoden untersucht und festgestellt, dass Python
list.append
einenNone
Wert zurückgibt , den ich verwenden kann. Code auf ( 19 Byte ) setzen:was bedeutet:
Leider wurde die Unterstützung von
a
(append) aus Pyth entfernt und die Version, die die Unterstützung hat, hat nicht die Unterstützung füro
.Update:
a
In Pyth wurde Unterstützung hinzugefügt, sodass der oben genannte 19-Byte-Code im Online-Compiler funktioniert. Da es sich jedoch um eine neue Funktion handelt, die nach dem OP hinzugefügt wurde, stelle ich sie nicht als mein Ergebnis dar und lasse den 29-Byte-Code als meine Lösung zu.Deshalb musste ich mich in diesem Fall auf Raw Python verlassen, um den Code zu erstellen
quelle