単語の文字を「追加」する


17

私の父は引退した教師であり、彼は学生が単語を綴るスペルと数学のクイズを組み合わせて与え、その後、a = 1、b = 2などの文字を加算して単語を「採点」しました。 (例:cat = 3 + 1 + 20 = 24)。これにより、クイズの採点が容易になりました。スペルが間違っている単語ではなく、誤った「スコア」をチェックするだけで済み、2つのスキルを一度にテストできるという利点がありました。

彼は私の友人を雇って、彼のために単語を採点するプログラムを書いたので、彼は間違いなく長い回答キーを生成することができました。この問題は、そのプログラムに触発されています。

要件:

  1. 大文字と小文字の任意の単語を受け入れます
  2. スペース、ハイフン、@ ^%#などの特殊文字に対してエラーを返します。
  3. a = 1、b = 2、...およびA = 1、B = 2、...
  4. 単語のスコアを印刷する
  5. (オプション)スコアリング後に単語が辞書にあることを確認し、ない場合は警告を出力します。
  6. 外部の文字->数字辞書をインポートしません。自分で生成する必要があります。

任意の言語が受け入れられます。これは「デジタルルートバトル」に似ていますが、はるかに簡単です。


2
これはコードゴルフとなるはずですか?
ピーターテイラー

2
@Zach code-golfタグを使用します。
ロージャッカー

2
お父さんは「Cを除いてEの前に私」というルールを教えさえしましたか?
ネイサンメリル

2
ええ、スコアをチェックするだけですか?猫をのように綴るaaaaaaaaaaaaaaaaaaaaaaaa。お父さん:スコアは24ですか?そのとおり!
ericw31415

3
@ ericw31415すべてのハッシュ関数には衝突があります;-)。これまでのところ、彼の学生は誰もその攻撃ベクトルを試みていません。
ザック

回答:


8

Golfscript-23文字

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

入力に末尾の改行がないことを確認します(例:を使用echo -n)。


新しい勝者がいます!
ザック

一般に、外部フィルタリングは何らかの方法で文字数に含まれることが想定されています(Ctrl-f外部フィルタリング)。
ジェシーミリカン

2
@Jesse:echo -n実際には外部フィルタリングとしてはカウントされません。実際、リンクした答えは、入力の有効なフォームとして示唆しています。
ナブ

10

Brainf ***(100)

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

ただし、これはすべての要件に完全に準拠しているわけではありません。まず、大文字のみを受け入れ、単語はタブで終わる必要があります。無効な文字に対する未定義の動作があり、エラーをスローしません。文字の合計がASCII文字として表示されます。たとえば、単語が「HELLO」(8 + 5 + 12 + 12 + 15 = 52)の場合、52のASCII文字である「4」という文字が表示されます。これは、プログラムが次の場合に異常終了することも意味します。合計が255を超えています。

しかし、それ以外は問題なく動作します。休憩してください、私の脳は少量しか扱えません...まあ、あなたは知っています。


改行の代わりにタブで単語を終了するのはなぜですか?
ロージャッカー

@Lowjacker TABは\n\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

実際には1文字だけです。:-\
st0le

input; を使用して4文字を保存します。ユーザーに入力文字列を引用符で囲むように強制しますが、「ユーザーフレンドリー」と「危険ではない」は仕様に含まれていません!
jscs

さて、Python 3に変更するだけです!raw_inputinput
オレプリピン

print sum([i,ord(i)-64]['@'<i<'[']for i in raw_input().upper()) 別のバイトを剃毛
アレクサンダーニグル

8

ルビー、43文字

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

ただし、これが生成するエラーメッセージは正確には役に立ちません。ここに掲載されている両方のソリューションは、入力に末尾の改行がないことを前提としていますecho -n

Ruby、辞書チェック付きの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文字を切り刻むことができます。
ピーターオルソン

あなたは辞書チェックで最短エントリーの慰め賞を獲得します。行く方法!
ザック

本当の優位性が得られない場合に辞書チェックが提案されたのはなぜですか(それどころか、コードが肥大化しました)。
ヘルパーメソッド

5

Python 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:それを指摘してくれてありがとう。
ジョン

印刷上の括弧を削除することができます
-st0le

あなたはa一度だけ使用しているようですので、リテラル自体を使用してください... "0abc....z".index(i)同等に動作します。
-st0le

0あなたのスコアリング配列には賢いですが、それはまたの手段cat0権利ではありません、エラーなしで受け入れられている、と思います。それはあなたが合格できるようになるので、それは、あまりにも悪いmap(a.index,w)sum代わり(リテラルの代わりast0leが示唆するように)。

4

Perl (52)(48)

ティムウィのおかげでさらにゴルフができました

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


-eフラグがありません。
ロージャッカー

1
文字カウントには、少なくともインタープリターフラグplインタープリターフラグを含める必要があります。メタに関するこの議論を参照してください。
ヴェンテロ

syntax error at -e line 1, near "(=" Execution of -e aborted due to compilation errors.何が間違っていますか?
ユーザー不明

UNIXで実行している場合は、二重引用符を単一引用符に変更します
中国の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())))

ヒント:ソリューションからもう1つの文字を削除する方法があります。:)

2
@jloyなんて役に立つ「ヒント」。;)
Mateen Ulhaq

4

Scala: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

ところで、ドイツのウムラウトを優雅に扱います:

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

うわー、Perlバージョンよりも文字数が少ない(さらに読みやすい)。
ヘルパーメソッド

SHiNKiROUとchinesis-Perl-solutionを試しましたが、うまくいきませんでした。として保存し、までalpha.plに開始しましたperl alpha.pl。彼らはただアスキーを扱っていますか?さて-Perlにはこんな古い獣がいます... :)
ユーザー不明

PerlとUnicodeは大きな混乱です。おそらく、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

一行?私は推測するのに、これはparticularilyそれは文字を保存し、このように読めるされていません
ネイトKoppenhaver

より読みやすいソリューション(およびGoogle Guavaを使用して定型コードを削減する短いソリューション)を追加します。
ヘルパーメソッド

ASCIIを許可するだけですが、Charset.UTF-8を使用しますか?
ユーザー不明

1
文字列UTF-8は他の文字セットより短いため:-)。
ヘルパーメソッド

4

Python 3、辞書付き95文字

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

辞書はdというファイルに存在する必要があります。

Python 3、61、辞書なし、盗まれたアイデア

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


編集:検証あり:

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
これは入力を検証しません。
ロージャッカー

おっとっと!... 2番目にホールド
Ry-

3
完全なプログラムを提供すべきだと思います。C#ソリューションはコンパイルされません。クラス宣言内のMainメソッドに配置し、すべての文字をカウントする必要があります。
-Timwi

1
いいえ、そのコードは何もしないので、オブジェクト指向言語のユーザーを不利にすることは公平ではないからです。とにかくこれは有効なC#/ VB.NETです。
Ry-

3

ジョンの答えを少し改善: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

Golfscript-39文字

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

それが投げるエラーは正確に最高ではありませんが、ちょっと、実行を中止します。


私はgolfscriptについて何も知らないので、これが要件を満たしていると仮定し、あなたに勝者を宣言します!
ザック

おっと、あなたは打ち負かされました!コードのゴルフの質問を待つのに2日間では足りませんか?
ザック

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

Ruby 1.9、69

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

ASCII文字のみを処理します。Rubyは私たちの世紀のものだと思いましたか?:)
ユーザー不明

@user unknown:仕様には、そうする必要はないと書かれています。それはかなり複雑になるやって...
Lowjacker

2

GolfScript、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;}

「セットアップ」/など:

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

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

「未定義」の動作「未定義」よりも「悪い習慣」ですが、まあまあです):

  • void main() それがすべてです。
  • newなしで使用していdeleteます。

1

JavaScript 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を与えます。

説明:

  • :入力行を読み取ります
  • {... }:入力のすべての文字に適用される関数
  • A←⎕UCS⍵:現在の文字のASCII値を A
  • A-32×96<A:文字を大文字にする:from Aが32 から減算される96<A(したがって、大文字の場合)、それ以外の場合は0
  • 64-⍨:これから64を引き、A = 1、B = 2を与えます...
  • ¨:すべての文字にこの関数を適用します:
  • ⍵∊⍳26:文字が1〜26の場合...
  • :⍵:その後、⍵を返します(else節がVALUE ERRORないため、1から26でない場合はaになります)
  • +/:すべての値を合計します(この値は最終結果であるため、自動的に出力されます)。

1

JavaScript、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

Python 3、58 55

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

辞書や盗まれたアイデアはありませんが、まだ役に立たないエラー;)

thx @Eᴀsᴛᴇʀʟʏ

ここでテストします


python 2に切り替えてprint<SPACE>sum(ord(.......、式を囲む2つのかっこを削除することで、1 バイトを節約できると思います。
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋそれは正しいですが、入力が括弧で囲まれている必要があり、Python 2を昇格させたくありません;)
アレクサンダー・ニグル

PYTHON 2 IS LIFE !! また、入力を括弧で囲む必要はないと思いますか?
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋsry私は引用を意味した。input()python3であるraw_input()python2で
アレクサンダーNigl

ああ、忘れた。ふむ
Rɪᴋᴇʀ



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
検証なしの2番目の方法では、s変数宣言を削除し、Console.ReadLine()インラインを使用して、文字をさらに減らすことができます。
ハーミオイド

1

Perl(42 31)

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

F、p、a、lを1文字として数えるのが正しいと思います。


1

JavaScript、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.