Schreiben Sie ein Programm oder eine Funktion, die eine bestimmte Zeichenfolge treppenförmig ausgibt, indem Sie jeden Teil eines Wortes schreiben, der mit einem Vokal eine Zeile unter dem vorherigen Teil beginnt.
Beispielsweise:
Input: Programming Puzzles and Code Golf
Output: Pr P C G
ogr uzzl and od olf
amm es e
ing
Eingang
Eine Zeichenfolge, die nur Buchstaben und Leerzeichen enthält.
Die Zeichenfolge kann über STDIN
oder Funktionsargumente oder etwas Äquivalentes übergeben werden.
Buchstaben können in Klein- oder Großbuchstaben geschrieben werden.
Es wird immer davon ausgegangen, dass Eingaben diesen Regeln entsprechen. Sie müssen nicht nach falschen Eingaben suchen.
Ausgabe
Jedes Mal , wenn ein Vokal (das heißt, a
, e
, i
, o
, u
oder y
) in einem Wort auftritt, müssen Sie Ausgang des Rest des Wortes in der nächsten Zeile (die auftretenden Vokal enthalten), in der richtigen horizontalen Position. Diese Regel ist rekursiv, dh wenn das Wort n Vokale enthält, wird es in n + 1 Zeilen geschrieben.
Der Vokal sollte am Anfang der nächsten Zeile und nicht am Ende der vorherigen Zeile geschrieben werden, wenn einer auftritt.
Jedes Wort beginnt in der ersten Zeile und sollte daher unabhängig von anderen Wörtern formatiert werden. Zwei Wörter werden durch ein Leerzeichen getrennt.
Wenn ein Wort mit einem Vokal beginnt, müssen Sie es in der zweiten Zeile beginnen.
Testfälle
- Eingang:
Programming Puzzles and Code Golf
Ausgabe:
Pr P C G
ogr uzzl and od olf
amm es e
ing
- Eingang:
The quick brown fox jumps over the lazy dog
Ausgabe:
Th q br f j th l d
e u own ox umps ov e az og
ick er y
- Eingang:
aeiouy
Ausgabe:
a
e
i
o
u
y
- Eingang:
YEAh UppErcAsE VOwEls
Ausgabe:
V
Y Upp Ow
E Erc Els
Ah As
E
- Eingang:
If you only knew the power of the Dark Side
Ausgabe:
kn th p th D S
If y onl ew e ow of e ark id
o y er e
u
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code.
The vowel should be written at the beginning of the next line, and not at the end of the previous line when one is encountered.
Nach einigem Nachdenken habe ich verstanden, dass dies bedeutet, dass der Übergang zur nächsten Zeile erfolgen sollte, bevor der Vokal gedruckt wird, nicht danach, aber es könnte sich lohnen, dies so zu formulieren, dass es sofort verständlich ist - es hat eine Weile gedauert.Antworten:
Retina ,
504434(+10)3230 BytesVielen Dank an Dennis für das Speichern von 14 Bytes mithilfe der tatsächlichen Steuerzeichen.
Basierend auf dieser Antwort verwende ich ANSI-Escape-Codes, um den Terminal-Cursor vertikal zu bewegen. Das
<ESC>
sollte durch das Steuerzeichen 0x1B und<VT>
die vertikale Registerkarte ersetzt werden0x0B
. Für einfachere Tests können Sie auch ersetzen<ESC>
mit\e
,<VT>
mit\v
und die Ausgabe durch fütternprintf
.Zu Zählzwecken wird jede Zeile in einer eigenen Datei abgelegt. Der Einfachheit halber ist es jedoch einfacher, den Code in eine einzelne Datei einzufügen und Retina mit der
-s
Option aufzurufen .Die erste Ersetzung umgibt jeden Vokal
\v...#
, wobei der\v
Cursor nach unten verschoben wird und der#
eine Markierung für den zweiten Schritt ist. Dasi`
ist Retina Notation für Groß- und Kleinschreibung Matching.Der zweite Schritt entfernt dann wiederholt (
+`
) a#
aus einem Wort und setzt ae\[A
an das Ende des Wortes, wodurch der Cursor nach oben verschoben wird. Dies stoppt, sobald sich die Zeichenfolge nicht mehr ändert, dh wenn#
die Zeichenfolge keine Markierungen mehr enthält .quelle
printf
. Ersetzen Sie einfach\e
mit dem ESC-Byte (0x1b).CJam,
3936 BytesDas obige ist ein reversibler xxd-Speicherauszug, da der Quellcode die nicht druckbaren Zeichen VT (Codepunkt 0x0b) und ESC (Codepunkt 0x1b) enthält.
Wie diese Antwort werden vertikale Tabulatoren und ANSI-Escape-Sequenzen verwendet .
Dies erfordert ein unterstützendes Videotext-Terminal, das die meisten Nicht-Windows-Terminalemulatoren enthält.
Testlauf
Bevor wir den eigentlichen Code ausführen, deaktivieren wir die Eingabeaufforderung und löschen den Bildschirm.
Dadurch wird sichergestellt, dass die Ausgabe korrekt angezeigt wird.
Führen Sie Folgendes aus, um die Eingabeaufforderung wiederherzustellen:
Wie es funktioniert
Vor jedem Vokal wird ein vertikaler Tabulator eingefügt, um den Cursor nach unten zu bewegen, und nach jedem Leerzeichen werden ausreichend Kopien der Bytefolge 1b 5b 41 (
"\e[A"
) eingefügt, um den Cursor zurück in die erste Zeile zu bewegen.quelle
unset PS1save
danach.Java, 428 Bytes
Ich weiß, es ist schrecklich. Es gibt wahrscheinlich einige Zeichen, die rasiert werden können, aber ich bin zu faul, das zu tun.
quelle
int
Variablen (nämlichi
,r
,p
,o
, undx
) , wo Sie initialisierenl
undm
da sie Werte später gegeben werden. Sie können auchString v="...",a[]=...;
das Gleiche wie oben für tun und tunString u
. Das sollte deine Punktzahl ein wenig senken.x++-~-p
Perl, 31 Bytes
Das obige ist ein reversibler xxd-Speicherauszug, da der Quellcode die nicht druckbaren Zeichen VT (Codepunkt 0x0b) und ESC (Codepunkt 0x1b) enthält.
Der Code ist 27 Byte lang und erfordert die Schalter
040p
(4 Byte).Das Programm erfordert ein Videotextterminal, das vertikale Tabulatoren und ANSI-Escape-Sequenzen unterstützt , einschließlich der meisten Nicht-Windows-Terminalemulatoren.
Testlauf
Bevor wir den eigentlichen Code ausführen, deaktivieren wir die Eingabeaufforderung und löschen den Bildschirm.
Dadurch wird sichergestellt, dass die Ausgabe korrekt angezeigt wird.
Führen Sie Folgendes aus, um die Eingabeaufforderung wiederherzustellen:
Wie es funktioniert
perl -040p
Liest die Eingabe automatisch als durch Leerzeichen getrennte Token (-040
), speichert jedes Token in$_
(-p
) und führt das Programm aus.s/[aeiouy]/.$&/gi
Führt eine globale Suche$_
nach Vokalen durch , bei der die Groß- und Kleinschreibung nicht beachtet wird, und ersetzt jeden Vokal durch das Steuerzeichen VT (bewegt den Cursor nach unten), gefolgt vom Vokal selbst.s
gibt die Anzahl der durchgeführten Ersetzungen zurück,$\=".[A"x s...
speichert also mehrere Kopien der Byte-Sequenz 1b, 5b, 41 (bewegt den Cursor nach oben) in$\
einer für jeden Vokal.Am Ende des Programms druckt Perl
"$_$\"
aufgrund des-p
Wechsels automatisch .quelle
C
200 -190 BytesUngolfed:
Es ordnet einen rechteckigen Puffer (tatsächlich quadratisch) zu, füllt ihn mit Leerzeichen und Zeilenumbrüchen und durchläuft dann die angegebene Zeichenfolge. Am Ende wird ein Nullzeichen hinzugefügt, um das Nachziehen von Zeilenumbrüchen zu verhindern.
Technisch gesehen ist es keine Funktion, da es Globale enthält. Tatsächlich kann es nicht mehr als einmal aufgerufen werden (
j
undl
muss am Anfang 0 sein). Zu beachten,i,j,k,l,M;
könnte zuint i,j=0,k,l=0,M;
Beginn der Funktion verschoben werden.quelle
char*t=malloc(M*M);
->char t[M*M];
undfor(i=0;i<M*M;++i)
->for(;i<M*M;++i)
char t[M*M]
?CJam, 47
Ja, es ist ein bisschen lang, aber es "schummelt" nicht mit ANSI-Codes :)
Probieren Sie es online aus
Die Idee ist, für jedes Zeichen eine Zeilennummer zu berechnen (beginnend bei 0, inkrementell bei Vokalen und zurück zu 0 bei Leerzeichen) und dann für jede Zeile die Zeichenfolge zu wiederholen, aber die Zeichen mit einer anderen Zeilennummer durch ein Leerzeichen zu ersetzen .
quelle
K,
81727066 BytesNun, es ist ein Anfang:
Anwendungsbeispiele:
Bearbeiten 1:
Besser. Einige Verbesserungen an der Oberfläche vorgenommen:
Insbesondere habe ich die Argumente für die Vokalsuche umgekehrt
?
und damit die Notwendigkeit für ein Lambda beseitigt, die gleiche Umkehrung vorgenommen, bei der_
ich Wörter in Leerzeichen aufteilte, und mir wurde klar, dass dies~{" "?x}'x
eine wirklich alberne, überkomplizierte Art zu sagen ist" "=x
.Bearbeiten 2:
Eine weitere Optimierung auf Oberflächenebene,
s
bevor Sie sie auf das Lambda anwenden, spart Parens im Inneren:Edit 3:
OK, gehen wir bei der Berechnung des Offsets für jedes Zeichen anders vor. Anstatt die Sequenz in Leerzeichen aufzuteilen und eine laufende Summe (
+\
) der Positionen der Vokale zu berechnen , können wir die gesamte Eingabezeichenfolge in einem Durchgang bearbeiten und die laufende Summe mit 0 multiplizieren, wenn wir auf ein Leerzeichen stoßen. Ich brauche die Negation dieser Sequenz, damit ich subtrahieren kann, anstatt beim Scannen zu addieren, und beim Berechnen des Betrags der vertikalen Polsterung number-of-distinct (#?
) anstelle von max (|/
) verwenden kann.Das spart weitere 4 Zeichen. Puh!
quelle
Ruby:
135131124115112 ZeichenProbelauf:
quelle
/(?=[aeiouy ])/i
.C 192 Bytes
Dies durchläuft die Zeichenfolge und löscht die Zeichen, während sie gedruckt werden. Es wird wiederholt, bis keine Leerzeichen mehr zum Drucken vorhanden sind. Es handelt sich um portables C, bei dem keine Annahmen zur Zeichenkodierung gemacht werden.
Lesbare Version
quelle
' '
->32
undf(char*s){int l=0,r=1,v,c;
->l,r=1,v,c;f(char*s){
' '
kann sein32
, aber es hängt von der Zeichenkodierung ab, und wie gesagt, ich habe dieses portable C gemacht. Das Löschen des Explicitint
ist jedoch großartig - nicht sicher, warum ich das vergessen habe!Python 3,
265207202185177 ZeichenDas ist schrecklich und ich bin nicht stolz. Ich weiß, dass dies kürzer gemacht werden kann, aber ich dachte, ich würde trotzdem posten.
Inspiriert von der C-Version wird eine Liste erstellt, die dann beim Durchlaufen der Eingabezeichenfolge gefüllt wird.
quelle
GNU Sed, 151 + 1
(+1 wie es die
-r
Flagge braucht )Ich dachte, dass sed das Werkzeug für diesen Job sein würde, fand es aber überraschend schwierig.
Lesbare Version:
quelle
p
, es wird also nichts ausgegeben. Ein kleines Problem ist, dass die Ausgabe mit einem zusätzlichen Leerzeichen beginnt. Ein großes Problem ist, dass der erste Text, der mit Vokal beginnt, verschwindet.c
, wegen der Linie kurz zuvortx
. Ich habe eine frühere Version mit einer ähnlichen Schleife wiederhergestellt und werde es später erneut versuchen.Python 2,
145142 BytesWahrscheinlich ist es nicht so wettbewerbsfähig wie einige andere Methoden, aber ich dachte, dies wäre eine coole Art, Regex zu verwenden.
Der reguläre Ausdruck
(?!([^aeiouy ]*[aeiouy]){N}[^aeiouy]* ).
stimmt mit einem einzelnen Zeichen überein, das sich nicht in der N-ten Buchstabengruppe am Ende eines Wortes befindet. Da es vom Ende der Welt an zählt, vertausche ich die Zeichenfolge vorher und nachher und muss am Ende auch ein Leerzeichen einfügen, aber danach wird es zu einer einfachen Angelegenheitre.sub
, jede Instanz dieser Zeichen durch ein Leerzeichen zu ersetzen. Dies geschieht für jeden Wert von N, bis die Zeichenfolge leer ist.quelle
re.I
, können Sie 3 Bytes sparen, indem Sie den entsprechenden Flag-Wert ersetzen, dh2
.Oktave,
132129 ZeichenPrüfung
Eingang:
"YEAh UppErcAsE VOwEls"
Ausgabe:
quelle
Gema :
5348 ZeichenBeachten Sie, dass
^[
(x1b) und^K
(x0b) einzelne Zeichen sind. (Im folgenden Probelauf verwende ich deren Copy-Paste-freundlich\e
und\v
Entsprechungen, falls Sie es ausprobieren möchten.)Probelauf:
quelle
Jelly , 42 Bytes (nicht konkurrierend?)
Probieren Sie es online!
Warum Gelee, warum? :-(
quelle