英数字バランス


15

入力として文字列を取得し、その中の英数字および非英数字の数をカウントするプログラムを作成します。次のように結果を表示する必要があります。

入力:http://stackexchange.com
出力:20 + 4 = 24

問題は、ソースコードに英数字以外の文字と同じ数の英数字を使用する必要があることです。コメントは許可されません。空白は無視されます。(ホワイトスペースと呼ばれる言語は投票のために競争するかもしれませんが、明らかに勝者として選択されません)

コード内の文字には、少なくとも多少の正当化が必要です。完全に不必要であってはなりません。たとえば、長い変数名も許可されますが、i = (j*3)+4;代わりにi = j*3+4;許可されます。しかし、そうでi = i + 1;;;;;;はありません。

これに加えて、標準のコードゴルフ規則が適用されます。


私は、キーワードはOOKの新しい、前処理されたバリアントを定義した場合O.O?O!して、任意のプログラムI書き込みは、文字クラスの制限を満たしている...もちろん、それはおそらく長事業に失うことがあります。
dmckee

2
それはすべてアスキーですか?
ジョーダンビオンド

@JordonBiondo:フル8ビットANSIからユニコードまで何でも欲しいと考えていましたが、コードが7ビットASCIIのみをサポートしている場合は、それも受け入れます。
vsz

3
output-string内の空白は非英数字にカウントされますか?または、他のすべての(非文字列リテラル)空白で無視されますか?
Kninnug

1
@dmckee:独自の言語を定義する場合は、選択した言語のバリアントを定義するだけで、空でないプログラムは基本言語と同じように機能しますが、空のプログラムは前処理されたコードを正確に処理します質問が求められます。
user2357112は、0:56にMonica

回答:


8

Perl、32 + 32 = 64

文字列はSTDINで期待されています。出力はSTDOUTに書き込まれます。空白は無視されます。タスクの私の解釈は、プログラムがそれ自体で実行してスコアを取得できる必要があるということです。

$/ = $,;
$_ = <>;
s x\sxxg;
$\ = length;
print s x[0-9a-z]xxgi,
      ' + ',
      s x.xxg,
      ' = '

コメントなしでゴルフ

$/ = $,; # The input separator becomes undefined, because the default for $, is "undef"
$_ = <>; # now $_ takes the whole file (STDIN) instead of the first line
s x\sxxg; # $_ =~ s/\s//g;
          # white space is removed from $_
$\ = length; # The number of the other characters are put into $\,
             # which is automatically printed the end of "print".
print s x[0-9a-z]xxgi, # s/[0-9a-z]//gi
                       # Remove alphanumeric characters and return their count
      ' + ',
      s x.xxg, # s/.//g
               # Remove the remaining special characters and return their count.
               # "." does not catch new lines, but we have already
               # removed white spaces including new lines.
      ' = '

同じバイトカウントのバリエーションがいくつか見つかりました。たとえば:

$/ = $x;
$_ = <>, s x\sxxg;
$\ = split $x;
print s x[\da-z]xxgi,
      " + ",
      s x.xxg,
      ' = '

  • 質問の例:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • 自身で実行(a.pl):

    cat a.pl | perl a.pl
    32 + 32 = 64

    ファイルサイズは104バイトであるため、40バイトは空白として無視されます。

Perl、29 + 29 = 58

$_=<>;s x\sxxg;$\=length;print s x[0-9a-z]xxgi,' + ',s/.//g,' = '

文字列はSTDINで想定されており、最初の行に制限されています。結果はSTDOUTに出力されます。空白は無視されます。

非ゴルフ

$_ = <>;
s x\sxxg; # same as s/\s//gx; removes white space;
$\ = length($_); # sum is automatically appended at the end of print
print sx[0-9a-z]xxgi, # same as s/[0-9a-z]//gi;
                      # the number of alphanumeric characters
      ' + ',
      s/.//g, # the number of the remaining special characters
      ' = '

ファイルa.plにはPerlスクリプトが含まれています。

  • 質問の例:

    echo 'http://stackexchange.com' | perl a.pl
    20 + 4 = 24
  • 自分自身で実行する:

    cat a.pl | perl a.pl
    29 + 29 = 58

    のファイルサイズa.plは65バイトなので、7バイトは空白として無視されます。


入力は1行のみであると仮定しているようです...それについては仕様に何も見ていませんか?また、最初の置換で/ xフラグを正当化する理由は何ですか?
skibrianski 14年

@skibrianski:(a)「string」の仕様についての質問はあまり明確ではありません。ファイル全体を読み取ることができるバリアントを追加しました。(b)また、スクリプトによって空白がどのように扱われるべきか、私には明らかではありません。私の解釈では、タスクとスコアの両方で空白は無視されます。(c)/ xフラグを使用すると、パターン内の空白が読みやすくなります。更新された答えはそれを利用します。
ヘイコオベルディク14年

a)について、著者は文字列に何が含まれるかについて何も言わないので、推測をするのは賢明ではないと思いますが、これは改行を許可する必要があることを意味します。Re b)同意したが、明確ではない。c)正しいが、あなたの答えでは、ホワイトスペースは私の目に読みやすさを追加しません、それは単に英数字を追加します...多分私はこの点であまりにも難しいかもしれませんが、/ xだけを使用していることを私に明らかにしていますあなたの正規表現の1つで、おそらく最後の1つの余分な英数字を追加してカウントを揃える=)まだあなたの答えが好きです。似たようなものを作りました。
skibrianski 14年

ハハ今、私たちは本質的に同一のコードを持っています=)良いショー=)
skibrianski 14年

@skibrianski::-)おかげで、少し違いがある他の亜種を投稿する理由を教えてくれます。ただし、バイトカウントは残ります。
ヘイコオベルディク14年

6

C-96(48 + 48)文字

多少読みやすいです。ただし、改善の余地があります。

i,j;main(_){while((_=getchar())>=0)isspace(_)||(isalnum(_)?i++:j++);printf("%i + %i = %i",i,j
,i+j);}

5

Bash + coreutils、72(36 + 36)の非空白文字

a=`tr -dc [:alnum:]<<<$1|wc -c`
n=`tr -dt [:space:]<<<$1|wc -c`
echo $a + $[n-a] = $n

出力:

$ ./alnumbalance.sh http://stackexchange.com 
20 + 4 = 24
$ ./alnumbalance.sh "$(cat alnumbalance.sh)"
36 + 36 = 72
$ 

前の答え:

Pure Bash、92(46 + 46)非空白文字

nosp=${1//[[:space:]]}
noaln=${nosp//[[:alnum:]]}
echo $[${#nosp}-${#noaln}] + ${#noaln} = ${#nosp}

出力:

$ ./alnumbalance.sh http://stackexchange.com 
20 + 4 = 24
$ ./alnumbalance.sh "$(cat alnumbalance.sh)"
46 + 46 = 92
$ 

ウーフー-それはさらにゴルフスクリプトを打ち負かす!;-)
デジタル外傷

制御文字はどうですか?[:alnum:]は[:punct:]の逆ではありません。例:head -c256 / dev / urandom | tr -d [:alnum:] [:
punct

@skibrianski良い点。これを考慮して回答を編集しました。
デジタル外傷14年

3

PowerShell(43 + 43 = 86)

ゴルフ

function alf($i){$a=0;$n=0;[char[]]$i|%{if($_-match"[a-zA-Z0-9]"){$a++}else{$n++}}; write-host "$a+$n=$($a+$n)"}

ゴルフをしていない

function alf($i){
    $a=0;$n=0;  
    [char[]] $i | %{ if ($_ -match "[a-zA-Z0-9]") { $a++ } else { $n++ } };
    write-host "$a+$n=$($a + $n)"
}

テスト

PS > alf "http://stackexchange.com"
20+4=24

基準に合格するためのコード自体でのテスト

PS > alf "function alf($i){$a=0;$n=0;[char[]]$i|%{if($_-match`"[a-zA-Z0-9]`"){$a++}else{$n++}}; write-host `"$a+$n=$($a+$n)`"}"
43+43=86

" 文字列の一部ではない `でエスケープされています。



2

ルビー38 + 38 = 76

このプログラムは、入力の末尾の改行をカウントします。

puts"#{a=gets.scan(/[a-z0-9]/i).length}+#{b=$_.scan(/\W|_/).length}=#{a+b}"

文字カウントはプログラム自体によって行われます:$ ruby alphabalance.rb alphabalance.rb:)


2

Powershell、70バイト(= 35 + 35)

param($s)"$(($l=$s.Length)-($n=($s|sls '\W' -a).Matches.Count))+$n=$l"

テストスクリプト:

$f = {
param($s)"$(($l=$s.Length)-($n=($s|sls '\W' -a).Matches.Count))+$n=$l"
}

&$f "http://stackexchange.com"
&$f $f.toString().Trim()

出力:

20+4=24
35+35=70

Powershell、70バイト(= 35 + 35)、代替

"$(($l="$args"|% Length)-($n=($args|sls '\W'-a).Matches.Count))+$n=$l"

2

Python 2(60 + 60 = 120)

難しいことですが、おそらく改善の余地があります。事実と同様に、関数自体を使用して、独自の英数字バランスを評価できます。

def f(s):
 i=j=0
 for c in s:
  t=ord(c)
  if (t!=2**5): 
   i+=1  
  if (48<=t<=57 or 65<=t<=90 or 97<=t<=122):
   j+=1 
 print `j`,'+',`i-j`,'=',i      

テスト:

>>> f("http://stackexchange.com")
20 + 4 = 24

これはPythonのどのバージョンですか?
ギガフロップ

@Gigaflop編集しました。printステートメントはPython 2のみであり、のバックティック構文も同様ですrepr
mbomb007

1

C ++、146(73 + 73)178(89 + 89)非空白文字#

<algorithm>正当な理由なしにオリジナルが含まれています。おっとっと。

//create a test string
#include<string>
std::string a = "\?\?=include <cstdio>\
int x,y;\
int main()\?\?<\
    for(char c : a)\
            !isspace(c) ? (isalnum(c) ? y++ : x++) : 0;\
    printf(\"%d\?\?/t%c\?\?/t%d\?\?/t%c\?\?/t%d\?\?/n\",y,'+',x,'=',(x+y));\
\?\?>";

//Code itself starts here
??=include <cstdio>
int x,y;
int main()??<
    for(char c : a)
        !isspace(c) ? (isalnum(c) ? y++ : x++) : 0;
    printf("%d??/t%c??/t%d??/t%c??/t%d??/n",y,'+',x,'=',(x+y));
??>

後の行の文字のみを数えてい//Code itself starts hereます。特に、これはを数えないことを意味します#include <string>。また、トライグラフをそれぞれ3文字として数えていますが、これはおそらく議論の余地があります。独自のソースコードでプログラムをテストする際には、文字列リテラル内の3文字表記の置換を防ぐために注意が必要であることに注意してください。

ここにはいくつかの特異な設計上の決定があります-ほとんどの製品コードでは、同じ関数内で3文字表記と範囲ベースのforループに出会うことはありませんが、私はすべて「正当化可能」の範囲内だと思います。


1

python 52 +52 = 104

Pythonは英数字以外の文字を使用しないため、興味深い問題が発生します。

def f(_):
    _=_.replace(" ","");l=len(_);a=sum([c.isalnum() for c in _][:l]);print("{0} + {1} = {2}".format(a,l-a,l))

スライスを使用するための小さな正当化:それはそれをスピードアップします(たぶん?)


print括弧を必要としないため、Python 2 を使用し、'%d + %d = %d' % (a,l-a,l)メソッドを使用してみてください。それはいくつかの文字を保存する必要があります。
mbomb007

1

ジュリア、64

f(s)=(b=endof(s);a=sum([isalnum(c) for c in s]);"$(a) + $(b-a) = $(b)";)

不必要な英数字以外の文字はすべて、文字列のフォーマットの最後;と一部です()。ほとんど完全にバランスが取れており、2の累乗として多くの手間がかかりません。

julia> f("http://stackexchange.com")
"20 + 4 = 24"
julia> nowhite(s)=join(split("s"," "))
julia> f(nowhite("f(s)=(b=endof(s);a=sum([isalnum(c) for c in s]);\"\$(a)+\$(b-a)=\$(b)\";)"))
"32 + 32 = 64"

1

perl、64個の非空白文字:

$/=$,;
$_=<>;
s 0\s00g;
$\=length;
print s 1[a-z0-9]11ig .
      " + " .
      s 2.22g .
      " = "

perl -MO = Deparseおよびいくつかのコメントを介してわずかに明確になりました:

$/ = $,;               # input record separator = a variable defaulting to undef
$_ = <ARGV>;           # slurp stdin
s/\s//g;               # strip whitespace
$\ = length $_;        # output record separator = total length of string sans whitespace
print s/[a-z0-9]//gi . ' + ' . s/.//g . ' = '; # count alphanumerics, then everything else

ORSの$ \は、printを呼び出すたびに自動的に追加され、合計カウントが最後に追加されます。


私の最初のパスで66文字がありました。Heiko Oberdiekに、$に設定することで、より少ない文字で$ /を設定解除できることを示してくれたことに感謝します=)
skibrianski 14年

1

Python 2、50 + 50 = 100

import re
def f(i):
    w = re.sub('\s', '', i)
    s = re.subn('[\W_]', '', w)
    a = len(s[0])
    print '%d + %d = %d' % (a, s[1], a+s[1])

ここで実行:http : //repl.it/8CH


0

Rebol(64 + 64 = 128)

f: func [x] [
    c: :charset
    a: c [#"a" - #"z"]
    s: c [#" " #"^/" #"^-"]
    n: complement union a s
    a+: n+: 0
    parse x [
        some [
            a (++ a+) |
            n (++ n+) |
            s
        ]
    ]
    print [a+ "+" n+ "=" a+ + n+]
]

使用例(Rebolコンソール内):

>> f "http://stackexchange.com"
20 + 4 = 24

NB。プログラムは、カウントからスペース、タブ、改行を無視します。


0

J-46 + 46 = 92

空白を数えるので、修正なしではセルフテストできません。stdinで入力を受け取ります。口が悪いので、石鹸で洗い流してください。

;":&.>(+/;' + ';(#-+/);' = ';#)(e.~1!:1@1:)(,toupper)'golfscriptSUCKSabdehjkmnquvwxyz',,":"0 i.10

使用法:

   ;":&.>(+/;' + ';(#-+/);' = ';#)(e.~1!:1@1:)(,toupper)'golfscriptSUCKSabdehjkmnquvwxyz',,":"0 i.10
http://stackexchange.com
20 + 4 = 24

   NB. modification for self-test:    vvvvvv - remove spaces, the only whitespace
   ;":&.>(+/;' + ';(#-+/);' = ';#)(e.~' '-.~1!:1@1:)(,toupper)'golfscriptSUCKSabdehjkmnquvwxyz',,":"0 i.10
;":&.>(+/;' + ';(#-+/);' = ';#)(e.~1!:1@1:)(,toupper)'golfscriptSUCKSabdehjkmnquvwxyz',,":"0 i.10
46 + 46 = 92

0

Javascript-76(38 + 38)

_ = prompt()
o = _.match(/[a-z0-9]/gi).length
$ = _.length - o
alert(o + " + " + $ + " = " + (o + $))

サンプル入力:http://stackexchange.com
出力:20 + 4 = 24

自分で実行する:

var a  = '_ = prompt()o = _.match(/[a-z0-9]/gi).length$ = _.length - oalert(o + " + " + $ + " = " + (o + $))'

var letters = a.match(/[a-z0-9]/g).length; 
var nons = a.match(/[^a-z0-9 ]/g).length; // excludes whitespace from count

console.log(nons + " = " + letters); // 38 = 38 :)

PS (o + $)英数字のバランスを維持するために行われていることに関心がある人にとっては、そうではありません。なぜなら、o + " + "JSを見ると、すべて+が数字の加算器ではなく文字列の連結子であると判断するからです。したがって、括弧が必要です。または20 + 4なる204よりむしろ24:D

ハッピーコーディング!


0

Clojure:(31 + 31 = 62)非空白文字

(def ff #(let [c count y (c %) x (c (re-seq #"\w" %))] (str x " + " (- y x) " = " y)))

出力:

alphabalance.core=> (ff "http://stackexchange.com")
"20 + 4 = 24"

0

CJam、27 + 27 = 54

CJamはこのチャレンジよりも数か月新しいため、この回答は緑色のチェックマークの対象外です。とにかく楽しい運動でした!

ea0=eu{A,s'[,65>+#)g}%_:+1@f-:+ea0=,]"DODDaD"36f-3/]zo

入力文字列をコマンドライン引数として受け取るため、オンラインインタープリターでは機能しませんが、Javaインタープリターでテストできます

説明

"Distinguish alphanumeric characters:";
ea0=eu{A,s'[,65>+#)g}%
ea0=                   "Get the first command-line argument.";
    eu                 "Convert it to upper case.";
      {             }% "Map this block onto each character.";
       A,s             "Get the string '0123456789'.";
          '[,          "Get a string with all characters from the null byte to Z.";
             65>       "Remove the first 65 characters, to leave A to Z.";
                +      "Add to digit.";
                 #     "Find character in that string. Returns -1 if not alphanumeric.":
                  )g   "Increment and get signum. Yields 1 for alphanumeric characters,
                        0 otherwise.";

"Now we've got an array of 0s and 1s. Let's do the counting:";
_:+1@f-:+ea0=,]
_               "Duplicate array.";
 :+             "Get the sum. This is the number of alphanumeric characters.";
   1@           "Push a 1 and pull up the other copy of the array.";
     f-         "Subtract each element from 1, this swaps 0s and 1s.";
       :+       "Get the sum. This is the number of symbol characters.";
         ea0=   "Get the first command-line argument again.";
             ,  "Get its length. This is the total number of characters.";
              ] "Collect everything in an array.";

"And now the formatting:";
"DODDaD"36f-3/]zo
"DODDaD"          "Push this string.";
        36f-      "Subtract 36 from each character. This yields ' +  = '.";
            3/    "Split into two halves of 3 characters each.";
              ]   "Wrap this and the previous array in another array.";
               z  "Zip. Transposes the array to interleave strings with numbers.";
                o "Output the resulting array without delimiters.";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.