字母数字平衡


15

编写一个程序,该程序以字符串作为输入,并计算其中的字母数字和非字母数字字符的数量。它必须显示如下结果:

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

要注意的是,您的源代码必须具有与非字母数字字符相同数量的字母数字字符。不允许注释,空格被忽略。(显然,称为“ 空白 ”的语言可能会竞争选票,但显然不会被选为获胜者)

代码中的字符必须至少具有一些次要理由,它们不应完全多余。例如,允许使用更长的变量名,i = (j*3)+4;而不是i = j*3+4;也允许。但是,i = i + 1;;;;;;事实并非如此。

除此之外,还适用标准代码高尔夫球规则。


如果我定义OOK的一个新的变种预处理在关键字O.O?以及O!任何程序我写符合角色职业限制......当然这是有可能失去在长度业务。
dmckee ---前主持人小猫,2014年

2
都是ascii吗?
Jordon Biondo

@JordonBiondo:我在想从完整的8位ANSI到unicode的任何内容,但是如果您的代码仅支持7位ASCII,我也会接受。
vsz 2014年

3
输出字符串中的空格是否计入非字母数字?还是忽略了所有其他(非字符串文字)空格?
Kninnug 2014年

1
@dmckee:如果要定义自己的语言,只需定义一种选择的语言变体,其中非空程序的工作方式与基本语言相同,但是将空程序预处理为代码,该代码可以完成问题要求。
user2357112支持Monica 2014年

Answers:


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个字节被忽略为空白。


看来您假设输入仅在一行上...在规范中我没有看到任何关于此的信息?另外,第一次替换中/ x标志的理由是什么?
skibrianski 2014年

@skibrianski:(a)关于“字符串”的规范问题不太清楚。现在,我添加了一个可以读取整个文件的变体。(b)我也不清楚脚本应如何处理空白。我的解释是在任务和分数中都忽略了空格。(c)/ x标志允许图案中的空白以提高可读性。更新的答案将使用它。
Heiko Oberdiek

关于a),作者没有对字符串中的内容进行任何说明,因此我认为做出假设是不明智的,对我而言,这意味着必须允许换行。关于b)同意,目前尚不清楚。Re c)是的,但是在您的答案中,空格并没有增加我的可读性,只是增加了一个字母数字字符...也许我在这一点上太难了,但向我揭示了您仅使用/ x在您的一个正则表达式中,大概添加了最后一个额外的字母数字以使计数对齐=)我还是喜欢您的回答。我煮了差不多的东西。
skibrianski 2014年

哈哈,现在我们有了基本上相同的代码=)好秀=)
skibrianski 2014年

@skibrianski::-)谢谢,您给我一个理由,请发布其他版本稍有不同的版本。但是字节数仍然保留。
Heiko Oberdiek 2014年

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
$ 

呜呜 -它甚至击败golfscript!;-)
Digital Trauma 2014年

控制字符呢?[:alnum:]不是[:punct:]的反数。尝试例如head -c256 / dev / urandom | tr -d [:alnum:] [:punct:]
skibrianski 2014年

@skibrianski好点。我已经编辑了答案以考虑到这一点。
Digital Trauma 2014年

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

GolfScript,74个字符(= 37 + 37)

{+}:PLUS;.,.@10,''*26,{65PLUS.32|}%PLUS$-,\1$-' + 'PLUS\PLUS' = 'PLUS\PLUS

以代码为输入的在线测试代码。


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

@Gigaflop我编辑了它。print语句仅适用于Python 2,的反引号语法也是如此repr
mbomb007 '18

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>。我也将三部曲算作每个三个字符,这也许值得商bat。请注意,在使用其自身的源代码测试该程序时,需要采取一些措施以防止在字符串文字中替换trigraph。

这里有一些特殊的设计决策-在大多数生产代码中,您不会在同一函数中遇到三字组合和基于范围的for循环-但我认为这一切都在“合理”的范围内。


1

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

使用切片的次要理由:可以加快切片速度(也许吗?)


尝试使用Python 2,因为print不需要括号,请使用'%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,$ \会自动添加到每个打印请求中,并将总计数放在末尾。


我的第一遍密码有66个字符。感谢Heiko Oberdiek展示了您可以通过将$ /设置为$,=来减少$ /的字符数
skibrianski 2014年

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

注意 程序将忽略计数中的空格,制表符和换行符。


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.";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.