단어의 글자를 '추가'


17

아빠는 은퇴 한 교사였으며, 학생이 단어를 철자 할 때 맞춤법과 수학 퀴즈를 조합 한 다음 a = 1, b = 2 등의 문자를 더하여 단어를 '점수'하는 데 사용했습니다. (예 : 고양이 = 3 + 1 + 20 = 24). 그는 철자가 틀린 단어가 아닌 잘못된 '점수'를 확인하기 만하면되므로 퀴즈를보다 쉽게 ​​채점 할 수 있었고 한 번에 2 개의 기술을 테스트 할 수있는 이점이있었습니다.

그는 내 친구를 고용하여 단어 점수를 매기는 프로그램을 작성하여 오류없이 긴 응답 키를 생성 할 수있었습니다. 이 문제는 그 프로그램에서 영감을 얻은 것입니다.

요구 사항 :

  1. 대문자와 소문자로 된 단어를 허용
  2. 공백, 하이픈, @ ^ % # 등의 특수 문자에 대한 오류를 반환합니다.
  3. a = 1, b = 2, ... 및 A = 1, B = 2, ...
  4. 단어의 점수를 인쇄
  5. (선택 사항) 점수를 매긴 후 단어가 사전에 있는지 확인하고 그렇지 않은 경우 경고를 인쇄합니다.
  6. 외부 문자-> 숫자 사전을 가져 오지 않습니다. 직접 생성해야합니다.

모든 언어가 허용됩니다. 이것은 ' 디지털 루트 배틀 '과 비슷 하지만 훨씬 간단합니다.


2
이것이 코드 골프 여야합니까?
피터 테일러

2
@Zach code-golf태그 사용 .
Lowjacker

2
당신의 아빠는 심지어 "C 이후를 제외하고 I 전 E"규칙을 가르치는 것을 귀찮게 했습니까?
Nathan Merrill

2
예, 점수 만 확인합니까? 나는 고양이를 철자로 쓸 것이다 aaaaaaaaaaaaaaaaaaaaaaaa. 아빠 : 점수는 24인가요? 맞습니다!
ericw31415

3
@ ericw31415 모든 해싱 함수에는 충돌이 있습니다. ;-). 지금까지 그의 학생 중 누구도 그 공격 경로를 시도하지 않았습니다
Zach

답변:


8

골프 스크립트-23 자

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

입력에 후행 줄 바꿈이 없는지 확인하십시오 (예 : use echo -n).


우리는 새로운 승자가 있습니다!
Zach

일반적으로 외부 필터링 은 어떻게 든 문자 수에 포함되어 있어야합니다 (Ctrl-f 외부 필터링).하지만 2 개의 추가 문자가없는 것으로 가정합니다.
Jesse Millikan

2
@Jesse : echo -n실제로 외부 필터링으로 계산되지 않습니다 . 실제로 연결된 답변은 올바른 입력 형식을 나타냅니다.
Nabb

10

Brainf *** (100)

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

그러나 모든 요구 사항을 완전히 준수하지는 않습니다. 먼저 대문자 만 허용하며 단어는 탭으로 끝나야합니다. 유효하지 않은 문자에 대해 정의되지 않은 동작이 있으며 오류가 발생하지 않습니다. 문자의 합계를 ASCII 문자로 표시합니다. 예를 들어 단어가 "HELLO"(8 + 5 + 12 + 12 + 15 = 52) 인 경우 문자 "4"(52의 ASCII 문자)가 표시됩니다. 이는 또한 프로그램이 합이 255보다 큽니다.

그러나 그 외에는 잘 작동합니다. 잠깐만, 내 뇌는 소량의 복용량 만 처리 할 수 ​​있습니다.


줄 바꿈 대신 탭으로 단어를 끝내는 이유는 무엇입니까?
Lowjacker

@Lowjacker TAB이 \nor \r\n또는 에 대해 걱정하는 것보다 간단하다고 가정했기 때문 \n\r입니다. 그리고 줄 바꿈을 사용하면 문자 수로 100과 같은 멋진 숫자가 없습니다.
피터 올슨

복용량이 많으면 어떻게됩니까?
Mateen Ulhaq

8

파이썬 ( 65 64)

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

단어에 문자가 아닌 문자가 포함되어 있지만 유용하거나 유익한 문자가없는 경우 오류가 발생합니다. (편집 : 인덱싱 트릭을 위해 모자 끝을 st0le로 만듭니다.)


1
print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())두 글자를 면도했습니다.
st0le

실제로 하나의 문자입니다. :-\
st0le

input; 를 사용하여 4자를 저장하십시오 . 사용자가 입력 문자열을 따옴표로 묶어야하지만 "사용자 친화적"및 "위험하지 않은"은 사양에 포함되지 않습니다!
jscs

글쎄, 그냥 파이썬 3으로 바꾸십시오! raw_inputinput
Oleh Prypin 12

print sum([i,ord(i)-64]['@'<i<'[']for i in raw_input().upper()) 다른 바이트 면도
Alexander Nigl

8

루비, 43 자

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

그래도이 오류 메시지는 도움이되지 않습니다. 여기에 게시 된 두 솔루션 모두 입력에 후행 줄 바꿈이 없다고 가정하므로 테스트하려면을 사용하십시오 echo -n.

루비, 사전 검사를 포함한 76 자

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

경고 메시지는 단일 문자 "W"로 구성됩니다. 사전에 대한 경로는 ARGV를 통해 제공되어야합니다. 사용법 예 :

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

2
오류 메시지를 느낌표로 만들어 사전 검사 버전에서 9자를 잘라낼 수 있습니다.
피터 올슨

사전 검사를 통해 최단 참가작에 대한 상을받습니다. 잘 했어!
Zach

사전 검사가 실제 우위를 제공하지 않으면 왜 제안 되었습니까?
도우미 방법

5

파이썬 2.6 (72 문자) 사전 검사없이

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

Python 2.6 (178 자 *) 사전 확인

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

* 덜 유용한 오류 메시지로 156으로 낮출 수 있습니다. :-)

이를 개선하는 데 도움을 주신 모든 의견에 감사드립니다.


루프 sum대신 생성기 표현식으로 내장을 사용하는 것이 좋습니다 for. 그것은 당신이 몇 글자 (~ 17)를 다듬을 수 있습니다.

@ jloy : 지적 해 주셔서 감사합니다.
John

인쇄 된 괄호를 제거 할 수 있습니다
st0le

a한 번만 사용하는 것처럼 보이므로 리터럴 자체를 사용하십시오 ... "0abc....z".index(i)동일하게 작동합니다.
st0le

0당신의 점수 배열은 영리하다, 그러나 또한 그 의미 cat0를 잘하지 않습니다 오류없이 받아 들여, 나는 생각한다. 당신이 전달할 수 있도록 것이기 때문에 어느 것이 너무 나쁜 map(a.index,w)sum대신 (에 대한 문자 대체 ast0le에서 알 수 있듯이을).

4

(52) (48)

Timwi 덕분에 더욱 골프를 쳤다

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


-e거기 에 깃발 이 없습니다 .
Lowjacker

1
최소한 문자 수에 pand l인터프리터 플래그를 포함해야합니다. 메타에 대한이 토론 을 참조하십시오 .
Ventero

syntax error at -e line 1, near "(=" Execution of -e aborted due to compilation errors.내가 도대체 ​​뭘 잘못하고있는 겁니까?
사용자가 알 수 없음

유닉스에서 실행중인 경우 큰 따옴표를 작은 따옴표로 변경하십시오
chinese perl goth

@ Timwi : '대문자와 소문자가있는 단어를 수락하십시오'가 잘못된 스레드로 이동했습니다. 죄송합니다. 지금 삭제했습니다. @chinese : 그렇습니다, 작은 따옴표로 괜찮습니다. 내가 ASCII 입력으로 제한하는 한. :)
사용자가 알 수 없음

4

파이썬 (80)

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

Python v2 (65이지만 char`는 허용됩니다)

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

v3 (60 자, @은 허용되지만 계산되지 않음, jloy 감사)

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

힌트 : 솔루션에서 하나 이상의 문자를 제거 할 수있는 방법이 있습니다. :)

2
@jloy 도움이되는 '힌트'. ;)
Mateen Ulhaq

4

스칼라 : 59 문자, 그중 7 개 페이로드, dict 없음 :

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

지금까지 사전이 없습니다. 부정적 결과의 의미 : 부정적!

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

그런데 독일 Umlaute를 우아하게 처리합니다.

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

와우, 펄 버전보다 적은 문자 (그리고 여전히 더 읽기 쉬운).
도우미 방법

SHiNKiROU와 chinesis-Perl-solution을 시도했지만 그들은 나를 위해 작동하지 않았습니다. 로 저장하고에 alpha.pl의해 시작했습니다 perl alpha.pl. 그들은 단지 Ascii를 처리합니까? 글쎄-펄에서 그런 오래된 짐승입니다 ... :)
사용자 알 수 없음

펄과 유니 코드는 큰 혼란이다. 아마도 그런 식으로 실행해야 perl -M5.010 alpha.pl할 것입니다.
피터 테일러

Linux에서 큰 따옴표 대신 작은 따옴표가 필요하다는 말을 들었습니다. 감사했습니다.
사용자가 알 수 없음

4

사전 확인 기능이있는 Java + Google Guava 라이브러리, 347 자

읽을 수없는 1 개의 긴 문자열 버전 :-)

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

사람이 읽을 수있는 버전 (:-)

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

a[1]어설 션이 작동하려면 사전 경로 가을 통해 전달됩니다 -ea(+ 3 문자 이상) 플래그 를 사용해야합니다 . 사전은 dict /usr/share/dict/words(대부분의 * nix 시스템에서 사용 가능해야 함)가 사용되었습니다.


지금까지 당신은 사전 검사를받은 유일한 사람이므로 +1
Zach

한 줄? 이 방법으로 읽을 수는 없지만 문자를 절약하는 것 같습니다
Nate Koppenhaver

더 읽기 쉬운 솔루션을 추가하고 (구글 플레이 터 코드를 줄이기 위해 Google Guava를 사용하는 더 짧은 솔루션) 추가합니다.
도우미 방법

당신은 ascii를 허용하지만 Charset.UTF-8을 사용합니까?
사용자가 알 수 없음

1
String UTF-8은 다른 문자셋보다 짧기 때문에 :-).
도우미 방법

4

파이썬 3, 사전이있는 95 자

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

사전은 d라는 파일에 있어야합니다.

파이썬 3, 61 사전은 없지만 도난당한 아이디어

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

3

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


편집 : 유효성 검사는 다음 과 같습니다.

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

129 자 어떤 경우 :

C #, 118

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

1
이것은 입력의 유효성을 검사하지 않습니다.
Lowjacker

죄송합니다! 잠깐만 ...
Ry-

3
완전한 프로그램을 제공해야한다고 생각합니다. C # 솔루션이 컴파일되지 않습니다. 클래스 선언 내의 Main 메서드에 배치하고 모든 문자를 계산해야합니다.
Timwi

1
아니요, 해당 코드는 아무 작업도 수행하지 않으며 객체 지향 언어 사용자에게 불리한 입장이 아닙니다. 어쨌든 이것은 유효한 C # / VB.NET입니다.
Ry-

3

John의 답변을 약간 개선 : Python (90)

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

2
문자열 시작 부분에 더미 문자를 추가하는 것이 더 짧습니다 ... 괄호를 제거 할 수 있습니다
st0le

3

에를 랑, 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

골프 스크립트-39 자

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

발생하는 오류는 정확히 최고는 아니지만 실행을 중단합니다.


나는 golfscript에 대해 아무것도 몰라, 이것이 이것이 요구 사항을 충족한다고 가정하고 승자를 선언합니다!
Zach

으악, 이겼어! 코드 골프 질문을 기다리는 데 2 ​​일이 걸리지 않을까요?
Zach

3

PYTHON 62 68 * 문자

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

사용자가 따옴표를 사용하여 문자열을 입력해야하고 안전하지는 않지만 ( input코드를 실행) 다른 게시물에 대한 주석에서 언급했듯이 "사용자 친화적"이고 "보안 위험이 아닙니다"는 사양에 없습니다!


* 잊어 버렸습니다 print.


jloy의 대답 은 실제로 input/ raw_input차이로 인해 여전히 짧습니다 .
jscs

2

루비 1.9, 69

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

ASCII 문자 만 처리합니다. 루비가 우리 세기의 것이라고 생각 했습니까? :)
사용자가 알 수 없음

@user unknown : 스펙은 그렇지 않다고 말합니다. 그것은 다소 복잡 할 것입니다 ...
Lowjacker

2

골프 스크립트, 50 (53)

잘못된 문자에는 오류가 있지만 매우 좋은 문자는 아닙니다 (50 자).

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

대신 오류 "E"를 나타냅니다 (53 자).

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

알파벳 생성 스 니펫 123,97>+은 Ventero에서 도난당했습니다.


2

J (55)

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

이것은 사전을 제외한 모든 조건을 만족시킵니다. 오류 조건으로 문자 이외의 단어가 포함 된 단어에 대해서는 "무한대"(J의 밑줄 기호)를 반환합니다.


2

하스켈 (127)

(이상한 문자에 오류를 발생시킵니다)
(: 사이의 공간도 toUpper.하고 \x, 그렇지 않으면 필요가로 구문 분석됩니다 (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"")

하스켈 (70)

(오류를 일으키지 않지만 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;}

"설정"/ etc :

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

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

"정의되지 않은"행동 ( '정의되지 않은'보다 '나쁜 습관'이지만, 아) :

  • void main() 그게 다야.
  • new없이 사용하고 delete있습니다.

1

자바 스크립트 1.8, 80 자

놀랍도록 읽을 수 있습니다!

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

Chrome에서 사용하려면 약간 변환해야했습니다 alert(prompt().toLowerCase().split("").reduce(function(a,b){return a+b.charCodeAt(0)-96},0)). 나는 여전히 JavaScript 솔루션을 가장 좋아한다 :)
pimvdb

잘못된 문자를 할 때 오류를 반환하지 않습니다 ???
ericw31415

1

APL (34)

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

VALUE ERROR입력에 알파벳이 아닌 문자가 있거나 점수를 제공합니다 .

설명:

  • : 입력 줄을 읽습니다.
  • {... }: 입력의 모든 문자에 적용되는 기능
  • A←⎕UCS⍵: 현재 문자의 ASCII 값을 A
  • A-32×96<A: 문자를 대문자로 만듭니다 : from A은 32 if 96<A(따라서 대문자이면), 그렇지 않으면 0
  • 64-⍨: 이것을 64에서 빼면 A = 1, B = 2 ...
  • ¨:이 기능을 모든 캐릭터에 적용하십시오 :
  • ⍵∊⍳26: 문자가 1에서 26 사이 인 경우 ...
  • :⍵: 그런 다음 ⍵를 반환하십시오 (그리고 else 절이 없으므로 VALUE ERROR1과 26 사이에 있지 않으면 if 가 있습니다 )
  • +/: 모든 값을 합산합니다 (이 값은 최종 결과이므로 자동으로 출력 됨).

1

자바 스크립트, 60 바이트

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

프로그램 유효하지 않은 입력에서 오류를 리턴 해야하는 경우 80 바이트 :

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

입력이 유효하지 않은 경우, 콘솔은 _정의되지 않았다고 말합니다 (이미 정의 된 변수가 아니어야합니다 _).


1

파이썬 3, 58 55

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

사전이나 도난당한 아이디어가 없지만 여전히 도움이되지 않는 오류;)

thx @ Eᴀsᴛᴇʀʟʏ

여기서 테스트 하십시오 .


파이썬 2로 전환 print<SPACE>sum(ord(.......하고 표현식을 둘러싼 괄호를 제거하여 바이트를 절약 할 수 있다고 생각합니다 .
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ 맞지만 입력보다 괄호 안에 있어야하며 파이썬 2를 홍보하고 싶지 않습니다.)
Alexander Nigl

PYTHON 2는 생명입니다! 또한 입력을 괄호로 묶어야한다고 생각하지 않습니까?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ sry 내가 인용 한 의미. input()python3 raw_input()에 python2에 있습니다
Alexander Nigl

아 잊었 어 흠.
Rɪᴋᴇʀ

1

C, 98 바이트

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


1

유효성 검사가 포함 된 C # : 108 자 (오류 메시지의 경우 12 자) :

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

유효성 검사가없는 C # : 60 53 자 :

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

1
유효성 검사가없는 두 번째 변수에서는 s 변수 선언을 제거하고 Console.ReadLine () 인라인을 사용하여 문자를 훨씬 더 줄일 수 있습니다.
hermiod 2018 년

1

펄 (42 31)

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

F, p, a 및 l을 1 자로 계산하면 좋을 것입니다.


1

자바 스크립트, 68 바이트

이것은 거의 확실하게 골프를 칠 수 있습니다

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

사전 검사 사용 (Node.js 및 Unix 자손 만 해당) 195 바이트

을 사용 /usr/share/dict/words하며 확실히 단축 될 수 있습니다 (경고 메시지 참조).

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

오류 메시지의 경우 console.error(),하지 않습니다 console.warn().
ericw31415

(단어가 득점 후 사전에 있음 5. (선택 사항) 확인 및 인쇄 그러나 문제는 경고라고 경고 . 그렇지 않은 경우) 현학적으로 의미하지 않는다, 그러나 문제는 경고를 지정
MayorMonty

@SpeedyNinja 나는 그것이 여전히 중요하다고 생각합니다. 그것은 실제로 도전의 요점이 아닙니다 ...
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ 1 문자 더 짧습니다;)
MayorMonty

@SpeedyNinja 당신 말이 맞아요.
ericw31415
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.