PROBLEM
Na podstawie dwóch słów znajdź zwycięzcę w cyfrowej bitwie o rootowanie .
Zdefiniuj cyfrowy pierwiastek słowa w ten sposób:
- Każda litera alfabetu ma przypisany numer: A = 1, B = 2, C = 3, ..., Z = 26
- Dodaj wartości dla każdej litery, aby zsumować słowo. Weźmy na przykład „CAT”. C + A + T = 3 + 1 + 20 = 24
- Dodaj wszystkie pojedyncze cyfry, które składają się na wynik: 24 => 2 + 4 = 6
- Powtarzaj krok # 3, aż dojdziesz do jednej cyfry. Ta pojedyncza cyfra jest cyfrowym rdzeniem słowa.
Zasady:
- Zwycięzca zostaje ogłoszony, jeśli jego cyfrowy pierwiastek jest większy od drugiego.
- Jeśli cyfrowe wartości główne są równe, skróć słowa, usuwając każde wystąpienie litery o największej wartości z obu słów i ponownie je obliczając.
- Powtarzaj kroki 1 i 2, aż pojawi się zwycięzca lub jedno ze słów pozostanie tylko jedna litera (lub nie będzie żadnych liter).
- Jeśli cyfrowe wartości root są równe po przejściu przez proces skracania, dłuższe słowo zostaje ogłoszone zwycięzcą.
- Jeśli słowa są równej długości i po przejściu przez proces skracania nie zostanie znaleziony zwycięzca, nie zostanie ogłoszony zwycięzca.
Zasady specjalne:
- Żadne użycie modułu nie jest dozwolone w obliczeniach samego cyfrowego pierwiastka . Można go używać gdziekolwiek indziej.
- Załóżmy, że słowa będą się składać wyłącznie z wielkich liter - bez znaków interpunkcyjnych, bez spacji itp.
WKŁAD
Przeciągnij słowa przez stdin (oddzielone przecinkami). parametry metody lub jak chcesz. Wyjaśnij w swoim rozwiązaniu lub kodzie, w jaki sposób słowa są analizowane lub przygotowywane.
WYDAJNOŚĆ
Wyświetl zwycięskie słowo. Jeśli nie ma zwycięzcy, wyświetl „STALEMATE”.
Przykłady:
wejście: CAN, BAT
CAN = 18 = 9
BAT = 23 = 5
wyjście: CAN
intput: ZOO, NO
ZOO = 56 = 11 = 2
NO = 29 = 11 = 2
OO = 30 = 3
N = 14 = 5
wyjście: NIE
AKTUALIZACJA : Dane wejściowe należy odczytać za pomocą stdin ze słowami jako ciąg rozdzielany przecinkami.
AKTUALIZACJA : Dodano kilka przykładów do przetestowania.
AKTUALIZACJA : wyjaśniono usunięcie najwyższej wartości litery w przypadku remisu - to również nieznacznie zmienia warunek zatrzymania - jeśli słowo ma długość jednej litery lub zero liter, proces skracania jest zatrzymywany
źródło
Odpowiedzi:
J, 100
działa w ten sposób:
nie akceptuje jeszcze danych wejściowych dokładnie takich, jakie zostały zadane.
źródło
APL (Dyalog) (
9186)Objaśnienie (w kolejności wykonania):
⎕ML←3
: ustaw ML na 3 (⊂
między innymi oznacza to podział).G←Z⊂⍨','≠Z←⍞
: odczytaj dane wejściowe, oddziel je przecinkami, zapisz w G i przekaż do funkcji.+/¨⎕A∘⍳¨⍵
: oblicz wynik dla każdego słowa. (⎕A
jest listą zawierającą alfabet.)Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨
: oblicz cyfrowy pierwiastek dla każdego wyniku (sumując wszystkie cyfry, o ile jest ich więcej niż jedna cyfra) i zapisz je w Z.Z≡∪Z
: jeśli wszystkie wyniki są unikalne ...:G[↑⍒Z]
: ... następnie wypisz słowo o najwyższym wyniku (z oryginalnej listy).⋄1∊↑¨⍴¨⍵:'STALEMATE'
: w przeciwnym razie (jeśli występuje remis), jeśli jedno ze słów ma długość 1, wypisz STALEMATE.⋄∇1∘↓¨⍵
: w przeciwnym razie zdejmij pierwszą literę z każdego słowa i ponownie uruchom funkcję.źródło
Rubin - 210
Testy:
źródło
d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}
."If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
Haskell, 205 znaków
Przykładowe przebiegi:
w
, importowanie starszego, krótszego modułuźródło
',':b
→_:b
(-2), jeśli nie jesteś zbyt przywiązany do przetwarzania wieloliniowegointeract$unlines.map([...]).lines
→putStr.[...]=<<getLine
(-11), jeśli pozwolisz sobie na rozluźnienie wyjściaputStr
→print
(-1). Nienawidzę tych operacji zaprzeczania, które biorą tak wiele znaków, ale nie mogę znaleźć sposobu na obejście tego.Perl, 224
225229Podstawowa gra w golfa (jeszcze nic mądrego):
Perl 5.10 i wyżej, uruchamiaj z
perl -M5.010 <file>
lubperl -E '<code here>'
źródło
K, 106
Używa obsługi wyjątków do wychwytywania błędów stosu, które powodują przypadki impasu.
źródło
VBA (
242462)Okazało się, że poniższy kod nie pasuje do specyfikacji, więc musiałem przerobić, dodając dużo długości (patrz wyżej). : - / Może być w stanie grać w golfa dalej, ale jest już dość kompaktowy i wątpię, czy uda mi się przywrócić go do konkurencyjnego wyniku.
Oryginał (poniżej) nie usunął litery o najwyższej wartości ze słów, gdy był remis.
źródło
To naprawdę mi się podobało i jest to mój pierwszy post. Chociaż jest stary, zauważyłem, że nikt nie zrobił wersji php, więc tutaj jest moja.
534 znaków.
Teraz nie jestem pewien co do zasad rozpoczynania, więc zacząłem od $ f = 'CAN, CBN' jako mojego wkładu. Mam nadzieję, że tak było. Przeprowadziłem wszystkie testy i wszystkie one przeszły pomyślnie, choć nie są szczególnie eleganckie. Naprawdę muszę się teraz trochę przespać, ale świetnie się przy tym bawiłem - dziękuję za świetną układankę.
Kod na http://codepad.org/ZSDuCdin
źródło
$f=trim(fgets(fopen('php://stdin')));
do pobrania danych wejściowych.$w=fgetcsv(STDIN);
działa lepiej.D: 326 znaków
Bardziej czytelnie:
źródło
Matematyka
Wciąż brakuje niektórych szczegółów
źródło
Mathematica
220207Po napisaniu tego zauważyłem, że wynika to z tego samego rozumowania, którego użył Belizariusz:
Stosowanie
Ponieważ odpowiedź nie jest konkurencyjna (jest tak długa), postanowiłem użyć formatu wejściowego bardziej zbliżonego do Mathematica.
źródło
CoffeeScript - 335
Nie jestem tak zadowolony z tego, jak mógłbym być, ale i tak to postawię. Rzeczywista punktacja jest bardzo zwięzła (
y
funkcja), aleif
porównanie wyników (wz
) jest dość długie.Aby go użyć, zadzwoń za
z
pomocą dwóch słów (npz 'FOO','BAR'
.). Wytypuje oba słowa i zwróci słowo o wyższej punktacji. Jeśli jest to remis, powtórzy się ze zmodyfikowanymi słowami (zatrzymując oryginały, aby w końcu powróciły, stąd dodatkowe dwa parametry), które otrzyma zx
funkcji.Odpowiednik (rozszerzony) javascript dla zainteresowanych:
źródło
Rakieta 479 bajtów
Nie golfowany:
Testowanie:
Wydajność:
źródło
PHP,
339(nie podano),410382359339337 bajtówEDYCJA 1 : +71 bajtów. Używanie
STDIN
zamiastfopen('php://stdin','r');
i krótkich tagów. Ponadto pełna zgodność ze specyfikacją.EDYCJA 2 : -28 bajtów. Używanie
fgetcsv(STDIN)
zamiastexplode(',',trim(fgets(STDIN)))
i używanafor
pętla zamiastwhile
pętli.EDYCJA 3 : -23 bajty. Scalono funkcje
a
ib
scalono dla pętli.EDYCJA 4 : -20 bajtów. Przekształcony
c
z pętli rekurencyjnej. Następnie usunąłem funkcjęc
i umieściłem jej kod w globalnej przestrzeni nazw.EDYCJA 5 : -2 bajty. Dzięki @Titus za
-r
flagę.źródło
-r
flagąJAWA
źródło
C ++, 473 (Pożyczam żelazko)
Jestem pewien, że mógłbym to jakoś skrócić, ale jestem zmęczony.
Edycja: pierwotnie wziął argument wiersza poleceń, zmodyfikowany do użycia cin. Prawdopodobnie jest teraz o kilka znaków dłużej, ale jestem zbyt zmęczony, żeby to opisać.
źródło
Python: 383 znaków
uruchom funkcję
c('CAN','BAT')
:źródło
F #,
559533530 bajtówNa razie nie jest konkurencyjny. Jestem pewien, że c może być krótszy, a także kilka ostatnich linii. Boli również brak dostępu do argumentów wiersza poleceń.
Wypróbuj online!
Wersja bez golfa
źródło
PHP,
296 281267 bajtówuruchom go
-n
lub wypróbuj online (TiO obejmuje awarię).W lutym 2011 bieżąca wersja PHP miała wersję 5.3.5; więc nie mogłem
[$a,$b]=fgetcsv(...)
i tak dalej)count_chars
inlinesubstr
Ale żadne z nich nie zaoszczędziłoby wiele; więc to nie ma większego znaczenia.
Najdroższe były pętle (oczywiście) i reguła nr 4 (
4036 bajtów).źródło