Mój przyjaciel i ja mamy tę grę, w którą gramy słowami. To jest fajna rozrywka i polega na „anulowaniu” liter w słowie, dopóki nic nie zostanie. Jestem naprawdę zmęczony tym, że jest o wiele szybszy ode mnie, więc Twoim zadaniem jest go wdrożyć i pozwolić mi w końcu go pokonać. Oczywiście, ponieważ muszę sprawić, by program był jak najłatwiejszy do ukrycia, musi być jak najmniejszy.
Jak działa ta gra?
Gra jest dość prostym algorytmem. Redukuje ciąg alfabetyczny, dopóki nie będzie można go dalej zmniejszać, co czyni go rodzajem skrótu. Rzeczywista gra, którą my, ludzie, jest bardzo trudna do wdrożenia, ale można ją uprościć w następującym algorytmie:
Zaczynasz od złożenia alfabetu na pół i ułożenia dwóch elementów w taki sposób:
a b c d e f g h i j k l m
z y x w v u t s r p q o n
Następnie, zaczynając od środka, przypisujesz dodatnie liczby całkowite do górnej połowy, a ujemne do dolnej:
a b c d e f g h i j k l m
13 12 11 10 9 8 7 6 5 4 3 2 1
z y x w v u t s r p q o n
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Następnie weź swój ciąg (będziemy używać hello world
) i ignorując wszelkie znaki niealfabetyczne, przetłumacz go:
h e l l o w o r l d
6 9 2 2 -2 -10 -2 -5 2 10
Następnie sumujesz wartości literowe. Te, które znalazły się na wcześniejszym schemacie (np. d
I w
, l
i o
), anulują się, a pozostałe sumują się.
sum(6 9 2 2 -2 -10 -2 -5 2 10 )=12
12 jest liczbą b
, więc skrót hello world
jestb
Za słowa, które całkowicie niweluje (np love
), to wyjście „0 znak”: -
. Zauważ, że w danych wejściowych -
nadal będą ignorowane. Ma to znaczenie tylko w wyniku.
Jeśli wielkość liczby jest większa niż 13, wtedy zaczynasz podwajać liczby a
i. z
Zasadniczo bierzesz tyle samo a
lub więcej z
, ile pasuje do liczby i bierzesz wszystko, co pozostało do ostatniej litery, w ten sposób:
code golf: 43.
Pasuje do 3 a
i zostało 4:
aaa 4: j
result: aaaj
Wskazówka: Ta część jest w zasadzie divmod
z tym wyjątkiem, że zaokrągla się w kierunku zera, a nie -infinity
(np. -43 zamieniłby się na 3 z
, a a tak -4
jest ).p
zzzp
Uwaga: kreska nie przyjdzie, jeśli a
„s lub z
” s pasuje idealnie, tylko jeśli jest to dokładnie 0
.
Wyjaśnienia:
- Hash jest przypadek w czuły
- Standardowe luki są niedozwolone
- I / O może być w dowolnym formacie, który nie jest zbyt dziwaczny, stdin, stdout, arg wiersza poleceń, funkcja itp.
- To jest golf golfowy, więc wygrywa najmniejszy rozmiar w bajtach .
Przykłady:
hello world --> b
love --> -
this is an example --> aak
hello *&*(&(*&%& world --> b
good bye --> ae
root users --> zzs
love
jest pusty ...Odpowiedzi:
CJam, 46 bajtów
Wypróbuj online lub wypróbuj pakiet testowy online .
Wyjaśnienie
Algorytm działa tak, jak można się spodziewać: odczytuje dane wejściowe, konwertuje na małe litery, mapuje każdy znak na wartość, sumuje wartości i drukuje znaki oraz odpowiednio dostosowuje sumę, aż suma wyniesie zero. Prawdopodobnie najciekawszą optymalizacją (chociaż oszczędza tylko dwa bajty) jest to, że zamiast tego używane są negowane odwzorowania znaków, ponieważ pozwala to uniknąć zamiany argumentów odejmowania w celu poprawienia znaku podczas obliczania odwzorowanej wartości i pozwala uniknąć zamiany ponownie podczas odwzorowywania z powrotem na literę z powodu odejmowanie zanegowanej wartości jest zastępowalne przez dodanie.
źródło
Pyth,
797877656158źródło
@Jz
zamiastf}YJz
Jest prawdopodobnie więcej, ale muszę teraz spać. Powodzenia;)@
!Klip 10 , 87
źródło
R, 258 bajtów
To musi być najobrzydliwszy kod R. Uznałem, że R może być dobrym wyborem, ponieważ ma wektor wszystkich liter od „a” do „z” jako wbudowaną zmienną globalną. Ale okazuje się, że reszta to bałagan.
Niegolfowane + wyjaśnienie:
Spowoduje to utworzenie nienazwanego obiektu funkcji, który przyjmuje ciąg znaków jako dane wejściowe i zwraca powiązaną wartość skrótu. Aby to nazwać, nadaj mu nazwę, np
f=function(s){...}
.Przykłady:
Wypróbuj online!
Pytania? Z przyjemnością udzielę dalszych wyjaśnień. Propozycje? Sugestie są mile widziane!
źródło
Haskell, 171 bajtów
Testowe uruchomienie:
Jak to działa:
l
to tablica odnośników od liter do odpowiedniej wartości. Wyszukaj wszystkie znaki z ciągu wejściowego i odrzuć te, których nie znaleziono. Zsumuj wynikową listę. W zależności od sumyp
wydruków,-
a może najpierw kilkaa
s lubz
si wreszcie (od tyłu) wyszukuje literęl
.źródło
R - 200
źródło