'Aggiungi' le lettere in una parola


17

Mio padre è un insegnante in pensione, ed era solito fare quiz di ortografia e matematica combinati, in cui lo studente scriveva una parola, e poi "segnava" la parola sommando le lettere, dove a = 1, b = 2, ecc. (es. gatto = 3 + 1 + 20 = 24). Ciò ha reso più semplice la valutazione dei quiz, poiché avrebbe dovuto solo verificare la presenza di "punteggi" errati anziché parole errate e avrebbe avuto l'ulteriore vantaggio di testare 2 abilità contemporaneamente.

Ha assunto un mio amico per scrivere un programma che segnasse le parole per lui, in modo da poter generare lunghe chiavi di risposta senza errori. Questo problema è ispirato da quel programma.

Requisiti:

  1. Accetta qualsiasi parola con lettere maiuscole e minuscole
  2. Restituisce un errore per eventuali caratteri speciali, ad esempio spazi, trattini, @ ^% # ecc.
  3. a = 1, b = 2, ... e A = 1, B = 2, ...
  4. Stampa il punteggio della parola
  5. (Facoltativo) controlla che la parola sia in un dizionario dopo il punteggio e, se non lo è, stampa un avviso.
  6. Nessuna importazione di un dizionario di lettere-> numeri esterni. Devi generarlo tu stesso.

Qualsiasi lingua è accettabile Questo è simile alla " battaglia della radice digitale ", ma molto più semplice.


2
Questo dovrebbe essere un codice golf?
Peter Taylor,

2
@Zach Usando il code-golftag.
Lowjacker,

2
Tuo padre si è persino preso la briga di insegnare la regola "I prima di E tranne dopo C"?
Nathan Merrill,

2
Sì, controllando solo i punteggi? Scriverei gatto come aaaaaaaaaaaaaaaaaaaaaaaa. Papà: il punteggio è 24? Giusto!
ericw31415,

3
@ ericw31415 Ogni funzione di hashing ha delle collisioni ;-). Finora nessuno dei suoi studenti ha provato quel vettore di attacco
Zach,

Risposte:


8

Golfscript - 23 caratteri

0\{.31&.(.26%=@64///+}/

Accertarsi che non siano presenti nuove righe finali nell'input (ad es. Uso echo -n).


Abbiamo un nuovo vincitore!
Zach,

Generalmente, il filtro esterno dovrebbe essere incluso in qualche modo nel conteggio dei caratteri (filtro esterno Ctrl-f.), Anche se suppongo che siano solo 2 caratteri extra a cui fare a meno.
Jesse Millikan,

2
@Jesse: in echo -nrealtà non conta come filtro esterno - in effetti la risposta che hai collegato lo suggerisce come un modulo valido per l'input.
Nabb,

10

Brainf *** (100)

>+[>,---------]<[<]>>
[--------------------
---------------------
-------------->]<[[[<
]>+[>]<->]<<]>-.

Devo ammettere però che ciò non è del tutto conforme a tutti i requisiti. Innanzitutto, accetta solo lettere maiuscole e la parola deve terminare con una scheda. Ha un comportamento indefinito per i caratteri non validi e non genera un errore. Visualizza la somma delle lettere come carattere ASCII. Ad esempio, se la parola è "CIAO", (8 + 5 + 12 + 12 + 15 = 52) verrà visualizzato il carattere "4", che è il carattere ASCII per 52. Ciò significa anche che il programma si spaventa quando la somma è superiore a 255.

Ma a parte questo , funziona benissimo. Dammi una pausa, il mio cervello può gestire solo piccole dosi di ... beh, lo sai.


Perché terminare la parola con una scheda anziché una nuova riga?
Lowjacker

@Lowjacker Perché ho pensato che TAB fosse più semplice che preoccuparsi di \no \r\no \n\r. E se avessi usato Newline, non avrei avuto un bel numero di round come 100 come numero di personaggi.
Peter Olson,

Cosa succederebbe se assumessi una dose elevata?
Mateen Ulhaq,

8

Python ( 65 64)

print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())

Ciò genera un errore se la parola contiene caratteri non di lettera, ma non utili o informativi. (Modifica: punta del cappello per bloccare il trucco dell'indicizzazione.)


1
print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())rasato un paio di caratteri.
via

Solo un personaggio in realtà. : - \
st0le

Salva 4 caratteri usando input; impone all'utente di inserire virgolette attorno alle stringhe di input, ma "user-friendly" e "non pericoloso" non sono nelle specifiche!
jscs,

Bene, basta cambiarlo in Python 3! raw_inputinput
Oleh Prypin,

print sum([i,ord(i)-64]['@'<i<'[']for i in raw_input().upper()) un altro byte rasato
Alexander Nigl,

8

Rubino, 43 caratteri

$_=gets.upcase;p~/[^A-Z]/?_: $_.sum-64*~/$/

Il messaggio di errore che questo genera non è esattamente utile, però. Entrambe le soluzioni pubblicate qui presuppongono che l'input non abbia interruzioni di riga finali, quindi per testarle, utilizzare echo -n.

Rubino, 76 caratteri con controllo dizionario

l=STDIN.gets;$_=l.upcase;p~/[^A-Z]/?_: $_.sum-64*~/$/;[*$<].index(l)||$><<?W

Il messaggio di avviso è costituito dal singolo carattere "W". Il percorso del dizionario deve essere fornito tramite ARGV. Esempio di utilizzo:

$ echo -n asd | ruby addletters.rb /usr/share/dict/words
24
W
$ echo -n cat | ruby addletters.rb /usr/share/dict/words
24

2
È possibile tagliare 9 caratteri nella versione di verifica del dizionario trasformando il messaggio di errore in un punto esclamativo.
Peter Olson,

Ottieni un premio di consolazione per la voce più breve con un controllo del dizionario. Ben fatto!
Zach,

Perché è stato proposto il controllo del dizionario se non ti dà alcun vantaggio reale (al contrario, ha solo gonfiato il codice)?
Metodo di

5

Python 2.6 (72 caratteri) Senza controllo del dizionario

print sum(map(" abcdefghijklmnopqrstuvwxyz".index, raw_input().lower()))

Python 2.6 (178 caratteri *) Con controllo dizionario

w=raw_input().lower()
print sum(map(" abcdefghijklmnopqrstuvwxyz".index, w))
if w not in open('/usr/share/dict/american-english').read().split():
 print('Word not in dictionary')

* Può essere abbassato a 156 con un messaggio di errore meno utile. :-)

Grazie a tutti i commentatori per aver contribuito a migliorare questo.


Potresti prendere in considerazione l'utilizzo dell'integrato sumcon un'espressione del generatore, piuttosto che un forciclo. Ti permetterebbe di tagliare alcuni caratteri (~ 17).

@jloy: grazie per averlo sottolineato.
Giovanni,

le parentesi sulla stampa possono essere eliminate
stile

sembra che stai usando asolo una volta, quindi usa il letterale stesso ... "0abc....z".index(i)funzionerà in modo equivalente.
via

L' 0array nel tuo punteggio è intelligente, ma significa anche che cat0è accettato senza errori, il che non è giusto, credo. Che è troppo male, in quanto permetterebbe di passare map(a.index,w)a sumposto (sostituendo il letterale acome suggerisce st0le).

4

Perl (52) (48)

giocare a golf ancora di più grazie a Timwi

perl -lpe "($w=uc)=~/[^A-Z]/&&die;$w=~s/./$_-=64-ord$&/ge"


Ti stai perdendo la -ebandiera lì.
Lowjacker,

1
Dovresti almeno includere i flag pe l' linterprete nel conteggio dei personaggi. Vedi questa discussione su meta.
Ventero,

syntax error at -e line 1, near "(=" Execution of -e aborted due to compilation errors.Che cosa sto facendo di sbagliato?
utente sconosciuto

se stai eseguendo unix, cambia le virgolette doppie in singole
perl goth cinese

@Timwi: 'Accetta qualsiasi parola con lettere maiuscole e minuscole' è andato alla discussione sbagliata, scusa. L'ho cancellato ora. @Cinese: Sì, grazie, con virgolette singole va bene. Finché mi limito all'input ASCII. :)
utente sconosciuto

4

Python (80)

w=raw_input().lower()
s=0
for l in w:s+=range(97,123).index(ord(l))+1
print s

Python v2 (65 ma char `verrà accettato)

print sum(map(range(96,123).index,map(ord,raw_input().lower())))

v3 (60 caratteri, @ saranno accettati ma non conteggiati, grazie jloy)

print sum(map(range(64,91).index,map(ord,input().upper())))

SUGGERIMENTO: C'È UN MODO PER RIMUOVERE UN ALTRO CARATTERE DALLE TUE SOLUZIONI. :)

2
@jloy Che 'suggerimento' utile. ;)
Mateen Ulhaq,

4

Scala: 59 caratteri, 7 dei quali payload, no dict:

(0/:"Payload".map(c=>if(c.isLetter)(c-'A')%32 else-999))(_+_)
67

Nessun dizionario finora. Il risultato negativo significa: Negativo!

(0/:"Pay!wall?".map(c=>if(c.isLetter)(c-'A')%32 else-999))(_+_)   
-1915

Gestisce con grazia German Umlaute, tra l'altro:

(0/:"Müllrößchen".map(c=>if(c.isLetter)(c-'A')%32 else-999))(_+_)
155

Caspita, meno caratteri rispetto alla versione Perl (e ancora più leggibile).
Metodo di

Ho provato SHiNKiROUs e la soluzione cinese di Perl, ma non hanno funzionato per me. Li ho salvati come alpha.ple li ho avviati da perl alpha.pl. Gestiscono solo Ascii? Bene - Al Perl è una bestia così vecchia ... :)
Utente sconosciuto il

Perl e Unicode sono un gran casino. Probabilmente devi eseguirli come perl -M5.010 alpha.plo qualcosa del genere.
Peter Taylor,

Ho sentito che ho bisogno di virgolette singole invece di doppie virgolette su Linux e questo ha funzionato, grazie.
utente sconosciuto

4

Librerie Java + Google Guava, 347 caratteri, con controllo dizionario

Versione illeggibile 1 stringa lunga :-)

import java.io.*;import com.google.common.base.*;import com.google.common.io.*;class C{public static void main(String[]a)throws Exception{int s=0;for(int c:a[0].toUpperCase().toCharArray()){assert(c>64&&c<91);s+=c-64;}String d=Files.toString(new File(a[1]),Charsets.UTF_8);if(StringUtils.containsIgnoreCase(d,a[0]))System.out.println("w");System.out.println(s);}}

Versione leggibile dall'uomo (sorta di :-))

import java.io.*;

import com.google.common.base.*;
import com.google.common.io.*;

class C {
    public static void main(String[] a) throws Exception {
        int s=0;

        for(int c : a[0].toUpperCase().toCharArray()) {
            System.out.println(c);
            assert(c > 64 && c < 91);
            s += c - 64;
        }

        String d = Files.toString(new File(a[1]), Charsets.UTF_8);

        if (d.contains(a[0])) System.out.println("w");

        System.out.println(s);
    }
}

Il percorso del dizionario ora viene passato tramite a[1], per far funzionare le asserzioni devi usare il -eaflag (+3 altri caratteri). Per quanto riguarda il dizionario, /usr/share/dict/wordsè stato utilizzato il dict (dovrebbe essere disponibile sulla maggior parte dei sistemi * nix).


Finora sei l'unico con un controllo del dizionario, quindi +1
Zach

una linea? questo non è particolarmente leggibile in questo modo, anche se immagino che salvi i caratteri
Nate Koppenhaver

Aggiungerò una soluzione più leggibile (e anche una più breve usando Google Guava per ridurre il codice del boilerplate).
Metodo di

Consenti solo ascii, ma usi Charset.UTF-8?
utente sconosciuto

1
Perché la stringa UTF-8è più corta degli altri set di caratteri :-).
Metodo di

4

Python 3, 95 caratteri con dizionario

d=input().lower()
print(d in open("d").read()and sum(['',ord(c)-96]['`'<c<'{']for c in d)or'f')

Il dizionario deve trovarsi in un file chiamato d.

Python 3, 61 senza dizionario, ma idea rubata

print(sum(['',ord(c)-96]['`'<c<'{']for c in input().lower()))

3

Perl (71)

($a)=lc<>;$a=~/[^a-z]/i&&die;$x+=ord$_ for split//,$a;die$x-96*length$a;

3

VB.NET, 84 82 73 71

Console.Write(Console.ReadLine.Sum(Function(c)Asc(Char.ToUpper(c))-64))


Modifica: con la convalida è:

Dim r=Console.ReadLine
Console.Write(If(r.All(AddressOf Char.IsLetter),r.Sum(Function(c)Asc(Char.ToUpper(c))-64),"Invalid input."))

129 caratteri. In quale caso:

C #, 118

var r=Console.ReadLine();Console.Write(r.All(char.IsLetter)?r.Sum(c=>char.ToUpper(c)-64).ToString():"Invalid input.");

1
Questo non convalida l'input.
Lowjacker,

Oops! Aspetta un secondo ...
Ry

3
Penso che dovresti fornire programmi completi. La tua soluzione C # non viene compilata; devi inserirlo in un metodo Main all'interno di una dichiarazione di classe e contare tutti i caratteri.
Timwi,

1
No, perché quel codice non fa nulla e non è giusto svantaggiare gli utenti di linguaggi orientati agli oggetti. Questo è comunque valido per C # / VB.NET.
Ry,

3

Migliorare leggermente la risposta di John: Python (90)

s=0
for i in raw_input().lower():
 s+=("abcdefghijklmnopqrstuvwxyz".index(i)+1)
print(s)

2
l'aggiunta del carattere fittizio all'inizio della stringa è più breve ... le parentesi possono essere rimosse
punto

3

Erlang, 104

a()->
a(string:to_lower(io:get_line([])),0).
a([_|[]],S)->
S;
a([C|R],S) when C<${, C>=$`->
a(R,S+C-$`).

3

Golfscript - 39 caratteri

n%~{.96>{96}{64}if-..26>\0<|{0/}*}%{+}*

L'errore che genera non è esattamente il migliore, ma ehi, interrompe l'esecuzione.


Non so nulla di golfscript, quindi suppongo che questo soddisfi i requisiti e ti dichiari il vincitore!
Zach,

Spiacenti, sei stato battuto! Immagino che 2 giorni non siano abbastanza lunghi per aspettare una domanda di code golf?
Zach,

3

PITONE 62 68 * Personaggi

print sum(map(chr,range(65,91)).index(c)+1 for c in input().upper())

Richiede all'utente di inserire stringhe utilizzando le virgolette e non è sicuro (input esegue il codice), ma, come ho detto in un commento a un altro post, "user-friendly" e "non un rischio per la sicurezza" non sono nelle specifiche!


* Mi sono dimenticato print, dannazione.


la risposta di jloy è ancora più breve, in realtà, a causa della input/ raw_inputdifferenza.
jscs,

2

Ruby 1.9, 69

w=gets.chop.upcase
w[/[^A-Z]/]&&fail
p w.bytes.inject(0){|s,b|s+b-64}

Gestisce solo caratteri ASCII. Pensavo che Ruby fosse del nostro secolo? :)
utente sconosciuto

@utente sconosciuto: la specifica non dice che deve. Farlo sarebbe piuttosto complicato ...
Lowjacker

2

GolfScript, 50 (53)

Fornisce un errore sui caratteri errati, ma non molto buono (50 caratteri):

);[{""123,97>+91,65>+?}/].-1?0<{{26%1+}%{+}*}{@}if

Fornisce invece "E" in caso di errore (53 caratteri):

);[{""123,97>+91,65>+?}/].-1?0<{{26%1+}%{+}*}{;"E"}if

Lo snippet che genera l'alfabeto 123,97>+viene rubato da Ventero.


2

J (55)

+/64-~-&32`]@.(<&97)`_:@.(<&65)`_:@.(>&122)"0,I.a.&e."0

Questo soddisfa tutte le condizioni tranne quella del dizionario. Come condizione di errore, restituisce "infinito" (il simbolo di sottolineatura in J) per le parole che contengono altro che lettere.


2

Haskell (127)

(genera un errore su caratteri strani)
(anche: lo spazio tra toUpper.ed \xè necessario altrimenti lo analizza come (toUpper) .\ (x))

import Char
main=getLine>>=putStrLn.show.sum.(map$(-65+).ord.toUpper. \x->if x`elem`['A'..'Z']++['a'..'z']then x else error"")

Haskell (70)

(non genera un errore, ma il 45% in meno)

import Char
main=getLine>>=putStrLn.show.sum.(map$(-65+).ord.toUpper)

2

C ++ ( 111 107)

void main(){int a=0;s8*b=new s8[99];for(cin>>b;*b;)if(isalpha(*b))a+=tolower(*b++)-96;else return;cout<<a;}

Il "set up" / etc:

#include <iostream>
#include <cstdio>
#include <cctype>

#ifdef _MSC_VER
    typedef __int8 s8;
#else
    typedef signed char s8;
#endif

Comportamento "non definito" (è più una "cattiva pratica" che "non definito", ma vabbè):

  • void main() Questo dice tutto.
  • Sto usando newsenza delete.

1

JavaScript 1.8, 80 caratteri

Sorprendentemente leggibile!

alert(Array.reduce(prompt().toLowerCase(),function(a,b)a+b.charCodeAt(0)-96,0))

Per l'uso in Chrome ho dovuto convertirlo un po ': alert(prompt().toLowerCase().split("").reduce(function(a,b){return a+b.charCodeAt(0)-96},0)). Mi piacciono ancora di più le soluzioni JavaScript :)
pimvdb,

Non restituisce un errore quando si fa un carattere non valido ???
ericw31415,

1

APL (34)

+/{⍵∊⍳26:⍵}¨{64-⍨A-32×96<A←⎕UCS⍵}⍞

Fornisce il punteggio o un VALUE ERRORse ci sono caratteri non alfabetici nell'input.

Spiegazione:

  • : legge una riga di input
  • {... }: funzione applicata ad ogni carattere di input
  • A←⎕UCS⍵: memorizza il valore ASCII del carattere corrente in A
  • A-32×96<A: fa il carattere maiuscolo: da Aviene sottratto 32 if 96<A(quindi, se è maiuscolo), altrimenti 0
  • 64-⍨: sottrai 64 da questo, dando A = 1, B = 2 ...
  • ¨: applica questa funzione ad ogni personaggio:
  • ⍵∊⍳26: se il personaggio è compreso tra 1 e 26 ...
  • :⍵: poi restituisce ⍵ (e poiché non c'è altra clausola, ci sarà un VALUE ERRORse non è tra 1 e 26)
  • +/: somma tutti i valori insieme (e questo valore viene automaticamente emesso perché è il risultato finale).

1

JavaScript, 60 byte

s=>[...s.toUpperCase()].reduce((a,b)=>a+b.charCodeAt()-64,0)

Se il programma deve restituire un errore su input non validi, quindi 80 byte:

s=>/[^a-z]/i.test(s)?_:[...s.toUpperCase()].reduce((a,b)=>a+b.charCodeAt()-64,0)

Se un input non è valido, la console dirà che _non è definito (non ci deve essere già una variabile definita chiamata _).


1

Python 3, 58 55

print(sum(ord(x)%32for x in input()if x.isalpha()or z))

senza dizionario o idea rubata ma errore ancora inutile;)

grazie @ Eᴀsᴛᴇʀʟʏ

Prova qui .


Penso che puoi salvare un byte passando a Python 2 e facendo print<SPACE>sum(ord(......., rimuovendo le 2 parentesi attorno all'espressione.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ è giusto, ma poi l'input deve essere tra parentesi e non voglio promuovere Python 2;)
Alexander Nigl,

PYTHON 2 È VITA !! e inoltre, non penso che richiederebbe l'input tra parentesi?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ sry intendevo citato. input()in python3 è raw_input()in python2
Alexander Nigl,

Oh mi sono dimenticato. Hm.
Rɪᴋᴇʀ

1

C, 98 byte

 int a(char *s){int b=0;while(*s){if(!isalpha(*s))throw 1;b+=(toupper(*(s++))-64);}printf("%d",b);}

1

F # (nessuna convalida) 79 57 caratteri

let a w=w|>Seq.fold(fun a b->a+(int b)-65)0|>printfn"%i"

1

C # con convalida: 108 caratteri (con 12 per messaggio di errore):

var s=Console.ReadLine();Console.Write(s.All(Char.IsLetter)?s.Sum(x=>x&'_'-'@').ToString():"Invalid input");

C # senza convalida: 60 53 caratteri:

Console.Write(Console.ReadLine().Sum(x=>x&'_'-'@'));

1
In the second one without validation, you can reduce the characters even more by removing the s variable declaration and using Console.ReadLine() inline.
hermiod

1

Perl (42 31)

perl -F -pale '$c+=ord(uc$_)-64for@F;$_=$c'

I hope counting F, p, a and l as 1 character was correct.


1

JavaScript, 68 Bytes

This can almost certainly be golfed more

w=>[...w.toLowerCase()].map(v=>v.charCodeAt()-96).reduce((a,b)=>a+b)

With dictionary check (Node.js & Unix Descendants only) 195 Bytes

Uses /usr/share/dict/words, and can definitely be shortened (see the warn message)

w=>(require("fs").readFile("/usr/share/dict/words",(e,t)=>!(t+"").split`
`.includes(w=w.toLowerCase())&&console.warn(w+" not found in dict")),[...w].map(v=>v.charCodeAt()-96).reduce((a,b)=>a+b))

For an error message, you do console.error(), not console.warn().
ericw31415

But the challenge said to warn (5. (Optional) check that the word is in a dictionary after scoring, and print a warning if it is not.) Don't mean to be pedantic, but the challenge specified a warning
MayorMonty

@SpeedyNinja I think it still counts, that isn't really the point of the challenge...
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ it is 1 character shorter ;)
MayorMonty

@SpeedyNinja You're right, I misread.
ericw31415
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.