Ziel: Schreiben Sie ein Programm oder eine Funktion, die eine Eingabezeichenfolge in einer sinusförmigen Form ausgibt.
Die ASCII-Sinuskurve
Hier ist eine Periode der Sinusform:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
Beachten Sie, dass sich auf jeder Spalte genau ein Punkt befindet.
- Jedes Zeichen in der Eingabezeichenfolge ersetzt einen Punkt in der obigen Form von links nach rechts.
- Leerzeichen in der Eingabe müssen wie normale Zeichen anstelle eines Punkts ausgegeben werden.
- Das Startzeichen entspricht dem Punkt ganz links in der obigen Abbildung.
- Dies ist nur eine Periode, Eingaben können länger als die Anzahl der obigen Punkte sein.
Eingang
- Eingaben sind ASCII-Zeichenfolgen, die nur Zeichen zwischen ASCII-Dezimalstelle 32 (Leerzeichen) und ASCII-Dezimalstelle 126 (Tilde ~) enthalten.
- Eingänge bestehen immer nur aus einer Zeile (keine Zeilenumbrüche).
- Eingaben können über STDIN, Funktionsparameter, Befehlszeilenargumente oder ähnliches erfolgen.
Ausgabe
- Die Ausgabe muss genau wie in den angegebenen Testfällen gedruckt werden.
- Nachgestellte Leerzeichen in Zeilen sind zulässig, solange die Länge der Zeile mit diesen nachgestellten Leerzeichen die Länge der längsten Zeile (die mit dem letzten Zeichen) nicht überschreitet.
- Keine führende / nachfolgende Linie erlaubt.
Testfälle
- Eingang:
.................................................
Ausgabe:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
- Eingang:
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.
Ausgabe:
ng Puzz ion and siasts stratio
mmi les est an thu and egi n r
ra & qu sw en c r eq
g e o o u
o C a r e d n i
r o l e r
P d s s z , e
e i i z g e d
t u o e .
G e e p l r
ol ng f g fe f
f S cha or min rs. 00%
tack Ex program It's 1
- Eingang:
Short text.
Ausgabe:
t.
tex
t
r
o
h
S
- Eingang:
The quick brown fox jumps over the lazy dog
Ausgabe:
brown
ick fox
qu j
u
e m
h p
T s
o
v
er
th dog
e lazy
Wertung
Das ist Code-Golf , also gewinnt das kürzeste Programm oder die kürzeste Funktion in Bytes.
sin
Funktion zu verwenden, um sie zu reproduzieren, aber die Positionen sind etwasAntworten:
Pyth, 59 Bytes (57 Zeichen)
Demonstration.
Darin ist eine binäre Nachschlagetabelle codiert , die den Wert 3912 hat. Diese wird in eine binäre Nachschlagetabelle konvertiert[1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]
. Dies wird als der Unterschied zwischen aufeinanderfolgenden Höhen behandelt. Durch Voranstellen einer 6, Bilden aller Präfixe und Zuordnen jeder zu ihrer Summe wird das erste Viertel der Welle erzeugt.sM._+6jC\2
wird[6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]
wie oben beschrieben ausgewertet . Dann verkettet sich der Code auf der Rückseite dieser Zeichenfolge, um die erste Hälfte der Welle zu bilden, und subtrahiert sie dann von 12, um die gesamte Welle zu ergeben.Dann bilden wir Zeilen für jedes Eingabezeichen, gefolgt von 12 Leerzeichen. Diese Linie wird um den dieser Position entsprechenden Wellenhöhenparameter nach rechts gedreht, und dann werden die Linien auf neuen Linien transponiert und verbunden.
Dann entfernen wir führende und nachfolgende Leerzeilen. Führende oder nachfolgende Leerzeilen, die Leerzeichen enthalten, können jedoch nicht entfernt werden. Dies wird implementiert, indem Leerzeichen in der Eingabe durch Tabulatoren (
C9
) ersetzt werden, die nicht in der Eingabe enthalten sind, leere Zeilen entfernt und die Tabulatoren wieder in Leerzeichen umgewandelt werden.quelle
Python 2, 156 Bytes
Erläuterung
Der gesamte Code erstellt einfach einen Block mit Leerzeichen (
o
) und ersetzt die richtigen Leerzeichen durch die Buchstaben der Eingabet
.Die Variable
l
speichert eine Liste von Offsets von oben. Damit dasn
th Zeichen vont
online sein solltel[n]
.Das Bytearray
o
dient als veränderbare Zeichenfolge, da Zeichenfolgen in Python unveränderlich sind.-~h
ist das gleiche wieh+1
aber spart Platz, da ich keine Klammern brauche.quelle
Java,
219209199 BytesIch bin hier noch ein Neuling und hoffe, dass es den Regeln entspricht, eine Unterfunktion einzuführen (wenn die Bytes dieser Funktion natürlich gezählt werden). Wenn nicht, werde ich versuchen, die
sin
Funktion in eine clevere Array-Suche umzuwandeln ...quelle
char[]
. Hier wäre es loszuwerden, die bekommen()
auflength
und eliminierencharAt()
auch. Wenn ich es richtig bin lesen, können Sie auch verwenden ,print()
anstattprintln()
ein paar mehr zu retten....a<24?s(24-a):-s(a-24);
und nennen Sie es mits(c%48)
.Perl, 222 Bytes
Requires
-E
forsay
speichert die Positionen als Ganzzahlen, die in Binärzahlen umgewandelt werden, und das Umkehren des Arrays ist in Bezug auf die Bytes wahrscheinlich nicht sehr effizient. Ich bin mir auch sicher, dass es viel zu sparen gibt, also werde ich weiter stochern und stupsen.Beispielausgabe:
quelle
JavaScript,
251243224220217Wirklich einfache Implementierung: Es wird eine Zeichenfolge verwendet, um die y-Position jedes Zeichens auf der Welle darzustellen (versetzt um
a
, was ASCII-Code 97 ist). Anschließend werden alle möglichen Zeilen durchlaufen. Wenn der y-Wert der aktuellen Zeile mit der y-Position auf der Welle übereinstimmt, wird ein Zeichen aus der Zeichenfolge geschrieben. Es gibt auch eine Bereinigung am Ende, um die Zeile zu entfernen, wenn sich herausstellt, dass sie vollständig leer ist.Beachten Sie, dass die Ausgabe im
alert()
Fenster wackelig erscheint, wenn keine monospaced Schriftart verwendet wird. Sie können diese in ändern,console.log()
um sicherzustellen, dass die Ausgabe korrekt ist.EDIT1:
++
und--
existieren.EDIT2: Das Entfernen von Leerzeilen erfolgt jetzt in derselben Schleife wie der Rest und spart 17 Zeichen. Benötigte diese Klammern auch nicht, für zusätzliche 2 Zeichen.
EDIT3: Es ist nicht erforderlich, die Wellenform als Variable zu deklarieren und 4 Zeichen zu speichern.
EDIT4: Wie Dom Hastings in den Kommentaren hervorhob, enthielt die Byteanzahl den Zeilenumbruch sowie das Zeilenumbruchzeichen und aktualisierte die Byteanzahl für alle Überarbeitungen, um den Zeilenumbruch auszuschließen.
EDIT5: 3 Bytes mit freundlicher Genehmigung von Dom Hastings gespeichert. Ich habe das
o.splice
Update nicht implementiert, da hierdurch die Leerzeilen nicht entfernt werden können (zumindest an meinem Ende).quelle
if(o[i++].trim().length<1)o.splice(--i,1)
mito.splice(i-(t=!o[i++].match(/\s/)),t)
, für -4,s=prompt() o=[]
mit :,s=prompt(o=[])
-1 undfor(y=0,i=0;y<13;++y){o[i]=""
mitfor(y=i=0;y<13;++y){o[i]=""
, -2. Es ist wahrscheinlich möglich, Ihre for-Schleifen auch zu kombinieren, um mehr zu sparen. Als letztes ist zu erwähnen, dass ich nur 220 für Ihre aktuelle Byteanzahl habe, sodass Ihre 225 möglicherweise Fenster sind,\r\n
anstatt nur von\n
denen ich annehme, dass Sie sie ignorieren können (Bitte korrigieren Sie mich, wenn ich falschfor(s=prompt(),y=0;y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
for(s=prompt(y=0);y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97-y?" ":s[x]
Matlab,
133, 130 BytesDer eine Liner:
Und die erweiterte Version:
Der eine Liner nimmt Eingaben von der Konsole (
stdin
) entgegen und ist 130 Byte groß. Die erweiterte Version ersetzt die Konsoleneingabe durch eine Funktionsdefinition (+1 Byte), ist jedoch für den Testfall in einer Schleife wesentlich komfortabler zu verwenden:Beschreibung:
Der Zeilenindex jedes Zeichens wird für eine halbe Periode berechnet, dann gespiegelt und verkettet, um eine volle Periode zu erhalten.
Wir erstellen einen leeren Hintergrund aus Whitespace-Zeichen (dieselbe Länge wie die Eingabezeichenfolge. Wir platzieren jedes Zeichen entsprechend seiner Position in der entsprechenden Zeile. Wenn die Eingabezeichenfolge länger als eine Periode ist,
mod
bricht der (Modulo) -Operator das um, damit wir nicht ' Beim Anfordern der Zeilennummer kommt man nicht aus der Schranke.Testfall:
Speichern Sie die Funktionsversion unter
textsine.m
in Ihrem Pfad und führen Sie dann Folgendes aus:wird ausgeben:
Wenn Sie die One-Liner-Version mit Eingabe von testen möchten
stdin
, muss Ihre Eingabe als eine einzige eingegeben werdenstring
, sodass Sie Ihre Eingabe zwischen'
Zeichen einschließen müssen . Beispiel:Danke,
Luis Mendo
dass du 3 Bytes gespart hast ;-)quelle
s=input('');
weiterhin funktioniert.Scala 377 Zeichen
erster Schnitt. wahrscheinlich eine bessere Formel erhalten übersetzen
x
zuy
quelle
Common Lisp, 205 Bytes
Tests
Siehe http://pastebin.com/raw.php?i=zZ520FTU
Bemerkungen
Drucken Sie die Ausgabe zeilenweise aus. Berechnen Sie dabei die Indizes in den Zeichenfolgen, die mit der Sinusumkehrfunktion gedruckt werden sollen
asin
. Die Ausgaben stimmen nicht genau mit den erwarteten Eingaben in der Frage überein, aber da OP bestätigt, dass die Beispielausgaben nicht wirklich sinusförmig sind, denke ich, dass dies in Ordnung ist. Zumindest wird für jede Spalte immer nur ein Zeichen geschrieben.quelle
Python 2, 172 Bytes
Dies ist nicht so gut wie die Antwort von Alex L. , aber es ist ziemlich nah. Übernimmt die Eingabe von der Standardeingabe und funktioniert am besten in einer
.py
Datei.Ich habe beschlossen, die Ausgabe transponiert (jede Spalte ist eine Zeile) und dann das Ergebnis zu transponieren, da in Python die Transponierung einer Matrix ist
map(*m)
.l
: Die binäre Darstellung von9960000
(nach dem Abhacken des"0b"
vonbin
) ist100101111111101001000000
. Dies ist der "Schritt" der Sinuswelle jeder Spalte, beginnend mit dem allerletzten Zeichen des tiefsten Punkts. Ich kopiere diese Liste, negiere jede Zahl und setze sie an das Ende ihrer selbst, um eine Ableitung der Funktion zu bilden.s
: Dies ist die Variable, die festhält, in welcher Zeile (Spalte in der Transponierung) das nächste Zeichen eingefügt wird.o
: Ausgabe beenden, transponierti
: Verfolgt die Sinuswellenperiode. Beginnt bei 9, dal
leicht verschoben.In der
for
Schleife erstelle ich eine Liste mit 13 Leerzeichen (ich habe Bytearrays verwendet, aber die Liste der Zeichen enthält eine kürzere print-Anweisung) und ersetze dann dass
th-Zeichen durch das Eingabezeichen. Anfügenb
an das Endeo
, fügen Sie den entsprechenden Schritt zus
und Inkrementi
.Ich hatte gehofft, dass die
print
Aussage so einfach sein würde\n'.join(*zip(o))
, aber kein solches Glück.zip(*o+['\n'*13])[::-1]
Hängt eine Spalte mit Zeilenumbrüchen an, kehrt das Ganze um und transponiert es (ohne Umkehrung ist die Sinuswelle verkehrt herum),sum(...,())
verkettet die Tupel zu einem Tupel von Zeichen und dann''.join(...)
verkettet die Zeichen und druckt es aus.Andere Dinge, die ich versuchte, waren, ein 12-stelliges Array von Leerzeichen zu erstellen, das neue Zeichen an der entsprechenden Stelle einzufügen und durch
l+=[-c for c in l];
eine Art Mathematik mit einer Art Multiplikation1
und-1
mit dem Ergebnis der Indizierung zu ersetzenl
, aber nichts, worauf ich kommen konnte mit am Ende kürzer zu sein.quelle
Mathematica, 131 Bytes
Das sind 131 Zeichen, einschließlich der drei für
i=foo;
. Das schien ein vernünftiger Weg zu sein, um den Input aufzunehmen. Ich hätte es direkt in die Definition von einfügen könnenc
einfügen und ein paar Striche sparen können, aber das fühlt sich unfair an.Es ist ziemlich einfach - fast sogar lesbar. Es teilt die Zeichenfolge in eine Liste von Zeichen auf und fügt diese Zeichen dann an den von bestimmten Positionen in ein spärliches Array ein
Table
(für jede Stelle im Array, der kein Zeichen zugewiesen wurde, wird standardmäßig ein Leerzeichen verwendet). Die Leitungen werden separat zusammengesetzt und dann mit neuen Leitungen dazwischen bestreut. Das finale StringJoin fügt alles zusammen.NB: Wie bei einigen anderen Lösungen ist dies möglicherweise nicht wirklich gültig, da es eher eine echte Sinusform als das (schöne) handgefertigte Beispiel ergibt.
Tests:
quelle