Geben Sie bei einer gegebenen ASCII-Zeichenfolge die aufgelösten Suffixe aus. Wenn die Zeichenfolge beispielsweise war abcde
, gibt es 5 Suffixe, die am längsten bis am kürzesten geordnet sind:
abcde
bcde
cde
de
e
Jedes Suffix wird dann explodiert , jedes Zeichen der Bedeutung so oft wie seine eine indizierte Position in diesem Suffix kopiert wird. Zum Beispiel das Auflösen der Suffixe von abcde
,
abcde
12345
abbcccddddeeeee
bcde
1234
bccdddeeee
cde
123
cddeee
de
12
dee
e
1
e
Insgesamt sind die Explosions Suffixe abcde
sind
abbcccddddeeeee
bccdddeeee
cddeee
dee
e
Regeln
- Das ist Code-Golf, also gewinnt der kürzeste Code.
- Die Eingabe besteht aus den druckbaren ASCII-Zeichen. (Dies schließt Zeilenumbrüche aus, schließt jedoch Leerzeichen ein.)
- Die Ausgabe hat jede Zeichenfolge in einer separaten Zeile.
- Nachgestellte Leerzeichen sind in jeder Zeile zulässig, und am Ende befindet sich möglicherweise ein zusätzlicher Zeilenumbruch.
Testfälle
''
'a'
a
'bc'
bcc
c
'xyz'
xyyzzz
yzz
z
'code-golf'
coodddeeee-----ggggggooooooollllllllfffffffff
oddeee----gggggoooooolllllllffffffff
dee---ggggooooollllllfffffff
e--gggoooolllllffffff
-ggooollllfffff
goolllffff
ollfff
lff
f
's p a c e'
s ppp aaaaa ccccccc eeeeeeeee
pp aaaa cccccc eeeeeeee
p aaa ccccc eeeeeee
aa cccc eeeeee
a ccc eeeee
cc eeee
c eee
ee
e
Antworten:
Gelee , 5 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
J,
22128 BytesVielen Dank an Meilen für die Einsparung von 14 Bytes!
Das ist eine wirklich schöne Lösung. Auch ziemlich prägnant.
Dies ist der Haken
#~#\
, der auf die Suffixe (\.
) der Eingabe angewendet wird . Wenn der Hook bei der Eingabe aufgerufen wirdy
, wird er folgendermaßen zerlegt:Hier sind einige Zwischenergebnisse:
Testfälle
quelle
Python, 61 Bytes
Alternative 63:
quelle
Python 3,
916865 BytesBeendet mit einem Fehler nach dem Drucken der gewünschten Ausgabe. Teste es auf Ideone .
Wie es funktioniert
Bevor f sich rekursiv aufrufen kann, müssen die Indizes von
s[1:...]
berechnet werden.First
enumerate(s[0]+s)
liefert alle Paare (i, c) der Zeichen c von s - wobei das erste Zeichen dupliziert wird - und die entsprechenden Indizes i . Das Voranstellens[0]
dient hier zwei Zwecken.Das erste Zeichen von s muss einmal wiederholt werden, aber der erste Index ist 0 .
Sobald alle Zeichen verarbeitet wurden,
s[0]
wird ein IndexError ausgelöst , wodurch f mit einem Fehler beendet wird, anstatt Zeilenumbrüche zu drucken, bis das Rekursionslimit erreicht ist.''.join(i*c for i,c in ...)
Erstellt eine flache Zeichenfolge aus jedem c , die i- mal wiederholt wird undprint
zu STDOUT zurückkehrt.Schließlich wiederholt der rekursive Aufruf den obigen Prozess für s ohne sein erstes Zeichen , da None
print
zurückgibt und einfach ist .s[1:None]
s[1:]
f(s[1:...])
quelle
Perl 6 , 38 Bytes
37 Bytes + 1 für die
-n
BefehlszeilenumschaltungBeispiel:
Erweitert:
quelle
Brachylog , 17 Bytes
Probieren Sie es online!
Erläuterung
quelle
05AB1E , 13 Bytes
Probieren Sie es online!
Erläuterung
quelle
CJam , 14 Bytes
Probieren Sie es online!
Erläuterung
quelle
C #, 101 Bytes
Rekursive anonyme Funktion, die auch eine führende Newline druckt. Wenn die führende Zeile nicht zulässig ist, wird sie durch 3 zusätzliche Bytes in eine nachfolgende Zeile umgewandelt:
Volles Programm mit ungolfed Methode und Testfällen:
quelle
Haskell, 48 Bytes
wird durch eine der Schnittstellen
quelle
putStr.
, wir akzeptieren als Funktionsausgabe. Sie müssenimport Data.List
jedoch verwendentails
.uncurry ... zip
mitzipWith
:unlines.map(concat.zipWith replicate[1..]).tails
.zipWith replicate
Abkürzung kam mir auch vor, als ich aufwachte. Schade , dasstails
nicht in ist ,Prelude
ich könnte holentails
ausData.List
implizit ohne eine vollständigeimport
und noch ohne die auswachsendenfoldr
gleichwertig. Was die Reinheit ohneIO
Boilerplatte betrifft, würde ich dasmapM_ putStrLn
Würzen auch dem Geschmack der Leser überlassen und auch nicht durchführenunlines
. Das Definieren eines Blockse=
würde die Anzahl der Bytes kosten.imports
ist kein Standard von Haskell, sondern eine Funktion derghci
Replikation. Abhängig von solchen Dingen zählt eine eigene Sprache, daher schlage ich vor, den Titel Ihrer Antwort auf so etwas wie zu ändernHaskell (ghci)
. ( Siehe auch diese Metadiskussion ).Perl, 36 + 1 (
-n
) = 37 BytesBedarf
-n
und-E
(oder-M5.010
) Ausführung:Beachten Sie, dass es bei jeder Ausführung nur auf einer Instanz funktioniert (da es die Variable verwendet,
$.
die bei jedem Lesen einer Zeile inkrementiert wird, sodass sie1
nur beim ersten Lesen einer Zeile beibehalten wird). (Aber kein Problem hier, einfach^D
und erneut ausführen!)quelle
Retina , 31 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
quelle
Java,
150127 BytesBearbeiten:
Snipet:
Ungolfed:
quelle
f->{String s[]=f.split(""),o="";int i=-1,j,l=s.length;for(;++i<l;)for(j=-2;++j<i;o+=s[i]);return l<1?o:o+"\n"+f.substring(1);}
Schläger 184 Bytes
Ungolfed:
Ausgabe:
quelle
JavaScript (ES6), 65 Byte
Bisherige Versuche:
quelle
PHP, 103 Bytes (99 mit kurzen Tags)
Ich bin mir ziemlich sicher, dass dies nicht die kürzestmögliche Antwort ist.
quelle
MATL , 12 Bytes
Ich liebe es, wenn Anführungszeichen zusammenkommen!
Probieren Sie es online!
Erläuterung
Dies funktioniert, indem eine Matrix erstellt wird, deren Spalten einzeln zur Lauflängendekodierung der Eingabe verwendet werden. Als Beispiel für die Eingabe ist
'abcde'
die MatrixCode:
quelle
Python 3, 95 Bytes
Das war überraschend schwieriger als ich erwartet hatte. Ich habe meine gesamte Funktion vielleicht viermal neu eingestellt.
quelle
Java 7.140 Bytes
Ungolfed
Das Befolgen der Zeile bereitet mir große Schmerzen. Ich weiß nicht, wie ich es spielen kann (weil es zwei Schleifen gibt, um die Bedingung zu brechen, die in die Druckanweisung eingefügt werden soll
"\n"
).System.out.println();
quelle
Pyke, 12 Bytes
Probieren Sie es hier aus!
quelle
Ruby, 51 Bytes
Verwendet das
-n
Flag für +1 Byte.quelle
R, 108 Bytes
Liest die Eingabe von stdin und druckt nach stdout
Ich fand die Verwendung von
do.call
hier angemessen. Grundsätzlich werden zwei Eingaben benötigt: 1. Ein Funktionsname in Form einer Zeichenfolge (rep
hier) und eine Liste von Argumenten und 2. Durch iteratives Anwenden wird die Funktion unter Verwendung der Argumente in der Liste aufgerufen.Z.B:
rep("c",3)
erzeugt den Vektor"c" "c" "c"
do.call("rep",list(c("a","b","c"),1:3))
erzeugt den Vektor"a" "b" "b" "c" "c" "c"
rep("a",1)
,rep("b",2)
undrep("c",3)
quelle
Vim, 43 Bytes
qqYlpx@qq@qqr0<C-H><C-V>{$:s/\v%V(.)\1*/&\1/g<CR>@rq@r
Das erste Makro trennt die Suffixe, das zweite Makro "explodiert" sie. Wahrscheinlich schlagbar. Leerzeichen sind ärgerlich.
quelle
C 186 Bytes
Dies kann wahrscheinlich einiges gekürzt werden, aber ich wollte es nur versuchen. Es ist mein zweiter Versuch beim Golf, also gib mir alle Hinweise (* lol), die du kannst. Es nimmt einen String als Parameter und führt die Explosion von dort aus. u wird als Puffer verwendet, in dem die aufgelöste Zeichenfolge gespeichert wird.
Ungolfed:
quelle
Acc !! 150 Bytes
Erwartet eine Eingabe in stdin, die mit einem Tabulatorzeichen abgeschlossen wird.
Erläuterung
Dies ist eigentlich eine ziemlich gute Aufgabe für Acc !! , da es nur erforderlich ist, einen String zu lesen und ihn mit einigen verschachtelten Schleifen zu durchlaufen. Wir lesen den String in den Akkumulator ein und behandeln ihn als eine Folge von 128-stelligen Basen, wobei das erste Zeichen am Ende niedriger Ordnung steht. Nach der Eröffnungsschleife
Count c
kann der Akkumulatorwert wie folgt definiert werden (xyz
als Beispieleingabe):(Der tatsächliche Akkumulatorwert für dieses Beispiel ist
9*128^3 + 122*128^2 + 121*128 + 120
=20888824
.)Wir können dann über den String iterieren, indem wir über die zunehmenden Potenzen von 128 iterieren. Und wir können die Suffixe iterieren, indem wir den Akkumulator nach jeder Iteration durch 128 dividieren und ein Zeichen abhacken.
Mit Einrückung und Kommentaren:
quelle