柜台柜台


18

在印刷术中,计数器是指字母的全部或部分由字母形式或符号包围的区域。封闭式计数器是完全由字母形式或符号包围的计数器。您必须编写一个将字符串作为输入的程序,并在文本中打印已关闭计数器的总数。

您的输入:

  • 可以是命令行输入,也可以是STDIN的输入,但必须指定。

  • 将完全由可打印的ASCII字符组成,表示所有ASCII值(介于32和126之间)。这确实包括空格。更多信息。

现在,这确实在字体之间略有不同。例如,您正在阅读的字体将'g'视为一个封闭的计数器,而google字体将'g'视为具有两个封闭的计数器。因此,这不是问题,这里是每个字符封闭计数器的正式数量。

所有没有封闭计数器的符号:

 !"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~

请注意,这包括空间。

以下是所有带有一个封闭计数器的符号:

#0469@ADOPQRabdegopq

这是带有2个封闭计数器的所有符号:

$%&8B

最后但并非最不重要的是,这里有一些示例输入和输出。

Programming Puzzles and Code-Golf 应该打印 13

4 8 15 16 23 42 应该打印 5

All your base are belong to us 应该打印 12

Standard loopholes apply 应该打印 12

Shortest answer in bytes is the winner! 应该打印 8


1
有两个答案已提交功能而不是完整程序。虽然默认情况下允许这样做,但您的措辞却建议否则。你能澄清一下吗?
丹尼斯

您介意透露您用来计算计数器的方式吗?
Martin Ender 2015年

3
我正在查看的字体均与您提供的计数相对应。例如,在浏览器中,零通过斜线斜线给出两个计数器。android应用程序中的字体没有,但是这里g有两个关闭的计数器。您是否根据任何特定字体确定计数器?
Martin Ender 2015年

1
@DJMcMayhem'g'有1; 虽然在代码中列出了g,但它有2个。读起来有点混乱,但是我认为它的位置没有什么不同。
OJFord

1
0某些字体(尤其是许多等宽字体)没有2个封闭计数器吗?
vsz 2015年

Answers:


10

Pyth,31个字节

sm@tjC"cúÁ-ÈN%³rØ|­"3Cdz

示范。

请注意,由于使用了非ASCII字符,因此代码可能无法正确显示。正确的代码在链接上。

我为每个输入字符创建了一个所需的输出的查询表,将其旋转32以使用Pyth的模块化索引,在开头插入1,然后将其解释为以3为底的数字,得到数字2229617581140564569750295263480330834137283757。然后,我将此数字转换为以256为底的数字,并将其转换为字符串,这是答案中使用的字符串。


29

Python 3、63

print(sum(map(input().count,"#0469@ADOPQRabdegopq$%&8B$%&8B")))

一种简单的方法。用一个封闭的计数器遍历每个字符,对出现的次数求和,对具有两个封闭的计数器的字符进行两次。写相同的长度

"#0469@ADOPQRabdegopq"+"$%&8B"*2

需要使用Python 3来避免raw_input


12

CJam,41 39 37 34字节

"$%&8Badopq#0469@Rbeg"_A<eu+qfe=1b

感谢@ jimmy23013打高尔夫球3个字节!

在线尝试。

怎么运行的

"$%&8Badopq#0469@Rbeg"             e# Push that string.
                      _A<          e# Retrieve the first 10 characters.
                         eu+       e# Convert to uppercase and append.
                                   e# This pushes "$%&8Badopq#0469@Rbeg$%&8BADOPQ".
                            q      e# Read from STDIN.
                             fe=   e# Count the occurrences of each character. 
                                1b e# Base 1 conversion (sum).

2
"$%&8Badopq#0469@Rbeg"_A<eu+
jimmy23013 2015年

@ jimmy23013:我尝试了eu和的一些变体el,但从未发现。谢谢!
丹尼斯

8

sed,51岁

在@manatwork和@TobySpeight的高尔夫帮助下:

s/[$%&8B]/oo/g
s/[^#0469@ADOPQRabdegopq]//g
s/./1/g

来自STDIN的输入。考虑到这个元问题,输出是一元的:

$ echo 'Programming Puzzles and Code-Golf
4 8 15 16 23 42
All your base are belong to us
Standard loopholes apply
Shortest answer in bytes is the winner!' | sed -f countercounter.sed
1111111111111
11111
111111111111
111111111111
11111111
$ 

7

Perl,41岁

$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2

41-p标志的字符+1 。

这使用y ///来计数字符。

echo 'Programming Puzzles and Code-Golf' | perl -pe'$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2'

6

GNU APL,39个字节

+/⌈20÷⍨26-'$%&8B#0469@ADOPQRabdegopq'⍳⍞

GNU APL.js中在线尝试。

怎么运行的

                                      ⍞ Read input.
          '$%&8B#0469@ADOPQRabdegopq'⍳  Compute the indexes of the input characters
                                        in this string. Indexes are 1-based.
                                        26 == 'not found'
       26-                              Subtract each index from 26.
   20÷⍨                                 Divide those differences by 20.
  ⌈                                     Round up to the nearest integer.
+/                                      Add the results.

6

JavaScript,86

通过弹出窗口进行I / O。在运行任何代码段d最近的浏览器测试。

for(c of prompt(t=0))c='$%&8B#0469@ADOPQRabdegopq'.indexOf(c),~c?t+=1+(c<5):0;alert(t)


6

K,54 43 42 37字节

+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'

由于@JohnE,减少了5个字节!

旧版本:

f:+/(#&"#0469@ADOPQRabdegopq$%&8B$%&8B"=)'

原版的:

f:+/{2-(5="$%&8B"?x;20="#0469@ADOPQRabdegopq"?x;0)?0}'

#&在括号内可以很容易地被+/,你可以进一步去哪个手段+//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:。最后,f:由于功能可以以默认形式使用,因此不必具有。那将使您降至38!
JohnE

不幸的是,即使使用当前的38字节解决方案,其他一些解决方案也无法使用来简化查找表的技巧+//(30#"$%&8B#0469@ADOPQRabdegopq")=\:。这可能是我们能做的最好的事情。
JohnE

哈哈,我+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'

5

C,127个字节

n;f(char*i){char*o="#0469@ADOPQRabdegopq",*t="$%&8B";for(;*i;i++)if(strchr(o,*i))n++;else if(strchr(t,*i))n+=2;printf("%d",n);}

非常简单。非高尔夫版本:

int num = 0;
void f(char* input)
{
    char *one="#0469@ADOPQRabdegopq";
    char *two="$%&8B";

    for(;*input;input++)
        if(strchr(one, *input))     //If current character is found in first array
            num ++;
        else if(strchr(two, *input))//If cuurent character is found in second array
            num += 2;

    printf("%d", num);
}

在这里测试

如果不允许使用函数参数,则该stdin版本最多占用141个字节:

n;f(){char*o="#0469@ADOPQRabdegopq",*t="$%&8B",i[99],*p;gets(i);for(p=i;*p;p++)if(strchr(o,*p))n++;else if(strchr(t,*p))n+=2;printf("%d",n);}

请注意,以上版本假定输入的最大长度为98个字符。

在这里测试

命令行参数版本(143字节):

n;main(c,v)char**v;{char*o="#0469@ADOPQRabdegopq",*t="$%&8B",*p=v[1];for(;*p;p++)if(strchr(o,*p))n++;else if(strchr(t,*p))n+=2;printf("%d",n);}

在这里测试


1
@DJMcMayhem C确实还不错。尝试在Fortran 77中打高尔夫球。;)
Alex A.

5

Python 2,96 90 75 67 + 2 = 69字节

在想到xnor的解决方案之前,我一直想着没有其他办法可以做到这一点。无论如何,我都会发布。

感谢FryAmTheEggman保存6个字节

好吧,现在我对此感到满意。

感谢xnor提供的查找技巧,节省了4个字节。

添加了两个字节,因为输入需要用引号引起来。

print sum('#0469@ADOPQRabdegopq$%&8B'.find(x)/20+1for x in input())

1
我喜欢索引的巧妙使用!另外,python 3有点短,因为它使用输入而不是raw_input。
DJMcMayhem


哦,我懂了。抱歉,我将其与@DJMcMayhem的Python 3注释结合在一起。
manatwork 2015年

4

爪哇162

class C{public static void main(String[]a){System.out.print(-a[0].length()+a[0].replaceAll("[#0469@ADOPQRabdegopq]","..").replaceAll("[$%&8B]","...").length());}}

好吧,如果它必须是一个完整的程序……那只是一个单行,可以匹配字符并将它们替换为更长的字符串。然后,返回与原始长度的差值。不幸的是,java实际上并没有什么可用来统计匹配数的。

这是换行符:

class C{
    public static void main(String[]a){
        System.out.print(
                -a[0].length() +
                a[0].replaceAll("[#0469@ADOPQRabdegopq]","..")
                .replaceAll("[$%&8B]","...")
                .length()
                        );
    }
}


4

Javascript,114 95字节

alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match‌​(/9/g).length)

感谢Ismael Miguel帮助我打高尔夫球。


2
93个字节:alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Ismael Miguel 2015年

对不起,数数不清。是的,它的95
伊斯梅尔·米格尔·

3

Ruby,59个字节

a=gets;p a.count('#0469@ADOPQRabdegopq')+2*a.count('$%&8B')

从命令行或标准输入。到目前为止,使用非神秘语言最短。

更新:chilemagic击败了我


3

视网膜,44字节

1

[#0469@ADOPQRabdegopq]
1
[$%&8B]
11
[^1]
<empty line>

给出一元输出。

每行应转到其自己的文件,或者您可以使用该-s标志。例如:

> echo "pp&cg"|retina -s counter
11111

线对(样式-替换对)执行以下替换步骤:

  • 删除1
  • 用1代替反号 1
  • 用2代替反号 11
  • 删除一切,但1

3

J,43

作为功​​能:

   f=:[:+/[:,30$'$%&8B#0469@ADOPQRabdegopq'=/]
   f 'text goes here'
6

46个字节(命令行)

作为独立的命令行程序:

echo+/,30$'$%&8B#0469@ADOPQRabdegopq'=/>{:ARGV

将上面的行另存为,counter2.ijs然后从命令行调用:

$ jconsole counter2.ijs 'Programming Puzzles and Code Golf'
13

不允许将输入复制粘贴到代码中,但是可以将输入作为参数的函数是可以的。例如f=:your_function_code
randomra

2

朱莉娅77 74字节

t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)

这将从STDIN读取文本并将结果打印到STDOUT。

取消+说明:

# Read text from STDIN
t = readline()

# Print (implied) to STDOUT the length of the intersection of t with the
# 1-closed counter list joined with the duplicated intersection of t with
# the 2-closed counter list
length(join(t ∩ "#0469@ADOPQRabdegopq") * join(t ∩ "\$%&8B")^2)

例:

julia> t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)
Programming Puzzles and Code Golf
13

2

rs,56个字节

_/
[#0469@ADOPQRabdegopq]/_
[$%&8B]/__
[^_]/
(_+)/(^^\1)

现场演示。


仅供参考:我为rs创建了一个存根esolangs页面。您可能希望添加到此
文件

@ mbomb007哇!!那让我很开心。:D
kirbyfan64sos 2015年

嗯,“ rs”在Google或其他任何工具中都不会出现,因为它只有两个字母。这样,人们可以找到它。:)
mbomb007

2

GNU APL,37个字符

+/,⍞∘.=30⍴'$%&8B#0469@ADOPQRabdegopq'

构造一个字符向量,该字符向量两次包含两个反向字符(30个字符)

比较每个输入字符与向量中的每个字符(∘。=)

总结混乱的比赛(+ /,)


1

Javascript 159、130字节

function c(b){return b.split("").map(function(a){return-1!="$%&8B".indexOf(a)?2:-1!="#0469@ADOPQRabdegopq".indexOf(a)?1:0}).reduce(function(a,b){return a+b})};

未缩小:

function c(b) {
    return b.split("").map(function(a) {
        return -1 != "$%&8B".indexOf(a) ? 2 : -1 != "#0469@ADOPQRabdegopq".indexOf(a) ? 1 : 0
    }).reduce(function(a, b) {
        return a + b
    })
};

在@ edc65的帮助下:

function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}

2
作为~ -1 == 0,您可以写~x?而不是-1 != x?。请参阅我的答案以获取使用示例。
edc65

2
function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}map那就不需要了reduce
edc65

1

哈斯克尔(117)

a="#0469@ADOPQRabdegopq"
b="$%&8B"
c n[]=n
c n(x:s)
 |e a=f 1
 |e b=f 2
 |True=f 0
 where
 e y=x`elem`y
 f y=c(n+y)s

c是一个函数c :: Int -> String -> Int,它接受一个计数器和一个字符串,并一次检查一个字母,检查当前字母是否是1点数组或2点数组的成员,并在递增后调用其余字符串柜台的适当数量。

用ghci中的counter = 0调用:

ghci> c 0 "All your base are belong to us"
12

1

C#,157

void Main(string s){int v=0;v=s.ToCharArray().Count(c=>{return "#0469@ADOPQRabdegopq".Contains(c)||"$%&8B".Contains(c)?++v is int:false;});Console.Write(v);}

取消高尔夫:

void Main(string s)
{
    int v = 0;

    v = s.ToCharArray()
    .Count(c => 
    {
        return "#0469@ADOPQRabdegopq".Contains(c) || "$%&8B".Contains(c) ? ++v is int:false;
    });

    Console.Write(v);
}

将字符串转换为char数组,然后查看每个char是否在两个计数器中。如果它在第二个中,我只是让它再次增加计数器。


1

Erlang,103个字节

这是一个使用escript运行的完整程序。文件的第一行必须为空白(添加1个字节)。

main([L])->io:write(c(L,"#0469@ADOPQRabdegopq")+2*c(L,"$%&8B")).
c(L,S)->length([X||X<-L,S--[X]/=S]).

样品运行:

$ escript closed.erl 'Shortest answer in bytes is the winner!'
8$

欢迎使用PPCG,c(L,“#0469 @ ADOPQRabdegopq”)+ 2 * c(L,“#0469 @ ADOPQRabdegopq $%&8B $%&8B”)长5个字节:)。
Katenkyo

@Katyenko,谢谢你的建议。遗憾的是,对于某些输入,它无法正常工作。“ $%&8B”计数为5,但应为10。c / 2函数通过过滤掉不属于一组字符的字符串的字符(例如“ $%&8B”)来工作。它通过从集合中删除要测试的char,然后将结果与原始集合进行比较来检查是否包含集合。如果它们不相等,则字符位于集合中,并且将其包括在内。集合中字符的多个副本没有任何作用。
Edwin Fine

Ho,我明白了,我不知道erlang,以为您使用的是字符串来计算计数器:3。无论如何,没关系,做得好:)
Katenkyo

0

C,99字节

n;f(char*i){for(char*o="#0469@ADOPQRabdegopq$%&8B",*t=o+20;*i;)n+=2-!strchr(o,*i)-!strchr(t,*i++);}

说明

我进一步打高尔夫,酷家伙的答案;太久了,无法发表评论。代替了if/ else,我利用了!将指针转换为bool的优势。我还进行了o包含,t以便可以在计数器总数中添加“在o”和“在t”。

扩展代码

#include <string.h>
int num = 0;

void f(char* input)
{
    char *one = "#0469@ADOPQRabdegopq"  "$%&8B";
    char *two = strchr(one, '$');

    while (*input) {
        num += 2 - !strchr(one, *input) - !strchr(two, *input));
        ++input;
    }
}

输出为in num,必须在每次调用前将其清除。

测试程序和结果

#include <stdio.h>
int main() {
    const char* a[] = {
        "Programming Puzzles and Code-Golf",
        "4 8 15 16 23 42",
        "All your base are belong to us",
        "Standard loopholes apply",
        "Shortest answer in bytes is the winner!",
        NULL
    };
    for (const char** p = a;  *p;  ++p) {
        n=0;f(*p);
        printf("%3d: %s\n", n, *p);
    }
    return 0;
}
 13: Programming Puzzles and Code-Golf
  5: 4 8 15 16 23 42
 12: All your base are belong to us
 12: Standard loopholes apply
  8: Shortest answer in bytes is the winner!
 37: n;f(char*i){for(char*o="#0469@ADOPQRabdegopq$%&8B",*t=o+20;*i;)n+=2-!strchr(o,*i)-!strchr(t,*i++);}

该代码本身按其自己的度量标准包含37个计数器。

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.