Sie erhalten eine Reihe von ASCII-Reagenzgläsern. Ihre Aufgabe ist es, die Anzahl der verwendeten Reagenzgläser zu reduzieren.
Jedes Reagenzglas sieht folgendermaßen aus:
| |
| |
| |
|~~|
| |
| |
| |
| |
|__|
Offensichtlich ~~
ist der Wasserstand. Das Reagenzglas kann auch leer sein. In diesem Fall sind keine ~~
Zeichen enthalten. Ein einzelnes Rohr kann bis zu 8 Wasserstandseinheiten enthalten.
Sie erhalten eine begrenzte Anzahl von Reagenzgläsern mit unterschiedlichen Wasserständen. Sie müssen das Wasser in möglichst wenigen Reagenzgläsern einfüllen und das Ergebnis ausgeben.
| | | | | | | | |~~| | |
| | | | | | | | | | | |
| | |~~| | | | | | | | |
|~~| | | | | | | | | |~~|
| | | | | | | | ------> | | | |
| | | | | | | | | | | |
| | | | |~~| | | | | | |
| | | | | | | | | | | |
|__| |__| |__| |__| |__| |__|
05 + 06 + 02 + 00 ------> 08 + 05
Wie Sie sehen, sind die Reagenzgläser durch ein einzelnes Leerzeichen getrennt. Leere Röhren sollten in der Ausgabe nicht angezeigt werden. Dies ist Codegolf, also gewinnt Code mit der geringsten Anzahl von Bytes.
Testfälle: http://pastebin.com/BC0C0uii
Viel Spaß beim Golfen!
Antworten:
Pyth,
484544 BytesProbieren Sie es online aus.
Gibt in jeder Zeile ein einzelnes Leerzeichen aus.
quelle
JavaScript (ES6),
159 bis148 ByteGibt einen nachgestellten Zeilenvorschub aus. Bearbeiten: 11 Bytes mit Hilfe von @Arnauld gespeichert.
quelle
s.replace(/~~/g,(_,i)=>n+=9-i/s.indexOf`\n`|0,n=0)
sollte 4 Bytes sparen. Möglicherweise möchten Sie n stattdessen mit -1 initialisierenn>>3
und~n&7^i
ein weiteres Byte mit und speichern.-1
Idee, aber ich konnte diereplace
Idee verbessern .1/"\n"
bemerkt, dass es wahr ist.Perl, 150 Bytes
149 Byte Code +
-n
Flag.Ich werde nicht den gesamten Code erklären, nur ein paar Dinge:
$l+=9-$.for/~~/g
Zählt, wie viel Wasser sich in der Eingabe befindet.Der zweite Teil des Codes druckt die Ausgabe. Die Idee ist, so viele voll gefüllte Röhrchen wie möglich zu platzieren, und ein letztes, das das verbleibende Wasser enthält (falls vorhanden). So ist der Algorithmus , der in 4 Teilen ist: Die erste Zeile von Wasser (die Oberseite Röhrchen)
say"|~~| "x$v.($@="| | ")x$r
. Dann druckt leere Teile von Rohren , bis wir das Niveau von Wasser der letzten Röhre erreichen:say$:=$@x$%for$l%8..6
. Dann drucken Sie die Ebene , wo das letzte Rohr Wasser:say$@x$v."|~~|"x$r
. Dann drucken Sie alle verbleibenden „leer“ Ebenen:say$:for 2..$l%8;
. Und schließlich druckt die untere Zeile:say"|__| "x$%
.Die Variablennamen machen es schwer zu lesen (
$%
,$@
,$:
) , sondern ermöglicht Schlüsselwörter wiex
undfor
nach der Variablen ohne Leerzeichen zu schreiben.Um es auszuführen:
Ich bin nicht sehr zufrieden damit, wie lange diese Antwort dauert. Ich habe versucht, das Beste aus meinem Algorithmus herauszuholen, aber ein anderer Ansatz könnte wahrscheinlich kürzer sein. Ich werde versuchen, bald daran zu arbeiten.
quelle
Befunge,
144138 BytesProbieren Sie es online!
Die ersten beiden Zeilen verarbeiten die Eingabe und ignorieren im Grunde alles außer dem ersten Zeichen in jeder Röhre, das ein Level-Marker sein könnte. Wir nehmen den ASCII-Wert dieses Zeichens, dividieren durch 2 und mod 2 (geben uns 1 oder 0, je nachdem, ob wir uns auf einer Ebenenmarkierung befinden oder nicht), multiplizieren diesen mit der Zeilennummer (zählen von 8 herunter, was uns ergibt) den Pegelwert für diese Röhre) und addieren ihn zu einer laufenden Summe.
Die Ausgabe erfolgt in den zweiten beiden Zeilen, im Wesentlichen beginnend ganz rechts in der dritten Zeile. Wir berechnen zuerst die Anzahl der Röhren, indem wir den Gesamtwasserstand plus 7 geteilt durch 8 berechnen. Wenn wir dann über die Reihen aller Röhren iterieren, berechnen wir das Zeichen, das in einer bestimmten Röhre angezeigt werden soll ( t , Countdown bis 0) für a gegebene Zeile ( r , Countdown von 8 bis 0) wie folgt:
Der berechnete char_type ist -1 für die unterste Reihe (die Basis der Röhre), 0 für einen anderen Bereich, der kein Wasserstand ist, und 1 für den Wasserstand. Sie kann daher als einfache Tabellensuche für das auszugebende Zeichen verwendet werden (Sie können diese Tabelle am Anfang von Zeile 4 sehen).
quelle
Haskell, 186 Bytes
Anwendungsbeispiel:
Fügt in jede Zeile ein Leerzeichen ein. Wie es funktioniert:
Der Hauptschmerz war das Fehlen einer Funktion, die zählt, wie oft eine Teilzeichenfolge in einer Zeichenfolge vorkommt. Es ist
count
inData.Text
, aber es führt zu einer Reihe von Namenskonflikten importieren , die sind viel zu teuer zu lösen.quelle
Python, 261 Bytes
Ich habe das Gefühl, dass mir etwas fehlt. Auch wenn eine Reihe von Zeilenumbrüchen für die leere Ausgabe möglich sind, kann ich einige Bytes verlieren. Nimmt Eingaben wie
'| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n|__| |__| |__|'
.quelle
Rubin , 139 Bytes
(138 Byte Code plus ein Byte für die
-n
)Probieren Sie es online!
Ein paar Erklärungen:
Update 1: Details zu Variablen, den
gsub
Tricks und denEND{
…}
-Phase .Update 2: (± 0 Bytes insgesamt)
n||=0
anstelle vonn=n||0
(-1 Byte)-n
(+1 Byte)quelle
Python 3, 404 Bytes
Dieses Programm erstellt die vollständige beabsichtigte Ausgabe mit den Wasserständen sowohl im ASCII- als auch im Zahlenformat.
quelle