Warum ein Simulator?
Kinder haben heutzutage weder die Zeit noch den Ehrgeiz, Kisten auf der Wippe zu stapeln oder mit balancierenden Gegenständen herumzuspielen. Dies lässt auf dem Softwaremarkt viel Platz für einen Hebel-Simulator, der sich nach meinen Modellen wie verrückt verkaufen wird!
Programmierhilfe gesucht
Ich habe ein Patent für ein solches Spiel angemeldet (anhängig), benötige aber einen erfahrenen Programmierer, um die Spielelogik für mich zu schreiben. Nach meinem Verständnis ist es üblich, Programmierer basierend auf der Größe des endgültigen Programms in Bytes zu kompensieren . Als solches werde ich diesen lukrativen Auftrag an den niedrigsten Bieter vergeben.
Spezifikation
Ein Hebel ist eine Reihe von Kisten oder leeren Räumen, die durch einen Drehpunkt ausgeglichen werden. Jede Box hat ein bestimmtes Gewicht von eins bis neun und Leerzeichen haben kein Gewicht. Wie Sie wissen, ist das Gewicht einer Box auf dem Hebel direkt proportional zum Abstand dieser Box vom Drehpunkt. Eine Gewichtskiste 4
, die sich auf dem dritten Raum vom Drehpunkt befindet, trägt 12
wirksame Krafteinheiten zu dieser Seite des Hebels bei.
Ich brauche ein Programm, das bei gegebenem Eingabehebel ausgibt, ob der Hebel nach links, rechts oder perfekt ausbalanciert ist.
I / O-Richtlinien
- Du wirst für mich ein Programm schreiben.
- Die Eingabe enthält eine Textzeile.
- Die Eingabe kommt von
stdin
oder als eine Befehlszeilenzeichenfolge. - Boxen werden durch die Zeichen '
1
' bis '9
' dargestellt. Diese Zeichen repräsentieren ihre jeweiligen Gewichte. Ein leerer Raum wird durch ein Leerzeichen '' dargestellt. Der Drehpunkt wird durch ein Caret '
^
' dargestellt.
Ein Beispieleingabehebel könnte folgendermaßen aussehen: 8 2^ 941
Dieser Hebel ist perfekt ausbalanciert: (4*8) + 0 + 0 + (1*2) == 0 + (2*9) + (3*4) + (4*1) == 34
- Es gibt keine führenden oder nachfolgenden Leerzeichen. Es wird keine nachgestellte Newline geben.
- Es ist nicht erforderlich, fehlerhafte Eingaben zu verarbeiten. Die Eingabe hat immer genau einen Drehpunkt und nur Zahlen und Leerzeichen.
- Der Ausgang zeigt an, ob der Hebel links schwer, rechts schwer oder ausgeglichen ist.
- Ihr Programm muss genau 3 mögliche Ausgaben haben, die sich aus einer wohlgeformten Eingabe ergeben könnten. Sie können wählen, was diese sind.
- Die Ausgabe muss entweder auf
stdout
den Rückgabecode des Programms oder auf den Rückgabecode des Programms lauten.
Testfälle
Hier verwende ich L
, R
, B
bedeuten links schweren rechten schwer, ausgewogen:
Eingabe:
11 ^9
Ausgabe:B
Eingabe:
321^ 12
Ausgabe:L
Eingabe:
9^ 1
Ausgabe:R
(Wenn jemand "kniffligere" Testfälle hat, können Sie diese gerne bearbeiten.)
Literaturverzeichnis
Nicht unbedingt inspiriert, aber mit Balance verbunden, eine Reihe von Gewichten auf einer Wippe
quelle
The output must either be print to stdout or be the return code of the program.
Nun, jetzt fordern Sie mich auf, eine Linux-Distribution zu erstellen, die die Wippe-Notation für Exit-Codes verwendet.^16
,16^
oder^
? (Angenommen, es kann)Antworten:
Python 2, 69 Bytes
Der Modul
ord(c)%16
extrahiert den Wert eines Ziffernzeichens, während der Abstand 0 ergibt. Für jedes Zeichen wird sein Drehmomentbeitrag als sein Gewicht multipliziert mit dem vorzeichenbehafteten Abstand zum Drehpunkt berechnet.i-s.find('^')
Diese werden summiert und mit 0 verglichen-1,0,1
. Der Charakter^
wird mit einem Gewicht von 14 berechnet, aber das spielt keine Rolle, da er sich auf dem Drehpunkt befindet.Ein 18-Byte-Pyth-Port von Maltysen:
Wenn für den Python-Code ein vollständiges Programm erforderlich ist, finden Sie hier 79 Bytes. Die Idee ist, den Index
i
verschoben zu startens.find('^')
und herunterzählen zu lassen.quelle
Javascript ES6, 62 Bytes
-1
wenn links ist schwerer0
wenn ausgeglichen1
wenn rechts schwerer istUngolfed:
Testläufe (Zuweisen anonymer Funktionen an
f
):R B L
nach geändert-1 0 1
e.split``
in[...e]
(danke @ Vɪʜᴀɴ)~~'^'
zu0
... ausgewertet )quelle
f=
und sagen können, dass es eine anonyme Funktion erzeugt. (-2 Bytes FYI)Japt , 22 Bytes
Japt ist eine verkürzte Version von Ja vaScri pt . Dolmetscher
Gibt
-1
fürL
,0
fürB
und1
für zurückR
.Wie es funktioniert
quelle
APL,
3930 BytesNach dem erneuten Lesen der Regeln habe ich dies geändert und
-1
0
1
stattdessenL
B
R
neun Bytes gespart.Probieren Sie es hier aus .
quelle
Pyth, 20 Bytes
Testsuite
-1
für links vorgespannt,0
für ausgeglichen,1
für rechts vorgespannt.Wie es funktioniert:
quelle
Haskell,
116968276 BytesDie Ausgabe ist
0
für ausgeglichene,-1
für linkslastige und1
für rechtslastige.Anwendungsbeispiel:
f "321^ 12"
->-1
So funktioniert es: Finde das Teil vor dem
^
. Multiplizieren Sie die Eingabezeichenfolge und die Liste der Gewichte, die bei beginnt- length-of-first-part
. Der^
hat eine Gewichtung von 0 und addiert sich nicht zur Summe. Ich verwende @ xnors Mod 16-Trick , um Ziffern / Leerzeichen in ganzzahlige Werte umzuwandeln. Wenn die Summe negativ (positiv) ist, ist der Hebel linksschwer (rechtsschwer) und ausgeglichen, wenn die Summe 0 ist.quelle
TeaScript , 23 Bytes
25Ich habe versucht, eine Pyth-Antwort zu schreiben, aber das ist schrecklich gelaufen: \
Das
²
sieht so unangebracht aus, spart aber 1 Byte, also werde ich es behalten.Probieren Sie es online!
Testen Sie alle Fälle
Für das von mir gewählte Ausgabeschema:
-1
wenn links schwerer ist als rechts (L
)0
wenn links so schwer ist wie rechts (B
)1
ist links ist weniger schwer als rechts (R
)Ungolfed && Erklärung
Dabei werden Karten und Reduzierungen verwendet, um die Arbeit zu erledigen.
quelle
pb ,
349329 BytesDas war eine knifflige Sache. pb war nicht dafür gedacht, in so etwas gut zu sein.
Es gibt nicht einmal eine Multiplikation .Aber hey, es funktioniert.Der schwierigste Teil war, nachdem die Summe (Gewicht * Abstand) für jede Seite ermittelt worden war, tatsächlich zu bestimmen, welcher Brief gedruckt werden sollte. pb hat keine
>
oder<
Operatoren, nur==
und!=
. Es ist nicht einfach zu erkennen, welcher Wert größer ist. Ich kann nicht einmal subtrahieren und mit 0 vergleichen ... es sei denn, ich mache etwas wirklich Dummes.Dann gehen Sie einfach zu X = (linke Seite - rechte Seite) und es gibt Ihre Antwort! Löschen Sie alles in dieser Zeile, um zu bereinigen, und drucken Sie dann den Wert, der bei (0, 0) gefunden wurde.
... Aber es gibt einen etwas kürzeren Weg. Verwenden Sie statt 'L', 'B' und 'R' diese Werte - 'B' und fügen Sie beim Drucken wieder 'B' hinzu. Auf diese Weise müssen Sie niemals 'B' bei X = 0 platzieren, sondern belassen es einfach als die 0, die es bereits war. Das einzige Problem ist, dass das Programm im Watch-Modus sehr doof wird, wenn Sie dies tun.
'L'-'B'==76-66==10=='\n'
. Alles scheint in Ordnung zu sein, bis plötzlich eine große Anzahl von Zeilenumbrüchen gedruckt wird und es unmöglich ist, den Überblick zu behalten: D Im regulären Ausführungsmodus von pbi funktioniert jedoch alles in Ordnung, da die Zeilenumbrüche gelöscht werden, bevor etwas auf die Seite gedruckt wird Konsole.quelle
Perl 5, 72 Bytes
quelle
MATLAB 91, 57, 55Oktave, 50 BytesIch hatte nicht damit gerechnet, weiter Golf zu spielen, aber durch den Wechsel zu Octave konnten 5 zusätzliche Bytes eingespart werden! Wow, das hat einige Zeit gedauert ...
Es gibt
-Inf, NaN, Inf
fürL, B, R
jeweils.Testsuite!
Erläuterung:
Dies ist definitiv ein schwer lesbarer Code, aber ich werde versuchen, ihn so gut wie möglich zu erklären. Ich werde zwischen Codeblock-Erklärung und Text wechseln.
Schauen wir uns an, was in den Klammern vor sich geht:
Dieser ist ein bisschen knifflig:
Die Zahlen auf jeder Seite der Leiter müssen mit dem Abstand zum Caret multipliziert werden. Wenn wir auf der linken Seite negative Zahlen und auf der rechten Seite positive Zahlen verwenden, können wir den Vektor einfach summieren, um zu sehen, welche Seite am schwersten ist.
Angenommen , die Eingabezeichenfolge ist:
'321^ 12'
. Wir wollen die folgende:3*(-3)+2*(-2)+1*(-1)+1*3+2*4
. Der Vektor, den wir in den Klammern erstellt haben, beginnt bei1-i
, in diesem Fall-3
, da sich das Caret in der 4. Position befindet. Es geht bisnnz(x)-i
in Schritten von eins. Wir könnennnz(x)
statt verwendennumel(s)
, weilx
es sich um eine Zeichenfolge handelt, die keine Nullen enthält.Deshalb:
Nun können wir elementweise multiplizieren
s.*[...]
und die Summe daraus ziehen. Da wir aber zwei Vektoren haben, können wir auch die Summe mit der Matrixmultiplikations
transponieren[...]
und berechnen:Dies ergibt entweder eine negative Zahl, was bedeutet, dass die linke Seite schwerer ist, eine Null, was bedeutet, dass sie ausgeglichen ist, oder eine positive Zahl, was bedeutet, dass die rechte Seite schwerer ist. Anstatt den naiven Ansatz von zu verwenden
sign(...)
, multiplizieren wir ihn mitinf
, was uns entweder für links-Inf
oderInf
für rechts ergibt. Wir bekommenNaN
dafür0*inf
, da es undefiniert ist.Dies gibt uns drei unterschiedliche Werte für die drei möglichen Ergebnisse.
quelle
𝔼𝕊𝕄𝕚𝕟 22 Zeichen / 38 Bytes
Try it here (Firefox only).
quelle
JavaScript, 146 Bytes
Ziemlich massiv.
Demo .
quelle
function t(s){
könntet=>{
undsplit('^')
könnte werdensplit`^`
Ruby,
111108 BytesErläuterung
Summiert den gewichteten Wert jeder Zahl auf jeder Seite. Dann verwendet es den Ruby-Raumschiff-Operator, um eine Gleichheit / Ungleichheit von 1,0, -1 der beiden Seiten bereitzustellen, was der Index eines Arrays mit der richtigen Ausgabe ist.
quelle
PowerShell,
83-73ByteVielen Dank an TessellatingHeckler für den Golf.
Verwendet im Wesentlichen den gleichen Algorithmus wie den folgenden älteren Code, aber hier werden die Zeichen in der Eingabezeichenfolge einzeln durchlaufen, anstatt den Index zu durchlaufen, wodurch eine Handvoll Bytes gespart werden. Wirft immer noch die gleiche spektakuläre Fehlermeldung, wenn der Algorithmus erreicht
^
- wirkt sich nicht auf STDOUT aus.Bisherige
Verwendet den gleichen hervorragenden Algorithmus wie Dendrobiums ausgezeichnete Antwort und verwendet daher die gleiche Ausgabe wie
-1 / 0 / 1
bei der Eingabeleft-heavy / balanced / right-heavy
.Pfui. Lange wegen eines Casting
MarotteMerkmal , dass Powershell hat. Am relevantesten ist hier diechar
Multiplikation mitint
Funktionen. Einen Array-Index einesstring
Ergebnisses in einchar
Objekt aufnehmen. PowerShell konvertiert denchar
Wert vor der Multiplikation in den entsprechenden ASCII-Wert (und nicht in den Literalwert). So etwas$a='012'[0];[int]$a*2
führt zu96
.Das heißt, wir müssen es wieder als Zeichenfolge umwandeln. Wenn wir es jedoch einfach
string
malint
machen , werden wir es so oftstring
wiederholen. Zum Beispiel$a='0';$a*2
würde ergeben00
.Dies bedeutet, dass wir den
char
Rücken alsstring
vor dem erneuten Wirken werfen müssen, daint
dann eine Multiplikation stattfinden kann, bevor wir ihn in unseren Akkumulator hinzufügen$x
.Kombinieren Sie dies mit der langen Iterationszeit durch einen String und dem .NET-Aufruf zur Ausgabe des Zeichens, und Sie erhalten einen ziemlich langen Code.
NB - Dies wird einen spektakulären Fehler auslösen, wenn es
^
in die Zeichenkette gelangt und besagt, dass es nicht in eine konvertiert werden kannint
. Beeinflusst STDOUT nicht.quelle
param($b)$i=-$b.indexOf('^');[char[]]$b|%{$x+=$i++*+"$_"};[math]::Sign($x)
bei 74 Bytes. Dies dauerte lange und es wurden mehrere Anlaufversuche unternommen. math :: sign sieht so lang aus, aber ich sehe keinen Weg, um dieses Bit zu verbessern.$i++*+"$_"
entspricht$i++*"$_"
if$i
is a int.CJam, 29 Bytes
Probieren Sie es online aus
Das Ergebnis ist
-1
für linkslastig,0
für ausgeglichen,1
für rechtslastig.Das schien ein bisschen lang zu sein, aber ich habe eine Reihe von Alternativen ausprobiert, und alle endeten zwischen 29 und 33 Bytes. Ein Problem ist, dass ich keine Möglichkeit gefunden habe, die Zeichenfolge in Werte zu konvertieren, die automatisch zu 0 für die Leerzeichen führen würden. Also habe ich explizit die Leerzeichen durch '0 Zeichen ersetzt, was natürlich die Länge des Codes erhöht.
Alternativen ausprobiert:
ee
Operators zum Hinzufügen des Index zur Werteliste.Erläuterung:
quelle
Python 3,
196114 BytesNormaler Code:
Erläuterung:
stdin
.Vielen Dank an @ThomasKwa für das Reduzieren von 82 Bytes (mehr als 40%)!
quelle
print('LBR'[(B>D)-(B<D)])
für das Ende undB=D=0
am Anfang.^
. Das erspart dir dasabs()
auch.C,
140139138134100 BytesRückkehr:
Lauf:
Wie wir ASCII haben:
Wir bekommen:
Dann summiere nach Faktor Abstand zu
^
.quelle
SpecBAS - 140 Bytes
t
Wenn es sich um eine laufende Summe handelt, sind die Werte negativ, wenn die Zeichenposition größer als die Karatposition ist. Am Ende wird angezeigt, ob total negativ, null oder positiv ist, und es wird das entsprechende Zeichen von R, B oder L ausgegeben.Ich könnte ein paar Bytes weg rasieren, indem ich einfach -1, 0 oder 1 wie einige der anderen Antworten ausgebe.
quelle
Java, 83 Bytes
quelle