Diese Herausforderung wurde auf dem DailyProgrammer-Subreddit veröffentlicht, und ich dachte, es wäre ein großartiger Kandidat für eine Code-Golf-Herausforderung. Das Bestimmen, ob ein Buchstabe ausgeglichen ist, basiert auf seiner Entfernung vom Gleichgewichtspunkt und dem Wert des Buchstabens. Der Wert eines Buchstabens kann bestimmt werden, indem entweder seine Position im Alphabet mit einem Index angegeben wird oder indem 64 von seinem ASCII-Wert subtrahiert wird. Darüber hinaus wird der Wert eines Buchstabens mit seinem Abstand vom Gleichgewichtspunkt multipliziert. Schauen wir uns ein Beispiel an STEAD
:
STEAD -> 19, 20, 5, 1, 4 ASCII values
This balances at T, and I'll show you why!
S T EAD -> 1*19 = 1*5 + 2*1 + 3*4
Each set of letters on either side sums to the same value, so
T is the anchor.
Es ist jedoch zu beachten, dass nicht alle Wörter ausgewogen sind. Beispielsweise WRONG
stimmt das Wort in keiner Konfiguration überein. Wörter müssen sich auch in einem Buchstaben befinden, nicht in zwei Buchstaben. Zum Beispiel SAAS
würde balancieren, wenn es einen Buchstaben in der Mitte der beiden A
s gäbe, aber da es keinen gibt, wird es nicht balanciert.
Die Aufgabe
Sie sollten ein Programm oder eine Funktion erstellen , die ein Wort in Großbuchstaben als Eingabe- oder Funktionsargumente verwendet und anschließend eine von zwei Ausgaben erzeugt:
Wenn das Wort ausgeglichen ist, sollte das Wort mit der linken Seite, einem Leerzeichen, dem Ankerbuchstaben, einem weiteren Leerzeichen und der rechten Seite gedruckt werden.
function (STEAD) -> S T EAD
Wenn das Wort nicht ausgeglichen ist, sollten Sie das Wort ausdrucken, gefolgt von
DOES NOT BALANCE
function (WRONG) -> WRONG DOES NOT BALANCE
Sie können davon ausgehen, dass alle Eingaben in Großbuchstaben erfolgen und es nur Buchstaben gibt.
Beispiel I / O
function (CONSUBSTANTIATION) -> CONSUBST A NTIATION
function (WRONGHEADED) -> WRO N GHEADED
function (UNINTELLIGIBILITY) -> UNINTELL I GIBILITY
function (SUPERGLUE) -> SUPERGLUE DOES NOT BALANCE
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
function (A)
->A
statt -> `A`?BALANCE DOES NOT BALANCE
Antworten:
Pyth, 49 Bytes
Demonstration.
Erläuterung:
quelle
Pure Bash (keine Coreutils oder andere Dienstprogramme), 125
Standardschwerpunktberechnung unter Verwendung von Momenten über den Ursprung:
Testausgang:
quelle
Python 3, 124
Dieser Code testet keine potenziellen Drehpunkte, sondern findet den "Schwerpunkt" und prüft, ob es sich um eine Ganzzahl handelt. Dies geschieht durch Summieren der Gesamtmasse
a
und der positionsgewichteten Masseb
, um den Massenmittelpunkt zu findenm=b/a
. Anschließend wird entweder die an der Position geteilte Zeichenfolgem
oder das"DOES NOT BALANCE"
vom[_::2]
List-Slicing-Trick ausgewählte Zeichenfolge-Plus gedruckt .quelle
CJam, 57 Bytes
Hier kann noch ein bisschen golfen werden.
Probieren Sie es hier online aus
quelle
'@fm
ist kürzer als64f-:i
.JavaScript (ES6),
211200160 ByteVorheriger Versuch, 200 Bytes
Vielen Dank an edc56 und nderscore, die mir dabei geholfen haben, Golf zu spielen
Demo
Firefox und Edge erstmal, da es sich um ES6 handelt
quelle
j=0
innerhalb des Anrufs zucharCodeAt
:)C
236198192188180173 BytesErweitert mit main ():
Nachprüfung:
quelle
i,l=1,j;g(char*v){for(;v[i]&&l;++i)for(j=l=0;v[j];++j)l+=(i-j)*(v[j]-64);l?printf("%s DOES NOT BALANCE",v):printf("%.*s %c %s",--i,v,v[i],v+i+1);}
Hinweis: verwendet undefiniertes Verhalten :)CJam, 50 Bytes
Bei Verwendung des Java-Interpreters wird dies mit einem Fehler an STDERR für nicht ausgleichende Wörter beendet.
Wenn Sie den Code im CJam-Interpreter ausprobieren , ignorieren Sie einfach alles außer der letzten Ausgabezeile.
Idee
Meine "ursprüngliche Idee" entpuppte sich als derselbe Ansatz, den @xnor mehrere Stunden vor mir gepostet hatte. Trotzdem geht es hier los:
Ausgehend von einer Liste von Werten (v 0 ,… v n ) ist v_t genau dann der Anker der Liste, wenn eine der folgenden äquivalenten Bedingungen zutrifft:
tv 0 +… + 1v t-1 == 1v t + 1 +… tv n
(0 - t) v 0 +… + (n - t) v n == 0
0v 0 +… + nv n == t (v 0 +… + v n )
t: = (0v 0 +… + nv n ) / (v 0 +… + v n ) ist eine ganze Zahl.
Code
An dieser Stelle haben wir ein bisschen Spaß mit überlasteten Operatoren.
Für den Quotienten passiert folgendes:
Für die Zeichenfolge geschieht Folgendes:
Zu diesem Zeitpunkt tritt ein Laufzeitfehler auf, da
""
kein letztes Zeichen vorhanden ist. Der Stapel wird gedruckt und die Ausführung wird sofort abgebrochen.quelle
Julia, 122 Bytes
Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge als Eingabe akzeptiert und eine Zeichenfolge zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=s->...
.Wir behandeln das Wort wie ein eindimensionales System, für das wir den Schwerpunkt finden müssen. Der Massenschwerpunkt wird als Punktprodukt der Massen mit ihren Positionen berechnet, dividiert durch die Gesamtmasse des Systems. Wenn das berechnete Zentrum eine Ganzzahl ist, entspricht es einem der Buchstaben im Wort. Sonst gleicht das Wort nicht aus.
Ungolfed + Erklärung:
Beispiele:
quelle
PHP,
249174 BytesNimmt ein Befehlszeilenargument an.
Anfangsversuch:
quelle
Haskell,
161.135BytesAnwendungsbeispiel:
So funktioniert es:
f
Ruft die Hilfsfunktion auf!
, die an einer bestimmten Position zwei Parameter, den linken und den rechten Teil des Wortes, übernimmt. Es stoppt, wenn beide Teile das gleiche Gewicht haben (Funktionv
) oder ruft sich rekursiv auf, wobei der erste Buchstabe des rechten Teils nach links verschoben wird. Es endet mit derDOES NOT BALANCE
Meldung, wenn der rechte Teil leer ist.quelle
C
183134 BytesNeue Version erklärt:
Wie bei den beiden anderen Einträgen wird eine konstante Addition auf der einen Seite und eine Subtraktion auf der anderen Seite verwendet, um hoffentlich Null zu erreichen, was die Anzeige des Gleichgewichts ist. Meine ursprüngliche Ausgabe wird von der ersten Antwort an wiederverwendet, wenn auch leicht modifiziert.
Alte Version erklärt:
Die erste Schleife (h) ist der Hauptiterator für die Länge des Strings. Die zweite Schleife (i) akkumuliert (b) bis h == i. Sobald dies geschieht, wird (b) in (a) gespeichert, auf 0 zurückgesetzt und dann fortgesetzt, bis das Ende der Zeichenkette erreicht ist, wo (a) mit (b) verglichen wird. Wenn eine Übereinstimmung vorliegt, wird die Schleife des Hauptiterators unterbrochen und die Ausgabe gedruckt.
quelle
Ruby 175
Testen Sie es online: http://ideone.com/G403Fv
Dies ist eine ziemlich einfache Ruby-Implementierung. Hier ist das lesbare Programm:
quelle
R, 190 Bytes
Als unbenannte Funktion. Ich glaube, ich kann noch ein paar besorgen, aber das muss warten.
Ungolfed ein bisschen mit kurzer Erklärung
Es wird kein Zeilenumbruch am Ende eingefügt.
Testlauf
quelle
C 142 Bytes
Dank an einen Benutzer , der mich geschlagen hat :)
quelle
Java, 240 Byte
quelle