'Tambahkan' hingga huruf-huruf dalam sebuah kata

17

Ayah saya adalah seorang pensiunan guru, dan ia biasa memberikan gabungan kuis ejaan dan matematika, di mana siswa akan mengeja kata, dan kemudian 'menilai' kata itu dengan menjumlahkan huruf-hurufnya, di mana a = 1, b = 2, dll. (mis. kucing = 3 + 1 + 20 = 24). Ini membuat penilaian kuis lebih mudah, karena dia hanya perlu memeriksa 'skor' yang salah daripada kata-kata yang dieja salah, dan memiliki manfaat tambahan dengan menguji 2 keterampilan sekaligus.

Dia menyewa seorang teman saya untuk menulis sebuah program yang akan mencetak kata-kata untuknya, sehingga dia dapat menghasilkan kunci jawaban yang panjang tanpa kesalahan. Masalah ini terinspirasi oleh program itu.

Persyaratan:

  1. Terima kata apa pun dengan huruf besar dan kecil
  2. Kembalikan kesalahan untuk setiap karakter khusus, yaitu spasi, tanda hubung, @ ^% # dll.
  3. a = 1, b = 2, ... dan A = 1, B = 2, ...
  4. Cetak skor kata
  5. (Opsional) periksa apakah kata itu ada di kamus setelah mencetak, dan cetak peringatan jika tidak.
  6. Tidak mengimpor kamus huruf-> angka eksternal. Anda harus membuatnya sendiri.

Bahasa apa pun bisa diterima. Ini mirip dengan ' pertarungan root digital ', tetapi jauh lebih sederhana.

Zach
sumber
2
Apakah ini seharusnya kode golf?
Peter Taylor
2
@Zach Menggunakan code-golftag.
Lowjacker
2
Apakah ayahmu bahkan repot-repot mengajarkan aturan "Aku sebelum E kecuali setelah C"?
Nathan Merrill
2
Ya, hanya memeriksa skor? Saya akan mengeja kucing aaaaaaaaaaaaaaaaaaaaaaaa. Ayah: Skor 24? Betul!
ericw31415
3
@ ericw31415 Setiap fungsi hashing memiliki tabrakan ;-). Sejauh ini tidak ada muridnya yang mencoba vektor serangan itu
Zach

Jawaban:

8

Golfscript - 23 karakter

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

Pastikan tidak ada baris baru di input (mis. Gunakan echo -n).

Nabb
sumber
Kami memiliki pemenang baru!
Zach
Secara umum, pemfilteran eksternal seharusnya dimasukkan dalam jumlah karakter, entah bagaimana (pemfilteran Ctrl-f eksternal), meskipun saya berasumsi hanya 2 karakter tambahan yang harus dilakukan tanpa.
Jesse Millikan
2
@ Jesse: echo -nbenar-benar tidak dihitung sebagai pemfilteran eksternal - sebenarnya jawaban yang Anda tautkan menunjukkannya sebagai bentuk input yang valid.
Nabb
10

Brainf *** (100)

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

Namun saya harus mengakui, ini tidak sepenuhnya memenuhi semua persyaratan. Pertama, itu hanya menerima huruf besar, dan kata itu harus diakhiri dengan tab. Ini memiliki perilaku yang tidak ditentukan untuk karakter yang tidak valid, dan tidak menimbulkan kesalahan. Ini menampilkan jumlah huruf sebagai karakter ASCII. Misalnya, jika kata itu adalah "HELLO", (8 + 5 + 12 + 12 + 15 = 52) itu akan menampilkan karakter "4", yang merupakan karakter ASCII untuk 52. Ini juga berarti bahwa program panik ketika jumlahnya lebih dari 255.

Tapi selain itu , itu berfungsi dengan baik. Beri aku istirahat, otakku hanya bisa menangani dosis kecil ... yah, kau tahu.

Peter Olson
sumber
Mengapa mengakhiri kata dengan tab alih-alih baris baru?
Lowjacker
@ Lowjacker Karena saya menganggap TAB lebih sederhana daripada mengkhawatirkan \natau \r\natau \n\r. Dan jika saya menggunakan baris baru, saya tidak akan memiliki angka bulat yang bagus seperti 100 sebagai jumlah karakter.
Peter Olson
Apa yang akan terjadi jika Anda mendapat dosis besar?
Mateen Ulhaq
8

Python ( 65 64)

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

Ini menimbulkan kesalahan jika kata tersebut mengandung karakter non-huruf, tetapi bukan yang bermanfaat atau informatif. (Sunting: ujung topi untuk mencegah trik pengindeksan.)


sumber
1
print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())mencukur beberapa karakter.
st0le
Sebenarnya hanya satu char. : - \
st0le
Simpan 4 karakter dengan menggunakan input; memaksa pengguna untuk memberi tanda kutip di sekitar string input, tetapi "user-friendly" dan "tidak berbahaya" tidak ada dalam spesifikasi!
jscs
Yah, ubah saja ke Python 3! raw_inputinput
Oleh Prypin
print sum([i,ord(i)-64]['@'<i<'[']for i in raw_input().upper()) byte lain dicukur
Alexander Nigl
8

Ruby, 43 karakter

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

Pesan galat yang dihasilkan ini tidak membantu. Kedua solusi yang diposting di sini menganggap input tidak memiliki traebreak, jadi untuk mengujinya, gunakan echo -n.

Ruby, 76 karakter dengan cek kamus

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

Pesan peringatan terdiri dari karakter tunggal "W". Jalur ke kamus harus disediakan melalui ARGV. Contoh penggunaan:

$ echo -n asd | ruby addletters.rb /usr/share/dict/words
24
W
$ echo -n cat | ruby addletters.rb /usr/share/dict/words
24
Ventero
sumber
2
Anda dapat memotong 9 karakter dalam versi pemeriksaan kamus dengan menjadikan pesan kesalahan sebagai tanda seru.
Peter Olson
Anda mendapatkan hadiah hiburan untuk entri terpendek dengan cek kamus. Jalan untuk pergi!
Zach
Mengapa cek kamus diusulkan jika tidak memberi Anda keunggulan nyata (sebaliknya, itu hanya membengkak kode)?
Metode Penolong
5

Python 2.6 (72 Chars) Tanpa pemeriksaan kamus

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

Python 2.6 (178 Chars *) Dengan cek kamus

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')

* Dapat diturunkan ke 156 dengan pesan kesalahan yang kurang membantu. :-)

Terima kasih kepada semua komentator karena telah membantu meningkatkan ini.

John
sumber
Anda mungkin ingin mempertimbangkan untuk menggunakan sumbuiltin dengan ekspresi generator, bukan forloop. Ini akan membiarkan Anda memotong beberapa karakter (~ 17).
@ jloy: Terima kasih sudah menunjukkannya.
John
tanda kurung pada cetakan dapat dihilangkan
st0le
sepertinya Anda ahanya menggunakan sekali, jadi gunakan literal itu sendiri ... "0abc....z".index(i)akan bekerja sama.
st0le
Dalam 0array penilaian Anda pintar, tetapi juga berarti cat0diterima tanpa kesalahan, yang menurut saya tidak benar. Yang terlalu buruk, karena akan memungkinkan Anda untuk lulus map(a.index,w)ke sumsebaliknya (menggantikan literal untuk asebagai st0le menyarankan).
4

Perl (52) (48)

bermain golf bahkan lebih berkat Timwi

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

perl Cina goth
sumber
Anda kehilangan -ebendera di sana.
Lowjacker
1
Anda setidaknya harus menyertakan pdan lpenerjemah bendera dalam jumlah karakter Anda. Lihat diskusi ini tentang meta.
Ventero
syntax error at -e line 1, near "(=" Execution of -e aborted due to compilation errors.Apa yang saya lakukan salah?
pengguna tidak diketahui
jika Anda menjalankan unix, ubah tanda kutip ganda menjadi satu
cina perl goth
@Timwi: 'Terima kata apa pun dengan huruf besar dan kecil' masuk ke utas yang salah, maaf. Saya menghapusnya sekarang. @chinese: Ya, terima kasih, dengan satu tanda kutip tidak masalah. Selama saya membatasi diri untuk input ascii. :)
pengguna tidak diketahui
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 tetapi char `akan diterima)

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

v3 (60 karakter, @ akan diterima tetapi tidak dihitung, terima kasih jloy)

print sum(map(range(64,91).index,map(ord,input().upper())))
OneOfOne
sumber
PETUNJUK: ADA CARA UNTUK MENGHAPUS SATU BANYAK CHAR DARI SOLUSI ANDA. :)
2
@ jloy 'petunjuk' yang sangat membantu. ;)
Mateen Ulhaq
4

Scala: 59 karakter, 7 dari mereka muatan, tidak ada perintah:

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

Tidak ada kamus sejauh ini. Hasil negatif berarti: Negatif!

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

Menangani Umlaute Jerman dengan anggun, by the way:

(0/:"Müllrößchen".map(c=>if(c.isLetter)(c-'A')%32 else-999))(_+_)
155
Pengguna tidak diketahui
sumber
Wow, karakter kurang dari versi Perl (dan masih lebih mudah dibaca).
Metode Pembantu
Saya mencoba SHiNKiROUs dan chinesis-Perl-solution, tetapi mereka tidak bekerja untuk saya. Menyimpannya sebagai alpha.pldan memulainya dengan perl alpha.pl. Apakah mereka hanya menangani Ascii? Nah - di Perl itu seperti binatang tua ... :)
pengguna tidak diketahui
Perl dan Unicode adalah kekacauan besar. Anda mungkin harus menjalankannya sebagai perl -M5.010 alpha.platau sesuatu seperti itu.
Peter Taylor
Saya mendengar bahwa saya membutuhkan tanda kutip tunggal dan bukan tanda kutip ganda di Linux, dan ini berhasil, terima kasih.
pengguna tidak diketahui
4

Perpustakaan Java + Google Guava, 347 karakter, dengan kamus cek

Tidak dapat dibaca 1 versi string panjang :-)

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);}}

Versi yang dapat dibaca manusia (semacam :-))

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);
    }
}

Jalur kamus sekarang dilewatkan melalui a[1], agar pernyataan berfungsi, Anda harus menggunakan -eabendera (+3 karakter lainnya). Sedangkan untuk kamus, dikt /usr/share/dict/words(harus tersedia pada kebanyakan * nix sistem) telah digunakan.

Metode Penolong
sumber
Sejauh ini Anda adalah satu-satunya yang memiliki kamus cek, jadi +1
Zach
satu baris? ini tidak dapat dibaca dengan cara ini, meskipun saya rasa ini menghemat karakter
Nate Koppenhaver
Saya akan menambahkan solusi yang lebih mudah dibaca (dan juga yang lebih pendek menggunakan Google Guava untuk mengurangi kode boilerplate).
Metode Pembantu
Anda hanya mengizinkan ascii, tetapi gunakan Charset.UTF-8?
pengguna tidak diketahui
1
Karena String UTF-8lebih pendek dari rangkaian karakter lain :-).
Metode Pembantu
4

Python 3, 95 karakter dengan kamus

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

Kamus harus dalam file bernama d.

Python 3, 61 tanpa kamus, tetapi ide curian

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

Perl (71)

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

VB.NET, 84 82 73 71

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


Sunting: Dengan validasi adalah:

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

129 karakter. Dalam hal ini:

C #, 118

var r=Console.ReadLine();Console.Write(r.All(char.IsLetter)?r.Sum(c=>char.ToUpper(c)-64).ToString():"Invalid input.");
Ry-
sumber
1
Ini tidak memvalidasi input.
Lowjacker
Ups! Tunggu sebentar ...
Ry-
3
Saya pikir Anda harus menyediakan program yang lengkap. Solusi C # Anda tidak dikompilasi; Anda perlu menempatkannya di metode Utama di dalam deklarasi kelas, dan hitung semua karakter.
Timwi
1
Tidak, karena kode itu tidak melakukan apa-apa, dan tidak adil untuk merugikan pengguna bahasa berorientasi objek. Ini adalah C # / VB.NET yang valid.
Ry-
3

Meningkatkan sedikit pada jawaban John: Python (90)

s=0
for i in raw_input().lower():
 s+=("abcdefghijklmnopqrstuvwxyz".index(i)+1)
print(s)
Zach
sumber
2
menambahkan dummy char di awal string lebih pendek ... kurung dapat dihapus
st0le
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-$`).
xymostech
sumber
3

Golfscript - 39 karakter

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

Kesalahan yang dilontarkannya bukanlah yang terbaik, tapi hei, itu membatalkan eksekusi.

Juan
sumber
Saya tidak tahu apa-apa tentang skrip golf, jadi saya akan menganggap ini memenuhi persyaratan dan menyatakan Anda pemenangnya!
Zach
Aduh, kau sudah dikalahkan! Saya kira 2 hari tidak cukup lama untuk menunggu pertanyaan kode golf?
Zach
3

PYTHON 62 68 * Karakter

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

Membutuhkan pengguna untuk memasukkan string menggunakan tanda kutip, dan tidak aman ( inputmengeksekusi kode), tetapi, seperti yang saya katakan dalam komentar ke posting lain, "ramah pengguna" dan "bukan risiko keamanan" tidak ada dalam spesifikasi!


* Aku lupa tentang print, sial.

jscs
sumber
Jawabannya jloy ini masih lebih pendek, sebenarnya, karena input/ raw_inputperbedaan.
jscs
2

Ruby 1.9, 69

w=gets.chop.upcase
w[/[^A-Z]/]&&fail
p w.bytes.inject(0){|s,b|s+b-64}
Lowjacker
sumber
Hanya menangani karakter ascii. Saya pikir Ruby berasal dari abad kita? :)
pengguna tidak diketahui
@ pengguna tidak diketahui: Spesifikasinya tidak mengatakan itu harus. Melakukannya akan lebih rumit ...
Lowjacker
2

GolfScript, 50 (53)

Memberikan kesalahan pada karakter buruk, tetapi tidak terlalu bagus (50 karakter):

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

Alih-alih memberikan "E" sebagai kesalahan (53 karakter):

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

Cuplikan penghasil alfabet 123,97>+dicuri dari Ventero.

Jesse Millikan
sumber
2

J (55)

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

Ini memenuhi semua kondisi kecuali satu kamus. Sebagai kondisi kesalahan, ia mengembalikan "infinity" (simbol garis bawah dalam J) untuk kata-kata yang mengandung apa pun kecuali huruf.

Gregory Higley
sumber
2

Haskell (127)

(menimbulkan kesalahan pada karakter aneh)
(juga: ruang antara toUpper.dan \xdiperlukan jika tidak mem-parsingnya sebagai (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)

(tidak menimbulkan kesalahan, tetapi lebih pendek 45%)

import Char
main=getLine>>=putStrLn.show.sum.(map$(-65+).ord.toUpper)
marinus
sumber
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;}

"Set up" / etc:

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

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

Perilaku "tidak terdefinisi " (Ini lebih 'praktik buruk' daripada 'tidak terdefinisi', tapi oh well):

  • void main() Itu mengatakan itu semua.
  • Saya menggunakan newtanpa delete.
Mateen Ulhaq
sumber
1

JavaScript 1.8, 80 karakter

Sangat mudah dibaca!

alert(Array.reduce(prompt().toLowerCase(),function(a,b)a+b.charCodeAt(0)-96,0))
Casey Chu
sumber
Untuk penggunaan di Chrome saya harus mengubahnya sedikit a: alert(prompt().toLowerCase().split("").reduce(function(a,b){return a+b.charCodeAt(0)-96},0)). Saya masih paling suka solusi JavaScript :)
pimvdb
Itu tidak mengembalikan kesalahan ketika Anda melakukan karakter yang tidak valid ???
ericw31415
1

APL (34)

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

Memberikan skor, atau a VALUE ERROR jika ada karakter non-alfabet dalam input.

Penjelasan:

  • : baca sebaris input
  • {...} : fungsi diterapkan ke setiap karakter input
  • A←⎕UCS⍵: menyimpan nilai ASCII dari karakter saat ini di A
  • A-32×96<A: make karakter huruf besar: dari Adikurangi 32 jika96<A (jadi, jika huruf besar), jika tidak 0
  • 64-⍨: kurangi 64 dari ini, beri A = 1, B = 2 ...
  • ¨: terapkan fungsi ini untuk setiap karakter:
  • ⍵∊⍳26: jika karakternya antara 1 dan 26 ...
  • :⍵: lalu kembali ⍵ (dan karena tidak ada klausa lain akan ada a VALUE ERROR jika tidak antara 1 dan 26)
  • +/: jumlahkan semua nilai secara bersamaan (dan nilai ini secara otomatis dikeluarkan karena ini adalah hasil akhir).
marinus
sumber
1

JavaScript, 60 byte

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

Jika program harus mengembalikan kesalahan pada input yang tidak valid, maka 80 byte:

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

Jika sebuah input tidak valid, maka konsol akan mengatakan bahwa _itu tidak didefinisikan (harus sudah ada variabel yang dipanggil _).

ericw31415
sumber
1

Python 3, 58 55

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

tanpa kamus atau ide yang dicuri tetapi kesalahan masih tidak membantu;)

thx @ Eᴀsᴛᴇʀʟʏ

Tes di sini .

Alexander Nigl
sumber
Saya pikir Anda dapat menyimpan byte dengan beralih ke python 2 dan melakukan print<SPACE>sum(ord(......., menghapus 2 tanda kurung di sekitar ekspresi.
R
@ EᴀsᴛᴇʀʟʏIʀᴋ itu benar tetapi inputnya harus dalam tanda kurung dan saya tidak ingin mempromosikan python 2;)
Alexander Nigl
PYTHON 2 HIDUP !! dan juga, saya tidak berpikir bahwa akan membutuhkan input untuk dipasangkan?
R
@ EᴀsᴛᴇʀʟʏIʀᴋ sry maksudku dikutip. input()di python3 ada raw_input()di python2
Alexander Nigl
Oh saya lupa. 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);}
Adam Spindler
sumber
1

F # (tidak ada validasi) 79 57 karakter

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

C # dengan validasi: 108 karakter (dengan 12 untuk pesan kesalahan):

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

C # tanpa validasi: 60 53 karakter:

Console.Write(Console.ReadLine().Sum(x=>x&'_'-'@'));
driis
sumber
1
Dalam yang kedua tanpa validasi, Anda dapat mengurangi lebih banyak karakter dengan menghapus deklarasi variabel s dan menggunakan Console.ReadLine () sebaris.
hermiod
1

Perl (42 31)

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

Saya berharap menghitung F, p, a dan l karena 1 karakter sudah benar.

memowe
sumber
1

JavaScript, 68 Bytes

Ini hampir pasti bisa golf lebih banyak

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

Dengan cek kamus (Khusus Node.js & Unix) 195 Bytes

Penggunaan /usr/share/dict/words, dan pasti dapat dipersingkat (lihat memperingatkan pesan)

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))
MayorMonty
sumber
Untuk pesan kesalahan, ya console.error(), tidak console.warn().
ericw31415
Tapi tantangannya mengatakan untuk memperingatkan (5. (Opsional) memeriksa bahwa kata itu ada di kamus setelah mencetak, dan mencetak peringatan jika tidak.) Jangan bermaksud bertele-tele, tetapi tantangannya adalah peringatan
MayorMonty
@SpeedyNinja Saya pikir itu masih diperhitungkan, itu sebenarnya bukan inti dari tantangan ...
R
@ EᴀsᴛᴇʀʟʏIʀᴋ itu 1 karakter lebih pendek;)
MayorMonty
@SpeedyNinja Anda benar, saya salah membaca.
ericw31415