Überblick
Finden Sie bei einer 3-zeiligen Zeichenfolge heraus, ob die Struktur nach links fällt, ausgeglichen ist oder nach rechts fällt.
Eingabestruktur
Sie können sich die Struktur als Metallstange vorstellen, auf der alles auf einer vertikalen Stange balanciert ist.
1 7 4 a
===============
|
Die erste Zeile enthält die Artikel. Das Gewicht jedes Gegenstands wird als ASCII-Wert des Zeichens minus 32 berechnet. (Zeichen unter 32 werden nicht berücksichtigt und Leerzeichen wiegen 0). Denken Sie daran, dass die Kraft eines Gegenstands auf die Stange das Gewicht multipliziert mit dem Abstand zum Drehpunkt ist.
Die zweite Linie ist die Stange. Jede Stangenlänge wiegt 1 Stück für sich. Diese Zeile ist ausschließlich Gleichheitszeichen ( =
).
Die dritte Linie ist der Drehpunkt. Dies kann an einer beliebigen Stelle platziert werden und wird durch eine Reihe von Leerzeichen gefolgt von einem einzelnen pipe ( |
) -Zeichen dargestellt.
Beispiele
Eingang:
===== |
Ausgabe: Balance
Eingang:
===== |
Ausgang: Fällt nach links
Eingang:
% ===== |
Output: Balance (Weil es %
genug wiegt, um dem Gewicht der linken Seite der Stange entgegenzuwirken)
Eingang:
aa ======= |
Ausgang: Fällt nach rechts (da der a
rechte weiter vom Drehpunkt entfernt ist)
Eingang:
1 7 4 A
===============
|
Ausgang: Fällt nach links
Eingang:
1 7 4 a
===============
|
Ausgabe: Fällt nach rechts (Kleinbuchstaben sind schwer!)
Eingang:
$ ~
===============
|
Ausgabe: Balance
Anmerkungen
- Nachgestellte Leerzeichen sind zulässig, führende Leerzeichen nicht.
- Ihr Programm kann in jedem gewünschten Format ausgegeben werden, solange es 3 verschiedene Ausgaben für Links, Balance und Rechts gibt.
- Ihr Programm muss das als Eingabe angezeigte Format akzeptieren.
Antworten:
JavaScript (ES6),
116111108106 Bytes-5 Bytes durch Summieren über
eval(array.join`+`)
anstelle vonarray.reduce()
.Standardmäßig -3 Byte
1
anstelle von32 - 31
, sodass Klammern entfernt werden können.-2 Bytes, da Drehpunkt die Länge der letzten Zeile ist - 1
Ausgänge
-1
,0
oder1
, für links, symmetrisch oder rechts. Endete ähnlich wie Chas Browns Python-Antwort , also geht die Ehre dahin.Kann 4 Bytes einsparen, wenn die erste Zeile mit der Länge des Stabes aufgefüllt wird
(31-t.charCodeAt(i))*(b.length+~i)
.Testschnipsel
Schließt zusätzliche Ausgabe (
Left
/Balanced
/Right
) zusammen mit der Zahl ein.Eine weitere 106-Byte-Methode
Anstatt
join
ein Array auf+
s zu setzen, erstellen wir eine Folge von Zahlen, denen jeweils ein Präfix vorangestellt ist+
. Die Führung+
wird ignoriert.quelle
(b.length+~i)
könnte helfen, ein Byte zu retten. (Auch ich verstehe nicht, warum Sie die haben||1
.)b.length+~i
gibt das Negativ von zurücki-b.length+1
; das könnte helfen, wenn ich den anderen Teil negieren könnte. Das lag daran||1
, dass ich davon ausging, dass die erste Zeile nicht gepolstert war, um der Länge der Stange zu entsprechen, und daher über das Ende der ersten Zeile hinaust.charCodeAt(i)
zurückkehren würdeNaN
.Python 2 ,
112110 BytesProbieren Sie es online!
EDIT: Endlich geschafft, die
enumerate
undrjust
für eine dürftige 2 Bytes zu beseitigen ... meh!Nimmt eine Schnur auf; Ausgänge -1,0 bzw. 1 für Linksabgleich bzw. Rechtsabgleich.
Erster Durchlauf bei 112 Bytes war:
quelle
(ord(c)-31)
Es dauerte eine Weile, bis mir klar wurde, dass dies tatsächlich das Gewicht der Stange selbst zusammen mit den Gegenständen beinhaltet. Sehr schlau!return
mitprint
für -1 Byte (obwohl es nicht wirklich gut mit dem aktuellen TIO Code spielen wird).Haskell,
212171 Bytes (188, wenn Eingabe als eine Zeichenfolge übernommen wird)171-Byte-Variante
Variante mit 188 Bytes
Erläuterung
quelle
fromEnum
anstelle von die verwendenord
und fallen lassenimport
.c
kann zuc p=max(ord p-32)0
(oder mitfromEnum
) vereinfacht werden, und da Sie es nur einmal verwenden, fügen Sie es ein.c
kann noch weiter vereinfacht werden (Zeichen unter 32 werden nicht berücksichtigt)c p=ord p-32
. Auchp
ist im Grundelength
(minus 1),p x=length x-1
würde also auch funktionieren (und Sie können es auch inline). Schauen Sie sich auch meine Lösung an, wie ich sie verwendesignum
- Sie könnten tun,r o l s = signum $ 2 * z ...
was0,1,-1
für B, L, R gilt.[3,4,7]
und 3 Strings anstelle von einem benötigt. (siehelines
).Gelee , 30 Bytes
Test Suite
Ausgänge 0 für symmetrisch, 1 für rechts und -1 für links.
Wie es funktioniert
quelle
Gelee , 24 Bytes
Probieren Sie es online!
-1
zum nach links fallen,0
zum ausbalancieren,1
zum nach rechts fallen (volles programm).[-1]
zum nach links fallen,[0]
zum ausbalancieren,[1]
zum nach rechts fallen (Funktion).Die erste Zeile muss ein Leerzeichen enthalten, die letzte Zeile darf kein Leerzeichen enthalten.
Erklärung (wir beginnen mit dem Endergebnis):
Zuallererst arbeiten wir mit einzelnen Zeilen, also müssen wir sie irgendwie bekommen. Das ist ein Job für
Ỵ
. Dann müssen wir die\n
-split-Version der Eingabe so behandeln, als wäre es die ursprüngliche Eingabe, also verwenden wirµ
eine monadische Kette, die auf den aktuellen Wert angewendet wird.Jetzt fangen wir an, richtig zu arbeiten, und unsere erste Aufgabe wäre es, die Faktoren der Gewichte zu berechnen. Im Wesentlichen ist dies ein Bereich [Abstand von links nach rechts nach rechts nach rechts]. Zunächst müssen wir den 1-basierten Index des Pivots ermitteln, der im Wesentlichen die Länge der letzten Zeile ohne nachfolgende Leerzeichen ist. Also ziehen wir die letzte Zeile (Pivot-Linie) aus unserer ursprünglichen Liste mit
Ṫ
, da wir sie nicht mehr brauchen, und nehmen dann ihre Länge mitL
. Wir müssen dann die Länge der Stange nehmen, für die wir dasselbe mit der jetzt letzten Linie (Stangenlinie) machenṪL$
. Um die Reichweite zu ermitteln, kartieren wir | x - y | auf [1. Stablänge], wobei x der Pivot-Index ist und y istist jedes Element der Liste, auf die wir abbilden. Wir tun dies mitạЀ
, wobei |ạ
berechnet wird x - y | und macht einen Bereich von 1 bis einschließlich der Stablänge. Jetzt haben wir den Bereich, den wir wollen.Ѐ
Danach müssen wir jede ganze Zahl, die ein Stück des Stabes darstellt, mit dem entsprechenden Gewicht multiplizieren. Um die Gewichte zu berechnen, gehen wir
Ç
zur obersten Zeile unseres Codes. Wir nehmen die restliche Linie mitṪ
, seine Zeichencodes mitO
, und dann berechnen wir x - 31 mit_31
, x jeweils charCode zu sein. Wir weisen dann Gewicht 1 (0 + Stabstück = 1),!
Gewicht 2 (1 + 1) usw. ein Leerzeichen zu . Wir sind mit der obersten Zeile fertig undÇ
würden nun die Liste der Gewichte zurückgeben, die wir mit der entsprechenden multiplizieren ganze Zahlen, die die Stabstücke mit darstellen×
.Danach teilen wir uns mit
ṣ0
dem Pivotpunkt, der durch eine 0 dargestellt wird (da sich jedes Gewicht dort nicht auf das Ergebnis auswirkt), was zu einer Liste der Form führt [[1. Gewicht, 2. Gewicht ... Gewicht kurz vor dem Pivot] , [Gewicht kurz nach dem Drehpunkt, Gewicht nach dem vor ... letztes Gewicht]]. Diese Listen repräsentieren die Seiten der Stange, links und rechts. Wir addieren nun jede der Listen mitS€
, um die Gesamtgewichte auf jeder Seite zu erhalten, und verwendenI
, um das Delta zu nehmen, das negativ ist, wenn die linke Seite schwerer ist, null, wenn sie gleichgewichtet sind, und positiv, wenn die rechte Seite schwerer ist . Um das Endresultat mit diesem zu unserem Vorteil zurückzugeben, nehmen wir das Zeichen mitṠ
.quelle
APL (Dyalog) , 43 Byte *
Probieren Sie es online!
⊆⊢
Teilen Sie das Argument in eine Reihe von Zeichen auf⎕TC[2]∘≠
unterscheidet sich von der 2 nd T erminal C ontrol Zeichen (Zeilenvorschub) **{
...}
die folgende anonyme Funktion auf der Liste von Strings gelten:⊃⌽⍵
in der ersten Zeichenfolge der umgekehrten Liste (dh der letzten)'|'⍳⍨
Finden Sie den ɩ ndex des Drehpunkts(
…)-
Das von folgender Liste abziehen:⊃⍵
die erste Saite≢
seine Länge⍳
all die Vorteile davon(
…)+.×
Gewichtete Summe mit diesen Gewichten und den folgenden Werten:⊃⍵
die erste Saite⎕UCS
Codepunkte in der U niversal C HARACTER S et¯31+
negative einunddreißig hinzufügen (32 für den erforderlichen Versatz minus eins für die Stange)×
Zeichen dafür* Verwenden Sie für 1 Byte pro Zeichen
{×(¯31+⎕UCS↑⍵)+.×(⍳≢↑⍵)-'|'⍳⍨↑⌽⍵}⎕TC[3]∘≠⊂⊢
mit⎕ML←3
. Probieren Sie es online!**
⎕TC
ist veraltet und wird hier nur zu Golfzwecken verwendet. Im Produktionscode sollte man verwenden⎕UCS 10
.quelle
Haskell (Lambdabot), 142 Bytes
Probieren Sie es online!
Ungolfed-Version:
quelle
Python 2 , 90 Bytes
Erwartet, dass Eingabezeilen (mit Leerzeichen) auf die richtige Länge aufgefüllt werden. Ausgänge
-1
für Stürze links ,0
für ausgeglichen und1
für Stürze rechts .Probieren Sie es online!
94 Bytes
Für +4 Bytes können wir eine Version haben, die unter Verwendung einer
while
Schleife gestrippte Zeilen anstelle von aufgefüllten Zeilen benötigt:Probieren Sie es online!
quelle
Ruby, 543 Bytes
quelle
C (gcc) , 106
107121123124129131BytesGeben Sie 0 zurück, um nach links zu fallen, 1, um das Gleichgewicht zu halten, und 2, um nach rechts zu fallen.
Alle drei Zeilen müssen dieselbe Länge haben und mit enden
\n
, um die Länge der Zeichenfolge zu bestimmen.Probieren Sie es online!
quelle
Mathematica, 91
92BytesDie erste Leine sollte mit der Stange gleich lang sein. Die dritte Zeile sollte keine nachgestellten Leerzeichen enthalten.
Return -1, 0, 1 für links fallen, Balance und rechts fallen.
quelle
C # (.NET Core) ,
1279590 + 18 = 108 ByteFür diese Funktion muss die erste Zeile rechts mit Leerzeichen aufgefüllt werden, damit sie die gleiche Länge wie die Stange hat, und die dritte Zeile darf keine Test-Leerzeichen enthalten. Diese Bedingungen sind erlaubt (siehe Kommentare der Frage).
Probieren Sie es online!
Ausgänge:
-1 für die linke Spitze
0 für die Balance
für Spitze rechts 1
quelle
Python 3, 217 Bytes
Funktioniert auch in Python 2.7
Gibt 1 für die linke Seite, -1 für die rechte Seite oder Null zurück, wenn ausgeglichen.
Lesbare Version:
quelle
sum([...])
, Sie können einfach habensum(...)
i[c:].find(e)
kann seini.find(e,c)
, die Verwendungi,m,n=s.split('\n')
und die Notwendigkeit zu vermeiden ,s
überhaupt, Verwendungreturn 2*(r>l) or l>r
dramatisch Testkosten am Ende (Rückgabewert numerisch äquivalent ist, aber es ist zu reduzierenTrue
statt1
undFalse
statt0
), oder wirklich, verwenden Sie einen anderen Satz von Rückkehr Werte und tunreturn (l>r)-(r>l)
, um die 1, 0 oder -1 wie die altecmp
Funktion zurückzugeben.i[c:]
weil der kürzere Weg ein seltsames Problem bei der Eingabe von Eckpunkten verursachte (platzieren Sie eine|
genau in der Mitte - über der Leiste).PHP, 105 Bytes
druckt
-1
/0
/1
für links / balance / rechts. Laufen Sie als Pipe mit-nR
oder probieren Sie es online aus .Nervenzusammenbruch
quelle
Kohle , 31 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Ausgang 0 für Balance oder -1 oder 1 für Links- oder Rechtsabfall. Bearbeiten: Änderungen in Charcoal bedeuten jetzt, dass
≔ΣEθ×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
für 24 Bytes funktioniert: Probieren Sie es online! Link ist eine ausführliche Version des Codes. Hinweis: Beide Antworten erfordern eine gepolsterte Eingabe, können jedoch so angepasst werden, dass ungepolsterte Eingaben zu einem Preis von 3 Byte akzeptiert werden:≔⁰ξFLη≔⁺ξ×⁻ι⌕ζ|⁻℅§◨θLηι³¹ξI⁻›ξ⁰‹ξ⁰
Probieren Sie es online aus!≔ΣE◨θLη×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
Probieren Sie es online! Links führen zur ausführlichen Version des Codes.quelle