Mój tata jest emerytowanym nauczycielem, a on zwykł przeprowadzać quizy pisowni i matematyki, w których uczeń pisał słowo, a następnie „punktował” słowo, dodając litery, gdzie a = 1, b = 2 itd. (np. cat = 3 + 1 + 20 = 24). Ułatwiło to ocenianie quizów, ponieważ musiał on po prostu sprawdzać, czy nie ma niepoprawnych „wyników”, a nie niepoprawnie pisanych słów, i miał dodatkową zaletę testowania 2 umiejętności jednocześnie.
Zatrudnił mojego przyjaciela, aby napisał program, który oceniałby słowa dla niego, aby mógł generować długie klucze odpowiedzi bez błędów. Ten problem jest inspirowany tym programem.
Wymagania:
- Zaakceptuj dowolne słowo z dużymi i małymi literami
- Zwraca błąd dla dowolnych znaków specjalnych, tj. Spacji, łączników, @ ^% # itd.
- a = 1, b = 2, ... i A = 1, B = 2, ...
- Wydrukuj wynik słowa
- (Opcjonalnie) sprawdź, czy słowo znajduje się w słowniku po ocenie, i wydrukuj ostrzeżenie, jeśli nie jest.
- Brak importowania zewnętrznego słownika liter-> liczb. Musisz sam go wygenerować.
Każdy język jest akceptowalny. Jest to podobne do „ cyfrowej bitwy o rootowanie ”, ale o wiele prostsze.
code-golf
znacznika.aaaaaaaaaaaaaaaaaaaaaaaa
. Tata: Wynik to 24? Zgadza się!Odpowiedzi:
Golfscript - 23 znaki
Upewnij się, że na wejściu nie ma końcowych znaków nowej linii (np. Use
echo -n
).źródło
echo -n
naprawdę nie liczy się jako zewnętrzne filtrowanie - w rzeczywistości odpowiedź, którą podłączyłeś, sugeruje, że jest to poprawna forma do wprowadzania danych.Brainf *** (100)
Muszę jednak przyznać, że to nie do końca spełnia wszystkie wymagania. Po pierwsze, akceptuje tylko wielkie litery, a słowo musi kończyć się tabulatorem. Niezdefiniowane zachowanie ma niezdefiniowane znaki i nie zgłasza błędu. Wyświetla sumę liter jako znak ASCII. Na przykład, jeśli słowo to „CZEŚĆ”, (8 + 5 + 12 + 12 + 15 = 52) wyświetli znak „4”, który jest znakiem ASCII dla 52. Oznacza to również, że program wariuje, gdy suma jest większa niż 255.
Ale poza tym działa dobrze. Daj mi spokój, mój mózg poradzi sobie tylko z niewielkimi dawkami ... no wiesz.
źródło
\n
lub\r\n
lub\n\r
. A gdybym użył nowej linii, nie miałbym ładnej okrągłej liczby, takiej jak 100, jako liczby znaków.Python (
6564)Rodzi to błąd, jeśli słowo zawiera znaki nieliterowe, ale nie jest pomocne ani informacyjne. (Edycja: czubek kapelusza do st0le dla sztuczki indeksującej.)
źródło
print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())
ogolił kilka znaków.input
; zmusza użytkownika do umieszczania cudzysłowów wokół ciągów wejściowych, ale „przyjazne dla użytkownika” i „nie niebezpieczne” nie są w specyfikacji!raw_input
→input
print sum([i,ord(i)-64]['@'<i<'[']for i in raw_input().upper())
kolejny bajt ogolonyRuby, 43 znaki
Jednak generowany komunikat o błędzie nie jest dokładnie pomocny. Oba zamieszczone tutaj rozwiązania zakładają, że wejście nie ma końca łamania linii, więc aby je przetestować, użyj
echo -n
.Ruby, 76 znaków z funkcją sprawdzania słownika
Komunikat ostrzegawczy składa się z pojedynczego znaku „W”. Ścieżkę do słownika należy podać za pośrednictwem ARGV. Przykładowe użycie:
źródło
Python 2.6 (72 znaki) Bez sprawdzania słownika
Python 2.6 (178 znaków *) Z funkcją sprawdzania słownika
* Można obniżyć do 156 za pomocą mniej pomocnego komunikatu o błędzie. :-)
Dziękujemy wszystkim komentującym za pomoc w ulepszeniu tego.
źródło
sum
wbudowanego wyrażenia generatora zamiastfor
pętli. Pozwoliłoby to odciąć kilka znaków (~ 17).a
tylko raz, więc użyj samego literału ..."0abc....z".index(i)
będzie działał równo .0
W macierzy punktacji jest mądry, ale oznacza to również, żecat0
jest akceptowana bez błędu, który nie jest w porządku, myślę. Który jest tak źle, gdyż to pozwala przejśćmap(a.index,w)
dosum
zamiast (zastępując na dosłownyma
jak sugeruje st0le).Perl
(52)(48)jeszcze bardziej grał w golfa dzięki Timwi
perl -lpe "($w=uc)=~/[^A-Z]/&¨$w=~s/./$_-=64-ord$&/ge"
źródło
-e
tam flagi.p
il
interpreter w swojej liczbie znaków. Zobacz tę dyskusję na temat meta.syntax error at -e line 1, near "(=" Execution of -e aborted due to compilation errors.
Co ja robię źle?Python (80)
Python v2 (65, ale char `zostanie zaakceptowany)
v3 (60 znaków, @ będą akceptowane, ale nie liczone, dzięki jloy)
źródło
Scala: 59 znaków, 7 z nich, bez dykt:
Do tej pory brak słownika. Wynik ujemny oznacza: Negatywny!
Nawiasem mówiąc, z wdziękiem radzi sobie z niemieckim umlautem:
źródło
alpha.pl
i zaczął od nichperl alpha.pl
. Czy oni po prostu obsługują Ascii? Cóż - w Perlu jest taka stara bestia ... :)perl -M5.010 alpha.pl
coś takiego.Biblioteki Java + Google Guava, 347 znaków, z funkcją sprawdzania słownika
Nieczytelna wersja 1 długiego łańcucha :-)
Wersja czytelna dla człowieka (rodzaj :-))
Ścieżka słownika jest teraz przekazywana przez
a[1]
, aby twierdzenia działały, musisz użyć-ea
flagi (+3 więcej znaków). Jeśli chodzi o słownik, zastosowano słownik/usr/share/dict/words
(powinien być dostępny w większości systemów * nix).źródło
UTF-8
jest krótszy niż inne zestawy znaków :-).Python 3, 95 znaków ze słownikiem
Słownik musi znajdować się w pliku o nazwie d.
Python 3, 61 bez słownika, ale skradziony pomysł
źródło
Perl (71)
źródło
VB.NET,
84827371Edit: With validation is:
129 characters. In which case:
C#, 118
źródło
Improving slightly on John's answer: Python (90)
źródło
Erlang, 104
źródło
Golfscript - 39 chars
The error it throws is not exactly the best, but hey, it aborts execution.
źródło
PYTHON
6268* CharactersRequires user to input strings using quotes, and is not safe (
input
executes code), but, as I said in a comment to another post, "user-friendly" and "not a security risk" ain't in the spec!* I forgot about
print
, dammit.źródło
input
/raw_input
difference.Ruby 1.9, 69
źródło
GolfScript, 50(53)
Gives an error on bad characters, but not a very good one (50 characters):
Gives "E" on error instead (53 characters):
The alphabet-generating snippet
123,97>+
is stolen from Ventero .źródło
J (55)
This satisfies all the conditions except the dictionary one. As an error condition, it returns "infinity" (the underscore symbol in J) for words that contain anything but letters.
źródło
Haskell (127)
(raises an error on weird characters)
(also: the space between
toUpper.
and\x
is needed otherwise it parses it as(toUpper)
.\
(x)
)Haskell (70)
(does not raise an error, but 45% shorter)
źródło
C++ (
111107)The "set up"/etc:
"Undefined" behavior (It's more 'bad practice' than 'undefined', but oh well):
void main()
That says it all.new
withoutdelete
.źródło
JavaScript 1.8, 80 chars
Surprisingly readable!
źródło
alert(prompt().toLowerCase().split("").reduce(function(a,b){return a+b.charCodeAt(0)-96},0))
. I still like JavaScript solutions most :)APL (34)
Gives either the score, or a
VALUE ERROR
if there are non-alphabetic characters in the input.Explanation:
⍞
: read a line of input{
...}
: function applied to every character of inputA←⎕UCS⍵
: store the ASCII value of the current character inA
A-32×96<A
: make character uppercase: fromA
is subtracted 32 if96<A
(so, if it's uppercase), otherwise 064-⍨
: subtract 64 from this, giving A=1, B=2 ...¨
: apply this function to every character:⍵∊⍳26
: if the character is between 1 and 26...:⍵
: then return ⍵ (and since there's no else clause there will be aVALUE ERROR
if it's not between 1 and 26)+/
: sum all the values together (and this value is automatically outputted because it's the final result).źródło
JavaScript, 60 bytes
If the program must return an error on invalid inputs, then 80 bytes:
If an input is invalid, then the console will say that
_
is not defined (there must not already be a variable defined called_
).źródło
Python 3,
5855without dictionary or stolen idea but still unhelpful error ;)
thx @Eᴀsᴛᴇʀʟʏ
Test here.
źródło
print<SPACE>sum(ord(.......
, removing the 2 parentheses around the expression.input()
in python3 israw_input()
in python2C, 98 bytes
źródło
F# (no validation)
7957 charsźródło
C# with validation: 108 chars (with 12 for error message):
C# without validation:
6053 chars:źródło
Perl (
4231)I hope counting F, p, a and l as 1 character was correct.
źródło
JavaScript, 68 Bytes
This can almost certainly be golfed more
With dictionary check (Node.js & Unix Descendants only) 195 Bytes
Uses
/usr/share/dict/words
, and can definitely be shortened (see the warn message)źródło
console.error()
, notconsole.warn()
.