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


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


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.


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


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

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.


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"


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

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

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.


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

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


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.");

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)

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-$`).

3

Golfscript - 39 karakter

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

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


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.


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}

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.


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.


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)

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.

1

JavaScript 1.8, 80 karakter

Sangat mudah dibaca!

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

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

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 _).


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 .


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

1

F # (tidak ada validasi) 79 57 karakter

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

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&'_'-'@'));

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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.