'Thêm' lên các chữ cái trong một từ


17

Cha tôi là một giáo viên đã nghỉ hưu, và ông thường đưa ra các câu đố chính tả và toán học kết hợp, trong đó học sinh sẽ đánh vần một từ, sau đó 'chấm điểm' từ đó bằng cách thêm các chữ cái, trong đó a = 1, b = 2, v.v. (ví dụ: mèo = 3 + 1 + 20 = 24). Điều này làm cho việc chấm điểm các câu đố dễ dàng hơn, vì anh ta sẽ chỉ phải kiểm tra 'điểm số' không chính xác thay vì các từ viết sai chính tả và có thêm lợi ích của việc kiểm tra 2 kỹ năng cùng một lúc.

Anh ấy đã thuê một người bạn của tôi để viết một chương trình ghi điểm cho anh ấy, vì vậy anh ấy có thể tạo ra các phím trả lời dài mà không gặp lỗi. Vấn đề này được lấy cảm hứng từ chương trình đó.

Yêu cầu:

  1. Chấp nhận bất kỳ từ nào có chữ hoa và chữ thường
  2. Trả về lỗi cho bất kỳ ký tự đặc biệt nào, ví dụ khoảng trắng, dấu gạch nối, @ ^% #, v.v.
  3. a = 1, b = 2, ... và A = 1, B = 2, ...
  4. In số điểm của từ
  5. (Tùy chọn) kiểm tra xem từ đó có trong từ điển sau khi ghi điểm không và in cảnh báo nếu không.
  6. Không nhập một chữ cái bên ngoài-> số từ điển. Bạn phải tự tạo ra nó.

Bất kỳ ngôn ngữ đều được chấp nhận. Điều này tương tự như ' trận chiến gốc kỹ thuật số ', nhưng đơn giản hơn nhiều.


2
Đây có phải là một golf mã?
Peter Taylor

2
@Zach Sử dụng code-golfthẻ.
Lowjacker

2
Cha của bạn thậm chí còn bận tâm đến việc dạy quy tắc "Tôi trước E ngoại trừ sau C"?
Nathan Merrill

2
Vâng, chỉ kiểm tra điểm số? Tôi đánh vần con mèo như aaaaaaaaaaaaaaaaaaaaaaaa. Bố: Điểm là 24? Đúng rồi!
ericw31415

3
@ ericw31415 Mọi hàm băm đều có va chạm ;-). Cho đến nay, không có học sinh nào của anh ấy đã thử vectơ tấn công đó
Zach

Câu trả lời:


8

Golfscript - 23 ký tự

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

Đảm bảo không có dòng mới nào trong đầu vào (ví dụ: sử dụng echo -n).


Chúng tôi có một người chiến thắng mới!
Zach

Nói chung, bộ lọc ngoài được cho là được bao gồm trong số ký tự bằng cách nào đó (bộ lọc bên ngoài Ctrl-f.), Mặc dù tôi cho rằng chỉ có 2 ký tự phụ để làm mà không có.
Jesse Millikan

2
@Jlie: echo -nthực sự không được tính là lọc bên ngoài - thực tế câu trả lời bạn liên kết cho thấy đây là một hình thức hợp lệ cho đầu vào.
Nabb

10

Brainf *** (100)

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

Tôi phải thừa nhận mặc dù, điều này không hoàn toàn tuân thủ tất cả các yêu cầu. Đầu tiên, nó chỉ chấp nhận chữ in hoa và từ phải được kết thúc bằng một tab. Nó có hành vi không xác định cho các ký tự không hợp lệ và không gây ra lỗi. Nó hiển thị tổng của các chữ cái dưới dạng ký tự ASCII. Ví dụ: nếu từ là "HELLO", (8 + 5 + 12 + 12 + 15 = 52) thì nó sẽ hiển thị ký tự "4", đó là ký tự ASCII cho 52. Điều này cũng có nghĩa là chương trình sẽ phát điên khi tổng là hơn 255.

Nhưng khác hơn , nó hoạt động tốt. Hãy cho tôi nghỉ ngơi, bộ não của tôi chỉ có thể xử lý liều lượng nhỏ ... tốt, bạn biết đấy.


Tại sao kết thúc từ bằng một tab thay vì một dòng mới?
Lowjacker

@Lowjacker Bởi vì tôi giả định TAB là đơn giản hơn so lo lắng về \nhay \r\nhay \n\r. Và nếu tôi sử dụng dòng mới, tôi sẽ không có số tròn đẹp như số 100 như số ký tự.
Peter Olson

Điều gì sẽ xảy ra nếu bạn có một liều lớn?
Mateen Ulhaq

8

Con trăn ( 65 64)

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

Điều này gây ra lỗi nếu từ chứa các ký tự không phải chữ cái, nhưng không phải là một ký tự hữu ích hoặc thông tin. (Chỉnh sửa: chóp mũ để st0le cho thủ thuật lập chỉ mục.)


1
print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())cạo một vài ký tự.
st0le

Chỉ cần một char thực sự. : - \
st0le

Lưu 4 ký tự bằng cách sử dụng input; buộc người dùng phải đặt dấu ngoặc kép quanh các chuỗi đầu vào, nhưng "thân thiện với người dùng" và "không nguy hiểm" không có trong thông số kỹ thuật!
jscs

Chà, chỉ cần đổi nó thành Python 3! raw_inputinput
Oleh Prypin

print sum([i,ord(i)-64]['@'<i<'[']for i in raw_input().upper()) một byte khác được cạo
Alexander Nigl

8

Ruby, 43 ký tự

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

Thông báo lỗi này tạo ra không chính xác hữu ích, mặc dù. Cả hai giải pháp được đăng ở đây đều cho rằng đầu vào không có dấu ngắt dòng, vì vậy để kiểm tra chúng, hãy sử dụngecho -n .

Ruby, 76 ký tự với kiểm tra từ điển

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

Thông điệp cảnh báo bao gồm ký tự đơn "W". Đường dẫn đến từ điển phải được cung cấp qua ARGV. Ví dụ sử dụng:

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

2
Bạn có thể cắt 9 ký tự trong phiên bản kiểm tra từ điển bằng cách đặt thông báo lỗi thành dấu chấm than.
Peter Olson

Bạn nhận được một giải khuyến khích cho mục ngắn nhất với kiểm tra từ điển. Con đường để đi!
Zach

Tại sao kiểm tra từ điển được đề xuất nếu nó không cung cấp cho bạn bất kỳ lợi thế thực sự nào (ngược lại, nó chỉ làm tăng mã)?
Phương pháp trợ giúp

5

Python 2.6 (72 Chars) Không cần kiểm tra từ điển

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

Python 2.6 (178 Chars *) Với kiểm tra từ điển

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

* Có thể hạ xuống 156 với thông báo lỗi ít hữu ích hơn. :-)

Cảm ơn tất cả các bình luận đã giúp cải thiện điều này.


Bạn có thể muốn xem xét sử dụng sumnội dung dựng sẵn với biểu thức trình tạo, thay vì forvòng lặp. Nó sẽ cho phép bạn cắt bớt một vài ký tự (~ 17).

@jloy: Cảm ơn bạn đã chỉ ra điều đó.
Giăng

các dấu ngoặc đơn trên bản in có thể được loại bỏ
st0le

có vẻ như bạn đang sử dụng achỉ một lần, vì vậy hãy sử dụng chính nó ... "0abc....z".index(i)sẽ hoạt động tương đương.
st0le

Các 0trong mảng điểm của bạn là thông minh, nhưng nó cũng có nghĩa là cat0được chấp nhận mà không có lỗi, mà không phải là đúng, tôi nghĩ vậy. Điều này là quá tệ, vì nó sẽ cho phép bạn vượt qua map(a.index,w)để sumthay thế (thay thế bằng chữ theo anhư st0le gợi ý).

4

Perl (52) (48)

chơi golf nhiều hơn nhờ Timwi

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


Bạn đang thiếu -ecờ ở đó.
Lowjacker

1
Bạn ít nhất nên bao gồm các cờ pltrình thông dịch trong số ký tự của bạn. Xem cuộc thảo luận này trên meta.
Ventero

syntax error at -e line 1, near "(=" Execution of -e aborted due to compilation errors.Tôi đang làm gì sai?
người dùng không xác định

nếu bạn đang chạy trên unix, hãy thay đổi dấu ngoặc kép thành một dấu ngoặc đơn
tiếng Trung Quốc perl goth

@Timwi: 'Chấp nhận bất kỳ từ nào có chữ hoa và chữ thường' đã đi sai chủ đề, xin lỗi. Tôi đã xóa nó ngay bây giờ. @chinese: Vâng, cảm ơn, với trích dẫn duy nhất là ok. Miễn là tôi hạn chế bản thân vào đầu vào ascii. :)
người dùng không xác định

4

Con trăn (80)

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

Python v2 (65 nhưng char `sẽ được chấp nhận)

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

v3 (60 ký tự, @ sẽ được chấp nhận nhưng không được tính, cảm ơn jloy)

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

GỢI Ý: ĐÂY LÀ CÁCH XÓA MỘT LẦN THÊM TỪ CÁC GIẢI PHÁP CỦA BẠN. :)

2
@jloy Thật là một 'gợi ý' hữu ích. ;)
Mateen Ulhaq

4

Scala: 59 ký tự, 7 trong số chúng tải trọng, không có lệnh:

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

Không có từ điển cho đến nay. Kết quả tiêu cực có nghĩa là: Tiêu cực!

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

Bằng cách xử lý Umlaute Đức duyên dáng, nhân tiện:

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

Wow, ít ký tự hơn phiên bản Perl (và vẫn dễ đọc hơn).
Phương pháp trợ giúp

Tôi đã thử giải pháp SHiNKiROU và Trung Quốc-Perl, nhưng chúng không hiệu quả với tôi. Lưu chúng như alpha.plvà bắt đầu chúng bằng cách perl alpha.pl. Có phải họ chỉ xử lý Ascii? Chà - tại Perl là một con thú già như vậy ... :)
người dùng không biết

Perl và Unicode là một mớ hỗn độn lớn. Bạn có thể phải chạy chúng như perl -M5.010 alpha.plhoặc một cái gì đó như thế.
Peter Taylor

Tôi nghe nói rằng tôi cần trích dẫn đơn thay vì trích dẫn kép trên Linux, và điều này đã hoạt động, cảm ơn.
người dùng không xác định

4

Thư viện Java + Google Guava, 347 ký tự, với kiểm tra từ điển

Không thể đọc được 1 phiên bản chuỗi dài :-)

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

Phiên bản có thể đọc được của con người (loại :-))

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

Đường dẫn từ điển hiện được chuyển qua a[1], để xác nhận hoạt động, bạn phải sử dụng -eacờ (thêm 3 ký tự). Đối với từ điển, dict /usr/share/dict/words(nên có sẵn trên hầu hết các hệ thống * nix) đã được sử dụng.


Cho đến nay, bạn là người duy nhất có kiểm tra từ điển, vì vậy +1
Zach

một đường thẳng? cách này không đặc biệt có thể đọc được theo cách này, mặc dù tôi đoán nó sẽ tiết kiệm ký tự
Nate Koppenhaver

Tôi sẽ thêm một giải pháp dễ đọc hơn (và cũng là một giải pháp ngắn hơn bằng cách sử dụng Google Guava để giảm mã soạn sẵn).
Phương pháp trợ giúp

Bạn chỉ cho phép ascii, nhưng sử dụng Charset.UTF-8?
người dùng không xác định

1
Bởi vì Chuỗi UTF-8ngắn hơn các bộ ký tự khác :-).
Phương pháp trợ giúp

4

Python 3, 95 ký tự với từ điển

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

Từ điển phải ở trong một tập tin gọi là d.

Python 3, 61 không có từ điển, nhưng ý tưởng bị đánh cắp

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


Edit: With validation is:

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

129 characters. In which case:

C#, 118

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

1
This doesn't validate the input.
Lowjacker

Oops! Hold on a second...
Ry-

3
I think you should provide complete programs. Your C# solution doesn’t compile; you need to place it in a Main method inside a class declaration, and count all the characters.
Timwi

1
No, because that code doesn't do anything, and it's not fair to disadvantage users of object-oriented languages. This is valid C#/VB.NET anyways.
Ry-

3

Improving slightly on John's answer: Python (90)

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

2
adding the dummy char in the string beginning is shorter...parentheses can be removed
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 chars

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

The error it throws is not exactly the best, but hey, it aborts execution.


I don't know anything about golfscript, so I'm going to assume this meets the requirements and declare you the winner!
Zach

Whoops, you've been beat! I guess 2 days isn't long enough to wait on a code golf question?
Zach

3

PYTHON 62 68* Characters

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

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


jloy's answer is still shorter, actually, because of the input/raw_input difference.
jscs

2

Ruby 1.9, 69

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

Does only handle ascii characters. I thought Ruby is from our century? :)
user unknown

@user unknown: The spec doesn't say it has to. Doing it would be rather complicated...
Lowjacker

2

GolfScript, 50(53)

Gives an error on bad characters, but not a very good one (50 characters):

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

Gives "E" on error instead (53 characters):

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

The alphabet-generating snippet 123,97>+ is stolen from Ventero .


2

J (55)

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

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.


2

Haskell (127)

(đưa ra một lỗi trên các ký tự lạ)
(cũng: khoảng trống giữa toUpper.\xlà cần thiết nếu không nó phân tích nó thành (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)

(không đưa ra lỗi, nhưng ngắn hơn 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;}

"Thiết lập" / etc:

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

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

Hành vi "Không xác định" (Đó là 'thực hành xấu' hơn 'không xác định', nhưng ồ):

  • void main() Điều đó nói lên tất cả.
  • Tôi đang sử dụng newmà không có delete.

1

JavaScript 1.8, 80 ký tự

Đáng ngạc nhiên có thể đọc được!

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

Để sử dụng trong Chrome, tôi đã phải chuyển đổi nó một chút : alert(prompt().toLowerCase().split("").reduce(function(a,b){return a+b.charCodeAt(0)-96},0)). Tôi vẫn thích các giải pháp JavaScript nhất :)
pimvdb

Nó không trả về lỗi khi bạn làm ký tự không hợp lệ ???
ericw31415

1

APL (34)

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

Cho điểm số hoặc VALUE ERROR nếu có các ký tự không phải là chữ cái trong đầu vào.

Giải trình:

  • : đọc một dòng đầu vào
  • {... }: chức năng được áp dụng cho mọi ký tự đầu vào
  • A←⎕UCS⍵: lưu trữ giá trị ASCII của ký tự hiện tại trong A
  • A-32×96<A: tạo chữ hoa cho ký tự: từ Abị trừ 32 if 96<A(vì vậy, nếu đó là chữ hoa), nếu không thì 0
  • 64-⍨: trừ 64 từ này, cho A = 1, B = 2 ...
  • ¨: áp dụng chức năng này cho mọi nhân vật:
  • ⍵∊⍳26: nếu nhân vật nằm trong khoảng từ 1 đến 26 ...
  • :⍵: sau đó trả về ⍵ (và vì không có mệnh đề nào khác nên sẽ không có VALUE ERRORnếu nó không nằm trong khoảng từ 1 đến 26)
  • +/: tổng hợp tất cả các giá trị lại với nhau (và giá trị này được tự động xuất ra vì đó là kết quả cuối cùng).

1

JavaScript, 60 byte

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

Nếu chương trình phải trả về lỗi trên các đầu vào không hợp lệ, thì 80 byte:

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

Nếu một đầu vào không hợp lệ, thì bàn điều khiển sẽ nói rằng _nó không được xác định (phải không có một biến được định nghĩa được gọi _).


1

Trăn 3, 58 55

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

không có từ điển hoặc ý tưởng bị đánh cắp nhưng vẫn không có lỗi;)

thx @ Eᴀsᴛᴇʀʟʏ

Kiểm tra tại đây .


I think you can save a byte by switching to python 2 and doing print<SPACE>sum(ord(......., removing the 2 parentheses around the expression.
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ that is right but than the input has to be in parenthesis and I don't want to promote python 2 ;)
Alexander Nigl

PYTHON 2 IS LIFE!! and also, I don't think that would require the input to be parenthesized?
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ sry i meant quoted. input() in python3 is raw_input() in python2
Alexander Nigl

oh, I forgot. Hm.
Rɪᴋᴇʀ

1

C, 98 bytes

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


1

C# with validation: 108 chars (with 12 for error message):

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

C# without validation: 60 53 chars:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.