Wenn Sie jemals versucht haben, einem wirklich dichten Plot Beschriftungen hinzuzufügen, werden Sie feststellen, dass sich Beschriftungen manchmal überlappen und daher schwer lesbar sind. Wir werden etwas Ähnliches machen, aber in 1D.
Die Eingabe ist eine Folge von (label, x-coordinate)
Paaren, und die Ausgabe ist das Ergebnis des Zeichnens der einzelnen Punkte und Beschriftungen in der angegebenen Reihenfolge. Ein Sternchen, *
das den Punkt darstellt, sollte an der angegebenen x-Koordinate platziert werden und die Beschriftung sollte folgen. Eventuell vorhandene Zeichen werden überschrieben.
Zum Beispiel, wenn die Eingabe war
Hello 0
World 8
Fizz 3
Buzz 5
PPCG 16
X 9
Dann würde folgendes passieren:
*Hello
*Hello *World
*He*Fizz*World
*He*F*Buzzorld
*He*F*Buzzorld *PPCG
*He*F*Buz*Xrld *PPCG
Die letzte Zeile sollte dann ausgegeben werden.
I / O-Regeln
Die Eingabe kann aus beliebig vielen Paaren bestehen. Jedes Etikett besteht nur aus Groß- und Kleinbuchstaben, und die Etikettenlänge beträgt höchstens 127 Zeichen. Jede x-Koordinate liegt zwischen 0 und 127 einschließlich.
Die Eingabe kann in einem beliebigen geeigneten Listen- oder Zeichenfolgeformat erfolgen, sodass die Paare eindeutig sind und sich die Bezeichnungen / x-Koordinaten in der Eingabe abwechseln. Zum Beispiel ist ein Format wie
[("Hello", 0), ("World", 8) ...]
oder[0 "Hello" 8 "World" ...]
in Ordnung. Es ist jedoch nicht zulässig, zwei separate Listen mit Beschriftungen und x-Koordinaten zu verwenden.Funktionen und Vollprogramme sind beide in Ordnung.
Alle Stellen, die nicht durch ein Etikett abgedeckt sind, sollten mit einem Leerzeichen dargestellt werden. Abgesehen von einer einzelnen optionalen abschließenden Newline darf es jedoch keine zusätzlichen führenden oder abschließenden Whitespaces geben.
Beispiele
Eingang:
OneLabel 10
Ausgabe:
*OneLabel
Eingang:
Heathrow 0
Edinburgh 2
London 4
Liverpool 6
Oxford 8
Ausgabe:
*H*E*L*L*Oxfordl
Eingang:
alpha 20
beta 4
gamma 57
delta 3
epsilon 22
zeta 32
eta 53
theta 27
Ausgabe:
*delta *a*epsi*thetazeta *eta*gamma
Eingang:
abc 5
d 5
abc 10
ABCDEFGHIJKLMNOPQRSTUVWXYZ 127
Ausgabe:
*dbc *abc *ABCDEFGHIJKLMNOPQRSTUVWXYZ
Beachten Sie, dass Beschriftungen und / oder x-Koordinaten wiederholt werden können.
Antworten:
CJam,
242319 BytesDies liest die Eingabe als ein CJam-Array von Koordinaten-Label-Paaren.
Probieren Sie diese Geige im CJam-Interpreter aus oder überprüfen Sie alle Testfälle auf einmal.
Vielen Dank an @ MartinBüttner, der mir geholfen hat, 4 Bytes zu sparen!
Wie es funktioniert
quelle
Pyth, 20 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung
quelle
JavaScript ES6, 104 Byte
Beispielanwendung
Eingabe in eine kompatible Konsole:
Ausgabe der letzten Anweisung:
Erläuterung
Dadurch wird eine anonyme Funktion aus
c
drei Ausdrücken erstellt, die logisch UND-verknüpft wurden. Die ersten beiden Aussagen sind immer wahr, und die JS-Kurzschlussregeln besagen, dass immer dann, wenn die erste wahr ist, der gesamte Wert auf der rechten Seite zurückgegeben wird (ohne auf boolesch zu zwingen): Dies ist also formal äquivalent zuDie erste Anweisung muss oben in Klammern gesetzt werden, da der Zuweisungsoperator
=
eine niedrigere Priorität als der logische AND-Operator hat&&
.Die Assembly "rest parameter"
..."*"+v
ist ebenfalls Teil von ES6. Es verkettet einen Verweis*
auf die Zeichenfolge und interpretiert ihn dann als einen listenähnlichen Parameter. Dabei wird er in eine Reihe von Argumenten aufgeteilt, die zur Verfügung gestellt werden. DabeiArray.prototype.splice
wird das(m, n, ...rest)
Array an der Position übernommen und geändertm
, umn
Elemente zu entfernen und anschließend allerest
Argumente einzufügen . Um dies vor ES6 zu erreichen, würden Sie das umständlichere verwenden:Das Array wird dann mit der leeren Zeichenfolge verkettet und das nachfolgende Leerzeichen wird gelöscht.
quelle
Python 2, 67 Bytes
Nimmt Eingaben wie
[('Heathrow', 0), ('Edinburgh', 2), ('London', 4), ('Liverpool', 6), ('Oxford', 8)]
und druckt das Ergebnis.In Python können Zeichenfolgen nicht geändert werden, und das Konvertieren in und aus einer Liste ist teuer. Dadurch wird die Zeichenfolge neu erstellt
z
, um ein neues Wort hinzuzufügen. Wir nehmen dieb
Zeichen vor dem Wort, füllen sie bei Bedarf mit Leerzeichen auf, dann den neuen Text mit einem Stern und den Teilz
nach dem neuen Wort. Beachten Sie, dass nachgestellte Leerzeichen niemals hinzugefügt werden.Die
reduce
Version ist 3 Zeichen länger (70):quelle
Ruby,
948175 BytesGolf gespielt:
Hier ist der ungolfed Code:
Vielen Dank an @ w0lf für die Vorschläge zur Zuordnung der Eingabe!
Vielen Dank an @ w0lf und @Not that Charles für den Gedanken, eine Variable zu entfernen.
quelle
puts
mit$><<
(was nicht den zusätzlichen Platz benötigt)..chomp
kann entfernt werden..to_i
wird. Guter Gedanke. Danke @ w0lf!s[int, int]
Formular zu verwenden,s[range]
um 1 Zeichen zu sparen.Javascript 121 Zeichen
Funktioniert mit Firefox, wenn keine Standardfunktionen verwendet werden.
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.trimRight()
Ältere Version:
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.replace(/ +$/,"")
quelle
/ +/
Sinnvoller als\s
enttäuscht habe ich das verpasst! Könnten Sie Bytes sparen, indem Sie das verwendenx=' '.repeat(255);
und vermeiden.join
?.split('')
sie in eine veränderbare Datenstruktur einfügen , aber an diesem PunktArray(255).fill(' ')
ist sie kürzer. In meiner Version resultieren die meisten Einsparungen aus (a) der Verwendung der Regel "Sie können entweder eine Funktion oder ein Programm angeben ", dieeval(prompt())
im Austausch für gelöscht werden soll ,c=>
und (b) der Verwendung der eingebautenArray.prototype.slice
Methode mit einem Rest-Parameter, um den Logikteil ein wenig zu verkürzen .[].map.call(s[0],
rettet auch keine ...Python, 85 Bytes
Probieren Sie es online aus
quelle
'z'[2::5]
(Backticks anstelle von Apostrophen), anstatt''.join(z)
ein Byte zu speichern, undz=[' ']*256
wenn Sie zu den Parametern wechseln , sollte ein anderes Byte gespeichert werden . Auch ich denke , man kann ändernreturn
zuprint
.p=input()
(Python 2) schreiben und nicht mit einer Funktion, die Einrückungen vermeidet. Auchb+len(a)+1
kannb-~len(a)
for a,b in input():
.Perl, 66 Bytes
63 Bytes Skript + 3 Bytes für
-p
Nichts Besonderes, die Variablen verwendet
$`
und$'
welche sind ‚vor dem Spiel‘ und ‚nach dem Spiel‘ jeweils statt Spaltung des String. Ich habe$}
für die String-Variable a verwendet, da sie mir ursprünglich ein Byte erspart hat, aber nicht mehr!Beispiellauf:
Perl, 65 Bytes
62 Bytes Skript + 3 Bytes für
-p
Eine andere Version, die jede Zeile druckt (für ein Byte weniger!). (Ja, ich habe das gemacht, weil ich die Frage nicht richtig gelesen habe ...)
Beispiellauf:
quelle
PHP - 84 Bytes
Verwendet ANSI-Escape-Codes, um den Cursor zu positionieren (
\x1b[XG
mit dem Escape-Zeichen und X als 1-basierter Koordinate), gefolgt von*
der Eingabezeichenfolge für diese Zeile. Akzeptiert Eingaben in der Befehlszeile des Formulars:Akzeptiert Mehrworteinträge in Anführungszeichen, da sie Befehlszeilenargumente sind.
quelle
C ++ 11, 95 Bytes
Warum nicht?
Empfangen Sie als eine Funktion Eingabe als ein
map<int, string>
Namev
, der die Position und die Zeichenfolge enthält.Verwendung
Überprüfen Sie es hier ausgeführt
quelle