To wyzwanie zostało opublikowane na subreddicie DailyProgrammer i pomyślałem, że będzie to świetny kandydat do wyzwania golfowego. Ustalenie, czy saldo litery odbywa się na podstawie odległości od punktu równowagi i wartości litery. Wartość litery można ustalić, przyjmując jej jedną indeksowaną pozycję w alfabecie, lub odejmując 64 od jej wartości ASCII. Ponadto wartość litery mnoży się przez jej odległość od punktu równowagi. Spójrzmy na przykład 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.
Należy jednak zauważyć, że nie wszystkie słowa równoważą się. Na przykład słowo WRONG
nie balansuje w żadnej konfiguracji. Ponadto słowa muszą znajdować się na literze, a nie między dwiema literami. Na przykład SAAS
zrównoważyłby się, gdyby w środku dwóch liter była litera A
, ale ponieważ nie ma żadnej litery , nie jest ona równoważona.
Zadanie
Powinieneś utworzyć program lub funkcję, która przyjmuje wielkie litery jako argumenty wejściowe lub funkcyjne , a następnie tworzy jedno z dwóch wyników:
Jeśli słowo się równoważy, należy je wydrukować z lewą stroną, spacją, literą kotwicy, inną spacją i prawą stroną.
function (STEAD) -> S T EAD
Jeśli słowo się nie równoważy, wydrukuj je, a następnie
DOES NOT BALANCE
function (WRONG) -> WRONG DOES NOT BALANCE
Możesz założyć, że wszystkie dane wejściowe będą pisane wielkimi literami i będą tylko znaki alfabetu.
Przykład I / O
function (CONSUBSTANTIATION) -> CONSUBST A NTIATION
function (WRONGHEADED) -> WRO N GHEADED
function (UNINTELLIGIBILITY) -> UNINTELL I GIBILITY
function (SUPERGLUE) -> SUPERGLUE DOES NOT BALANCE
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
function (A)
->A
zamiast -> `A`?BALANCE DOES NOT BALANCE
Odpowiedzi:
Pyth, 49 bajtów
Demonstracja.
Wyjaśnienie:
źródło
Pure Bash (bez coreutils i innych narzędzi), 125
Standardowy środek obliczania masy z wykorzystaniem momentów o pochodzeniu:
Wyjście testowe:
źródło
Python 3, 124
Ten kod nie testuje potencjalnych punktów podrzędnych, ale znajduje „środek masy” i sprawdza, czy jest to liczba całkowita. Robi to, sumując masę całkowitą
a
i masę ważoną według pozycjib
, aby znaleźć środek masym=b/a
. Następnie drukuje albo łańcuch podzielony w pozycjim
, albo łańcuch plus"DOES NOT BALANCE"
wybrany przez[_::2]
sztuczkę polegającą na przecinaniu listy.źródło
CJam, 57 bajtów
Nadal można to trochę pograć w golfa.
Wypróbuj online tutaj
źródło
'@fm
jest krótszy niż64f-:i
.JavaScript (ES6),
211200160 bajtówPoprzednia próba, 200 bajtów
Dzięki edc56 i nderscore za pomoc w golfa
Próbny
Firefox i Edge tylko na razie, ponieważ jest to ES6
źródło
j=0
inside the call tocharCodeAt
:)C,
236198192188180173 bytesExpanded with main():
Verification:
źródło
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);}
Note: uses undefined behavior :)CJam, 50 bytes
Using the Java interpreter, this exits with an error to STDERR for non-balancing words.
If you try the code in the CJam interpreter, just ignore everything but the last line of output.
Idea
My "original idea" turned out to be the same approach @xnor posted several hours before me. Nevertheless, here it goes:
Given a list of values (v0, … vn), we have that v_t is the anchor of the list if and only if any of the following, equivalent conditions holds:
tv0 + … + 1vt-1 == 1vt+1 + … tvn
(0 - t)v0 + … + (n - t)vn == 0
0v0 + … + nvn == t(v0 + … + vn)
t := (0v0 + … + nvn)/(v0 + … + vn) is an integer.
Code
At this part, we start having a little fun with overloaded operators.
For the quotient, this happens:
For the string, this happens:
At this point, a runtime error happens, since
""
does not have a last char. The stack gets printed and executing is aborted immediately.źródło
Julia, 122 bytes
This creates an unnamed function that accepts a string as input and returns a string. To call it, give it a name, e.g.
f=s->...
.We treat the word like a one-dimensional system for which we need to find the center of mass. The center of mass is computed as the dot product of the masses with their locations, divided by the total mass of the system. If the computed center is an integer, it corresponds to one of the letters in the word. Otherwise the word doesn't balance.
Ungolfed + explanation:
Examples:
źródło
PHP,
249174 bytesTakes one command-line argument.
Initial attempt:
źródło
Haskell,
161135 bytesUsage example:
How it works:
f
calls the helper function!
which takes two parameters, the left and right part of the word at a given position. It stops if both parts have equal weight (functionv
) or calls itself recursively with the first letter of the right part moved to the left. It ends with theDOES NOT BALANCE
message if the right part is empty.źródło
C,
183134 bytesNew Version Explained:
Like the other two entries, it makes use of constant addition on one side and subtraction on the other to hopefully reach zero which is the indication of balance. My original output is reused from the first answer, albeit slightly modified.
Old Version Explained:
The first loop (h) is the main iterator for the length of the string. The second loop (i) accumulates (b) until h==i. Once that happens, (b) is stored in (a), reset to 0, and then continues until the end of the string is reached where (a) is compared to (b). If there's a match, the main iterator's loop is broken and the output is printed.
źródło
Ruby 175
Test it online: http://ideone.com/G403Fv
This is a pretty straightforward Ruby implementation. Here's the readable program:
źródło
R, 190 bytes
As an unnamed function. I think I can get a few more, but that'll have to wait.
Ungolfed a bit with brief explanation
It doesn't put a newline at the end.
Test run
źródło
C, 142 bytes
Credit to some user for beating me to it :)
źródło
Java, 240 bytes
źródło