Twoim zadaniem jest ustalenie, czy dany ciąg ma odpowiednią długość i może być reprezentowany za pomocą płytek Scrabble, a jeśli tak, to wyświetl sumę wyniku każdej litery.
Jeśli nie wiesz, jak grać w Scrabble: masz 100 płytek z nadrukowanymi różnymi literami A – Z, a także dwie symbole wieloznaczne, które mogą reprezentować dowolną literę. Każda litera ma określoną liczbę punktów, a każda płytka (ale niekoniecznie słowo) może być użyta tylko raz. Kiedy słowo jest odtwarzane, sumuje się wartość punktową każdego użytego kafelka, który staje się wynikiem. Ponieważ dostępna jest ograniczona liczba liter, słowo może mieć tylko określoną literę tyle razy, ile litera ma kafelki + wszelkie nieużywane symbole wieloznaczne. Tablica Scrabble ma 15 × 15 komórek, więc słowo musi mieć od 2 do 15 znaków.
Aby uzyskać listę ilości i punktacji każdej litery w wersji angielskiej, patrz poniżej lub http://boardgames.about.com/od/scrabble/a/tile_distribute.htm ( archiwum ).
Liczba listów Liczba Liczba listów ------------------- ------------------- A 9 1 O 8 1 B 2 3 P 2 3 C 2 3 Q 1 10 D 4 2 R 6 1 E 12 1 S 4 1 F 2 4 T 6 1 G 3 2 U 4 1 H 2 4 V 2 4 I 9 1 W 2 4 J 1 8 X 1 8 K 1 5 Y 2 4 L 4 1 Z 1 10 M 2 3 [dziki] 2 0 N 6 1
Dalsze zasady
- Program pobiera pojedynczy ciąg danych wejściowych ze STDIN lub podobnego.
- Dane wejściowe zawsze będą zawierać tylko wielkie litery.
- Jeśli ciąg zawiera więcej kopii litery niż nieużywane symbole wieloznaczne lub kafelki dla tej litery LUB długość łańcucha nie jest zawarta między 2 a 15 włącznie, program powinien wypisać dane
Invalid
. - W przeciwnym razie wynik należy zsumować z wykorzystaniem danych z powyższej tabeli i wyników.
- Nie używaj symboli wieloznacznych, chyba że jest to konieczne.
- Nie martw się o bonusy, takie jak wyniki podwójnych słów lub to, czy ciąg znaków jest prawdziwym słowem.
- Program wyświetli wynik poprzez STDOUT lub podobny.
- Luki, które są domyślnie zabronione, nie są dozwolone.
- Korzystanie z zewnętrznego źródła, takiego jak strona internetowa, a także dowolnych bibliotek, interfejsów API, funkcji itp., Które obliczają wyniki Scrabble lub odpowiednie ilości nie są dozwolone.
- To jest golf golfowy , więc wygrywa najmniej bajtów.
Przewodnik
Input: CODEGOLF
C -> 3, O -> 1, D -> 2, E -> 1, G -> 2, O -> 1, L -> 1, F -> 4
3 + 1 + 2 + 1 + 2 + 1 + 1 + 4 = 15
Output: 15
Przypadki testowe
Wejście wyjście ------------------------ SCRABBLE 14 JAZZ 19 WYMIANA STOSUNKU 32 XYWFHQYVZVJKHFW 81 PIZZAZZ Nieprawidłowy KIXOKEJAJAX Niepoprawny NIEPRAWIDŁOWOŚĆ Niepoprawny
źródło
-1
?Invalid
.Odpowiedzi:
Perl 5
228 205 186 184 178 178 177 153 150 149 142 137135Uruchom z perl -E.
Gra w golfa:
To rozwiązanie wykorzystuje niektóre niedrukowalne znaki, więc zrzut heksowy znajduje się poniżej:
Alternatywnie, używając Ctrl + Key:
Ungolfed + skomentował:
źródło
-M5.010
(kara 0, ponieważ określa wersję używanego języka), a nie-e
(kara 1)? Możesz być w stanie zapisać bajt w argumentach.C, Rev 2,
151 145138Zainspirowany 159-bajtowym kodem w komentarzu @ bebe, wycisnąłem kolejne
8 1421 znaków:4 bajty zapisane przez przestawienie licznika długości
i
. Jest to inicjalizowane na 1 (zakładając, że program nie przyjmuje argumentów), a następnie mnożone przez 4 za każdym razem, gdy czytana jest litera. Przepełnia się do zera, gdy długość słowa jest większa niż 15, więc aby sprawdzić, czy długość słowa jest zła, po prostu sprawdzamy, czyi<5
(i<9
wstawiam,i
aby nadal dawał niepoprawne dla słów jednoliterowych, jeśli użytkownik przypadkowo zainicjuje wartość 2, ustawiając pojedynczy argument w wierszu poleceń).4 bajty zapisane przez zmianę testu warunku pętli na prosty
&31
. Wymaga to, aby słowo zostało zakończone spacją (ASCII 32) lub znakiem zerowym (ASCII 0.) Zwykle wprowadzanie z klawiatury kończy się znakiem nowej linii (ASCII 10), więc korzystanie z programu jest nieco niewygodne, ponieważ musisz wpisać spacja, a następnie naciśnij klawisz Return, aby komputer odczytał bufor. W przypadku ciągów zakończonych znakiem nowej linii mogłem dopasować, ale nie pobić sposobu, w jaki bebe to robi.613 bajtów zapisanych przez zmianę kodowania na - (liczba płytek każdej litery) - (wynik dla tej litery-1) * 13 . Wymaga to teraz zakresu od -4 dla L, S, U do -118 dla Q, Z. Powodem użycia liczb ujemnych jest uniknięcie zakresu niedrukowalnego ASCII od 0 do 31. Zamiast tego zastosowany zakres stanowi uzupełnienie liczb ujemnych od 256 do 4 = 252 do 256-118 = 138. Są to drukowane, rozszerzone znaki ASCII. Występują problemy z kopiowaniem i wklejaniem ich w Unicode (sposób, w jaki upraszcza z powrotem do ASCII, zależy od zainstalowanej strony kodowej, co może prowadzić do nieprzewidywalnych wyników), dlatego w komentarzu do programu umieściłem prawidłowe kody ASCII.Zaletą tego kodowania jest eliminacja zmiennej,
r
ponieważ liczba kafelków jest zawsze zmniejszana o 1 (ponieważ jest ona przechowywana jako liczba ujemna, robimy tot[x]++
. Dodatkowo operator postfiksu oznacza, że możemy wykonać ten przyrost w tym samym czasie, co dodanie wyniku dos
.C,
184Rev 1 173 (lub 172 z opcją kompilatora)Korzystam z GCC, a dzięki opcji kompilatora
-std=c99
pozwoli mi przejśćchar t[]="...."
do inicjalizacjifor
pętli w celu zaoszczędzenia jednego dodatkowego średnika. Dla czytelności pokazałem program bez tej zmiany i pozostawiono spację.Sztuczka znajduje się w bazie danych. Dla każdej litery w tabeli zapisany jest kod ASCII formularza (łączny wynik płytek dla tej litery) * 10 + (wynik jednej płytki-1)
t[]
. W czasie wykonywania te łączne wyniki są zmniejszane w miarę zużycia płytek.Całkowity wynik wszystkich płytek dla każdej litery wynosi od 12 dla E do 4 dla L, S, U. Ta forma kodowania umożliwia stosowanie tylko drukowalnych znaków ASCII (ASCII 120,
x
dla E do ASCII 40,(
dla L, S, U). Użycie liczby kafelków wymagałoby zakresu od 120 do 10, dlatego I uniknąłem tego.Dzięki
#define
makro, pojedynczy symbolT
jest używany w programie głównym, aby pobrać indeks sięi
z pierwszego argumentu wiersza poleceń, odejmowanie ASCIIA
= 65 od niego podania indeksu i szukać go w tabeli T:t[x[1][i]-65]
.for
Pętla jest stosowany raczej dowhile
pętli: końce pętli, gdy zerowy bajt (terminatora łańcuch) spotyka się w ciągu wejściowego.Jeśli kafelki tej litery nie są wyczerpane (
T/10
są niezerowe),s
są zwiększane o wynik kafelka,T%10+1
aby zachować łączny wynik. Jednocześnie zapisywany jest wynik kafelkar
, dzięki czemu wartość w stanie reprezentowanym przezT
może zostać zmniejszona o,r*10
aby wskazać, że użyto jednego kafelka. Jeśli płytki zostaną wyczerpane, licznik symboli zastępczych / pustychb
jest zwiększany.To
printf
stwierdzenie jest dość oczywiste. jeśli długość słowa jest poza zakresem lub liczba pustych miejsc jest zbyt wysoka, wydrukuj wInvalid
przeciwnym razie wydrukuj wyniks
.źródło
?
i:
. Twój drugi punkt został zastąpiony, ponieważ całkowicie zmieniłem kodowanie, więc nie ma potrzeby specjalnej obsługi Q i Z. Teraz z pomocą do 173/172.getchar()
159:l,w,f;main(t,i){for(char b[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";(i=getchar()-65)>=0;l++)b[i]/10?f+=t=b[i]%10+1,b[i]-=t*10:w++;printf(l<2|l>15|w>2?"Invalid":"%d",f);}
chociaż wciąż nie rozumiem, dlaczego sięchar*foo=<string>
zawiesza. może zaoszczędzić 2 znaki.char*foo="string"
jest literałem ciągowym , a jego zawartość nie może być modyfikowana. Z drugiej stronychar foo[]="string"
tworzy tablicę znaków zainicjowanychstring\0
, które mogą być następnie modyfikowane.getchar().
Użyłem ulepszeń w kodzie (z moimi zmiennymi nazwami w celu zachowania spójności z resztą mojej odpowiedzi), a także ulepszenia sprawdzania poprawności długości słowa i bezczelnej poprawy stanu pętli Test (próbowałem skracając je, ale nie mógł zrobić z tą samą funkcjonalność.) próbowałem teżgetche()
igetch()
ale mój kompilator (gcc na cygwin) nie odwołuje się je automatycznie.JavaScript (ES6) -
241230199182Edytuj - zmieniłem sposób, w jaki kodowałem ilości / wyniki, aby zmniejszyć rozmiar i usunąć zmienne inne niż ascii
Edycja 2 - zmieniono kodowanie ilości / wyniku na liczby całkowite zamiast ciągów
Edycja 3 - zmieniono na
%13
(dzięki @ edc65), odwrócono kodowanie, bezpośrednio zmodyfikowano wartości i kilka innych drobnych usprawnieńTestowany w konsoli Firefox.
źródło
f[c]=1+f[c]||1
->f[c]=-~f[c]
, 2. dlaczego nie używać% 13%13
jest jednak genialny. Utknąłem, myśląc, że muszę przechowywać rzeczy w cyfrach, ale matematyki nie obchodzi różnica między bazą 10 a bazą 13.SyntaxError: Unexpected token >
f=s=>{...}
notacji).Python 3,
217201Nie golfowany:
Edycja: Dzięki @BeetDemGuise za wskazówkę, która ostatecznie doprowadziła mnie do znacznie więcej niż 1-znakowej redukcji! Oryginalny kod poniżej:
źródło
int('1332142418513113a11114484a'[o],16)
BEFUNGE 93-210 bajtów.
Ale nie sprawdza limitu 15 liter.
źródło
C 197
Zakłada, że ciąg jest podany jako argument wiersza poleceń, np
./scrabble STACKEXCHANGE
źródło
JavaScript -
232201z
przechowuje słowo. Wysyła jako alert.Edycja: ulepszona zgodnie z zaleceniami poniżej.
źródło
s
jest używany tylko raz, więc nie musisz wcale zmieniać go; możesz usunąć tę deklarację i zastąpićr+=s[x]
jąr+=-~"02210313074020029000033739"[x]
. Ponadto nie trzeba nawiasów(w>2|y<2|y>15)
w alercie.Haskell - 538
Zapisz go jako scrabble.hs, a następnie skompiluj za pomocą
Następnie wprowadź słowo jako wejście i naciśnij klawisz Enter
źródło
"ABCDEFG"
można zapisać jako['A'..'G']
,[1,2,3]
można zapisać jako[1..3]
Python 2.7 - 263
Nie mogłem zbliżyć się do odpowiedzi DLosc , ale to traktuje każdą literę jako „torbę”, z której się wyciąga, dopóki nie jest pusta, a następnie ciągnie się puste, a kiedy jest pusta, popełnia błąd.
źródło
raw_input
jeśli jest to Python2 (jedna rzecz, którą lubię w Python3). Dane wejściowe są gwarantowane wielkimi literami, więc usuń.lower()
i zmień97+i
na65+i
. Wprowadzanie mniej niż 2 znaków również musi być nieprawidłowe. Możesz podnieść błąd podziału zerowego bezif
instrukcji: podziel swój wynik przez(1<len(S)<16)
. Kilka innych drobiazgów, takich jak umieszczenieprint
s na tej samej linii co nagłówki bloków i usuwanie spacji przed"Invalid"
obniżeniem jej do 250 według moich obliczeń. :)Haskell,
290283Tak daleko, jak tylko mogłem, na razie:
Ten kod bardzo ściśle przestrzega reguł, więc upewnij się, że nie przekazujesz żadnych dodatkowych znaków (takich jak koniec linii). Używać tak:
echo -n "JAZZ" | runghc scrabble.hs
.Wyjaśnienie
Wzorzec
(_:_:_)
upewnia się, że brane są pod uwagę tylko łańcuchy co najmniej dwóch znaków, wszystko inne skutkuje"Invalid"
(wzorzec rezerwowy_
). Tabela kafelków jest kodowana jako11*nTiles+value
przekonwertowana na ASCII z przesunięciem, które pozwala na działanie modułu wyszukiwania 11, gdzie literyAEIO
są duplikowane, ponieważ występują one więcej niż 6 razy. Następnie tworzona jest pula kafelkówreplicate
, z której usuwane są znaki w słowie w miarę ich pojawiania się (różnica list,\\
). Pula zawiera 98 kafelków, więc jeśli łączna długość słowa i pozostałej części puli jest większa niż 100, to użyliśmy zbyt wielu symboli wieloznacznych. Ponadto słowo pomniejszone o pierwsze 15 liter jest dodawane trzykrotnie do obliczeń długości, więc każde słowo dłuższe niż 15 liter automatycznie wydaje się używać trzech symboli wieloznacznych i dlatego jest nieprawidłowe. Punktacja odbywa się na pozostałej puli, która początkowo miała 187 punktów, z których po prostu odejmujemy. Zauważ, żef 61
zamiastf 65
65 oznacza liczbę ASCII'A'
, z powodu dwóch egzemplarzach"AEIO"
na początku basenie. Reszta to tylko płyta kotłowa.źródło
Python3 - 197
Wykorzystajmy bignum: D (obecnie nie obsługuje symboli wieloznacznych, pominąłem czytanie tej reguły, cholera)
źródło
Rubin - 195
Zakładam, że wynik
"Invalid"
jest w porządku, jeśli nie, musiałbym zrobić,$><<(-b<1&&w.size<16?s:'Invalid')
co podniosłoby go do 198Clojure - 325
Od jakiegoś czasu nie robiłem clojure, więc jestem pewien, że istnieje kilka sposobów na ulepszenie mojego rozwiązania. Listy qty i pts
Niektóre co Un-golfed
źródło
ES6: 184 (nie ścisłe)
w
zakłada się, że zawiera już słowo.r
jest łańcuchem wyjściowym.Oto wyjaśnienie i trochę mniej golfa:
źródło
Dart - 201
Wymaga to bignum, więc nie będzie się kompilowało do JavaScript.
Z większą ilością białych znaków:
źródło
PHP,
180170168 bajtówTak! pokonując JS!
awaria
Tak się cieszę, że nie ma więcej punktów niż 10.
źródło