Balanceakt
Eine Wippe (angeblich aus dem Französischen 'ci-ça', was 'das-das' bedeutet) bildet zusammen mit der ebenfalls allgegenwärtigen Rutsche und Schaukel ein Drittel der heiligen Dreiheit der Spielgeräte. Eine Wippe ist dann und nur dann perfekt im Gleichgewicht, wenn die Summe der Momente auf jeder Seite gleich ist. Eine Wippe kann daher ausgeglichen werden, indem der Seite mit der unteren Momentensumme eine bestimmte Gewichtsmenge hinzugefügt wird; Dies zu erreichen ist Ihr Ziel für diese Herausforderung.
Herausforderung
Ihre Herausforderung besteht darin, eine Darstellung einer Wippe als Eingabe zu nehmen und sie erneut auszugeben, wobei das Gewicht an einem Ende der Wippe zum Ausgleich hinzugefügt wird.
Eingang
Ihr Programm muss in einem angemessenen Format eine ASCII-Wippe wie die folgende haben:
100 100
-------------------
^
Die erste Zeile enthält zwei Zahlen, die jeweils die Gewichte auf der Wippe darstellen. Auf jeder Seite befindet sich genau ein Gewicht, das jeweils ganz am Ende der Dielenseite angreift. Gewichte sind garantiert ganze Zahlen und stimmen immer mit dem entsprechenden Ende der Diele überein. Diese Zahlen überschneiden sich niemals mit dem Drehpunkt ( ^
).
Die zweite Linie repräsentiert das "Brett" der Wippe. Jeder Bindestrich ( -
) steht für die gleiche Länge wie jeder andere Bindestrich, mit Ausnahme des Bindestrichs direkt über dem Drehpunkt ( ^
), der keine Länge hat.
Die dritte Linie repräsentiert den Drehpunkt der Wippe. Dieser Drehpunkt wird durch das einzige Zeichen markiert, das in dieser Zeile kein Leerzeichen ist, sondern ein Zirkumflex ('^'). Der Drehpunkt kann an einer beliebigen Stelle entlang der Länge der Diele in einer gültigen Eingabe positioniert werden, solange genügend Platz vorhanden ist, damit die Zahlen, die die Gewichte darstellen, den Drehpunkt weder in der Eingabe noch in der Ausgabe überlappen.
Die Eingabe hat garantiert drei Zeilen und darf vor oder nach den Zeichen, aus denen die Wippe besteht, keine Leerzeichen enthalten (mit Ausnahme der dritten Zeile, für die dies erforderlich ist).
Ausgabe
Für die Ausgabe sollte dieselbe Wippe-Darstellung auf Standard gedruckt werden, wobei jedoch eines (und nur eines) der Gewichte durch ein größeres Gewicht ersetzt wird, um die Wippe auszugleichen. Eingaben machen dies garantiert nur mit ganzen Zahlen möglich. Daher müssen Gewichte ohne Dezimalstellen oder ähnliche Bezeichnungen angegeben werden. Wenn Ihre Sprache nicht stdout verwendet, sollten Sie bei der Ausgabe nach Community- / Metakonsens vorgehen. Nachgestellte Zeilenumbrüche sind in Ordnung, andere Änderungen am Darstellungsformat sind jedoch wahrscheinlich nicht in Ordnung.
Veranschaulichung
Testeingänge und entsprechende Ausgänge
Eingang 1
12 22
--------------------
^
Ausgang 1
12 26
--------------------
^
Eingang 2
42 42
-----------
^
Ausgang 2
42 42
-----------
^
Eingang 3
3 16
----------------
^
Ausgang 3
14 16
----------------
^
Eingang 4
1 56
-------------------
^
Ausgang 4
196 56
-------------------
^
Referenzimplementierung - Python 3
# Takes a list of strings as input
def balance_seesaw(lines):
weights = [int(w.strip()) for w in lines[0].split()]
length = len(lines[1])
pivot = lines[2].find("^")
left_length = pivot
right_length = length - 1 - pivot
left_torque = weights[0] * left_length
right_torque = weights[1] * right_length
if left_torque > right_torque:
weights[1] = left_torque // right_length
elif right_torque > left_torque:
weights[0] = right_torque // left_length
weights = [str(w) for w in weights]
string_gap = " " * (length - sum(len(w) for w in weights))
lines[0] = weights[0] + string_gap + weights[1]
print("\n".join(lines))
balance_seesaw(["1 56",
"-------------------",
" ^ "])
Regeln
Dies ist Code-Golf , so dass der kürzeste Code-Gewinn in Bytes gezählt wird. Überprüfen Sie das Meta, wenn das Zählen von Bytes in Ihrer Sprache umständlich ist.
Es gelten Standardregeln / Regelungslücken.
Die Eingabe muss in einem angemessenen Format erfolgen. Eine nicht erschöpfende Liste geeigneter Formate wird wie folgt angegeben:
- Eine einzelne Zeichenfolge mit durch Zeilenumbrüche getrennten Zeilen
- Eine Liste von Zeichenfolgen, wobei jede Zeichenfolge eine Zeile darstellt
- Ein 2D-Array oder eine Matrix von Zeichen
Verwandte Herausforderungen
- Gewichte auf einer Wippe ausbalancieren - Vorgeschlagen im August 2015 von samgak
Antworten:
05AB1E ,
605150494745 BytesDank Emigna 10 Byte und dank Adnan 1 Byte gespart.
Alle Eingabezeilen müssen die gleiche Anzahl von Zeichen enthalten.
Probieren Sie es online!
Es sollte eine Faustregel geben: "Wenn Ihr 05AB1E-Code länger als 40 Byte ist, machen Sie es wahrscheinlich falsch." Es scheint so golffähig, jede Idee ist willkommen!
quelle
¬s¤s\‚
kann seinõK
.kD²g->(‚
kann sein,¡€g
wenn Sie die fehlenden Leerzeichen in der unteren Reihe des Testfalls31SÍ
mit1®‚
:)/ ï
mit÷
. Ersetzen ?JavaScript (ES6), 136
Funktioniert wahrscheinlich nicht in Chrome, da es destrukturierte Zuweisungen und Standardparameter verwendet.Beachten Sie, dass die Standard-JS-Ausgabemethode
alert
aufgrund der verwendeten proportionalen Schriftart für die Aufgabe besonders ungeeignet ist.Weniger golfen
Prüfung
quelle
Perl, 149 + 2 = 151 Zeichen
Erfordert Befehlszeilenoptionen
-p0
(dies führt zu einer 2-Byte-Strafe auf die 149 Byte im Programm selbst).Erläuterung:
-p0
Switch liest den gesamten Eingang bis zum ersten NUL-Byte oder EOF. Dieses Problem lässt keine NULs zu, daher erhalten wir standardmäßig die gesamte Eingabe in der Variablen$_
, die für reguläre Ausdrücke usw. verwendet wird..+?
) analysieren können, aber ich kann es nicht unter 3 Zeichen bringen, also kann ich auch das Offensichtliche verwenden\d+
. Die zweite Zahl steht am Ende der Zeile und kann als.+
(2 Zeichen) analysiert werden . Die Mittellinie bestimmt, wie breit die Skalen sind. Es wird analysiert als-+
(viele andere Darstellungen würden funktionieren). Die Leerzeichen vor dem Caret in der letzten Zeile sind+
. Sobald das Caret (oder in der Tat ein Nicht-Leerzeichen) erscheint, ignorieren wir den Rest der Eingabe.$1
,$2
,$3
,$4
. Wenn Sie einen regulären Ausdruck als Argument angeben, wirdmap
zusätzlich ein Array dieser Gruppen als Array für die Zuordnung verwendet. Wir nehmen deshalb ihre Längen; Dies ist ein bequemer Weg , um die Längen zu speichern ,$3
und$4
ohne schreibenlength
zweimal. Wir überschreiben auch$_
mit der Länge von$1
; wir kümmern uns nicht wirklich um den Wert davon (die Anzahl der Ziffern in der linken Eingabe ist irgendwie nutzlos), aber die Tatsache, dass es kurz ist ($_
die Länge ist jetzt die Anzahl der Ziffern in der Anzahl der Ziffern in der erstes Gewicht, das im Vergleich zur Breite der Waage unbedingt sehr klein ist).$r
in das die Skalen unterteilt sind.$1*$r>$2
prüft, welche Seite schwerer ist. Wir speichern die neuen Gewichte in$x
und$y
; Diese haben sehr einfache Berechnungen, sobald das Gewichtsverhältnis bekannt ist.$x
,$,
und$y
in$_
, um die oberste Zeile zu erzeugen , und fügen dann weiterhin Leerzeichen hinzu ($"
enthält standardmäßig ein einzelnes Leerzeichen und ist kürzer als ein Literal-Leerzeichen' '
),$,
bis es die gleiche Länge wie die mittlere Zeile hat (dh Länge hat$c
). (Wählte ich die Variable ,$,
da es eine ist integrierte Variable , die sicher in diesem Zusammenhang geändert werden kann und startet standardmäßig leer) . Wielength
auf arbeitet$_
standardmäßig wir brauchen es nicht explizit ein Argument zu geben. Ich habe eine Yoda-Bedingung verwendet, da für das korrekte Parsen eine deutlich weniger eindeutige Syntax erforderlich ist.$\
) neu, um den Rest des Skalensatzes zu enthalten (der derselbe wie in der Eingabe ist, sodass ich den Großteil einfach$3
und$4
direkt verwenden kann). Beachten Sie, dass dies bedeutet, dass in der dritten Zeile kein nachgestelltes Leerzeichen steht. das Hinzufügen würde das Programm etwas länger machen und scheint keinen Zweck zu erfüllen, also habe ich es weggelassen.-p
löst der Schalter erneut aus; Dieses Mal wird$_
gefolgt von einer "newline" ($\
) ausgegeben . Da ich den Zeilenvorschub für die Ausgabe neu definiert habe, erzeugen diese beiden impliziten Ausdrucke den neuen Skalensatz zwischen ihnen (obwohl es als Nebeneffekt keinen Zeilenvorschub für die Ausgabe gibt).-p
Switch versucht nun erneut, die Eingabe zu lesen, aber wir haben bereits die gesamte Datei verschluckt, sodass EOF gelesen und das Programm beendet wird.quelle
PHP,
212209205 Byteswahrscheinlich golfen
Übernimmt Eingaben vom Kommandozeilenargument; Flucht vor Zeilenumbrüchen. Laufen Sie mit
-r
.Das Ersetzen durch einen Platzhalter funktionierte nicht wie erwartet. Also musste ich der ersten Regex mehr Parens hinzufügen.
quelle
Befunge,
223217 BytesProbieren Sie es online!
quelle
>
meiner Meinung nach nur aus ästhetischen Gründen gelassen. Das heißt, ich habe anscheinend eine 215-Byte-Lösung in meinen Notizen, so dass es möglich sein könnte (es gibt auch Fehler, die erklären, warum ich sie nie eingereicht habe - ich habe jetzt keine Zeit, sie zu testen).Python 2
184183 BytesAuf jeden Fall golfen
Ziemlich einfach. Nehmen Sie einfach die angepassten Gewichte zum Anpassen beider Seiten, sehen Sie, welche größer als das Original sind, und ändern Sie diese und geben Sie sie aus.
EDIT Multiplikation und Division umgeschaltet, da Integer-Division nicht sinnvoll ist (danke an @JonathanAllan, der dies bemerkt hat)
EDIT -1 Byte geändert
i().index('^')
ini().find('^')
(danke an @JonathanAllan [nochmal!])quelle
a=[w[1]*R/I,w[0]*I/R]
(ein einfaches Beispiel, das nicht funktionieren würde, wäre a1
und2
withI
undR
both3
). Derzeit 194 übrigens nicht 184, da die Zeilenumbrüche jeweils als Byte zählen, sondernj
undk
kosten mehr Bytes als sie speichern.I=i().find('^')
__repr__
Backticks und die Kurzform von Backticks verwenden, um die letzte Zeile zu machenprint`w[0]`+' '*(W-len(`w`)+4)+`w[1]`+'\n'+'-'*W+'\n'+' '*I+'^'
und zu 182 zu gelangen - repl.it/EW8fC ++ 14, 482 Bytes
lesbarere Version:
quelle
Python 3,
235230 Bytes (minimierte Referenz)Ich habe die Referenz nur minimiert, da ich mit Code-Golfen noch nicht viel anfangen kann.
Sie verwenden es genauso wie im Beispiel, aber die Funktion ist
s
stattbalance_seesaw
.quelle
w[o>p]=[o//k,p//t][o>p]
. Außerdem können die meisten Zeilen verbunden werden, um zusätzliche Leerzeichen zu entfernen.