Quầy truy cập


18

Trong kiểu chữ, bộ đếm là khu vực của một chữ cái được bao bọc hoàn toàn hoặc một phần bởi một hình thức chữ cái hoặc ký hiệu. Một bộ đếm kín là một bộ đếm được bao quanh hoàn toàn bởi một hình thức chữ cái hoặc ký hiệu. Bạn phải viết một chương trình lấy một chuỗi làm đầu vào và in tổng số bộ đếm đã đóng trong văn bản.

Đầu vào của bạn:

  • Có thể là đầu vào dòng lệnh hoặc từ STDIN, nhưng bạn phải chỉ định cái nào.

  • Sẽ bao gồm toàn bộ các ký tự ASCII có thể in, nghĩa là tất cả các giá trị ASCII nằm trong khoảng từ 32 đến 126. Điều này không bao gồm không gian. Thêm thông tin.

Bây giờ, điều này không thay đổi một chút giữa các phông chữ. Ví dụ: phông chữ bạn đang đọc này được coi là 'g' có một bộ đếm đóng, trong khi phông chữ google có 'g' với hai bộ đếm đóng. Vì vậy, đây không phải là một vấn đề, đây là số lượng chính thức của bộ đếm đóng cho mỗi ký tự.

Tất cả các biểu tượng không có quầy đóng:

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

Lưu ý rằng điều này bao gồm không gian.

Dưới đây là tất cả các biểu tượng với một bộ đếm kín:

#0469@ADOPQRabdegopq

Và đây là tất cả các biểu tượng với 2 quầy đóng:

$%&8B

Và cuối cùng nhưng không kém phần quan trọng, đây là một số mẫu đầu vào và đầu ra.

Programming Puzzles and Code-Golf nên in 13

4 8 15 16 23 42 nên in 5

All your base are belong to us nên in 12

Standard loopholes apply nên in 12

Shortest answer in bytes is the winner! nên in 8


1
Hai câu trả lời đã gửi chức năng thay vì các chương trình đầy đủ. Mặc dù điều đó được cho phép theo mặc định, từ ngữ của bạn gợi ý khác. Bạn có thể làm rõ?
Dennis

Bạn có phiền khi tiết lộ những gì bạn sẽ sử dụng để đếm các quầy?
Martin Ender

3
Không có phông chữ nào tôi đang xem câu hỏi tương ứng với số lượng bạn đã đưa ra. Ví dụ, trong trình duyệt, số 0 có một đường chéo chéo qua nó, đưa ra hai bộ đếm. Phông chữ trong ứng dụng Android thì không, nhưng ở đây gcó hai quầy đóng. Bạn đã xác định các quầy dựa trên bất kỳ phông chữ cụ thể?
Martin Ender

1
@DJMcMayhem 'g' có 1; mặc dù nơi được liệt kê trong mã, gcó 2. Hơi khó đọc, nhưng tôi không nghĩ nó khác nhau theo vị trí.
OJFord

1
Không 0có 2 bộ đếm đóng trong một số phông chữ nhất định, đặc biệt là nhiều phông chữ đơn cách?
vsz

Câu trả lời:


10

Bình thường, 31 byte

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

Trình diễn.

Lưu ý rằng mã có thể không được hiển thị đúng do sử dụng các ký tự không phải ASCII. Mã chính xác là ở liên kết.

Tôi đã tạo một bảng tra cứu đầu ra mong muốn cho mỗi ký tự đầu vào, xoay nó 32 để sử dụng lập chỉ mục mô-đun của Pyth, bắt đầu 1 ở đầu và hiểu nó là số 3 cơ sở, đưa ra số 2229617581140564569750295263480330834137283757. Sau đó tôi đã chuyển đổi số này thành cơ sở 256 và chuyển đổi nó thành một chuỗi, đó là chuỗi được sử dụng trong câu trả lời.


29

Trăn 3, 63

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

Một cách tiếp cận đơn giản. Lặp lại trên mỗi ký tự với một bộ đếm đóng, tổng hợp số lần xuất hiện, làm như vậy hai lần cho các ký tự có hai bộ đếm đóng. Thay vào đó, nó sẽ có cùng độ dài để viết

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

Python 3 là cần thiết để tránh raw_input.


12

CJam, 41 39 37 34 byte

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

Cảm ơn @ jimmy23013 vì đã chơi golf 3 byte!

Hãy thử trực tuyến.

Làm thế nào nó hoạt động

"$%&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

@ jimmy23013: Tôi đã thử một vài biến thể euel, nhưng tôi chưa bao giờ thấy điều đó. Cảm ơn!
Dennis

8

sed, 51

Với sự giúp đỡ chơi golf từ @manatwork và @TobySpeight:

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

Đầu vào từ STDIN. Với câu hỏi meta này , đầu ra là đơn nhất:

$ 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

41ký tự +1 cho -pcờ.

Điều này sử dụng y /// để đếm các ký tự.

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

6

GNU APL, 39 byte

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

Dùng thử trực tuyến trong GNU APL.js .

Làm thế nào nó hoạt động

                                      ⍞ 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 thông qua cửa sổ bật lên. Chạy đoạn mã trong bất kỳ trình duyệt d gần đây để kiểm tra.

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 byte

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

Cắt bỏ 5 byte nhờ @JohnE!

Phiên bản cũ hơn:

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

Nguyên:

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

Các #&parens bên trong có thể dễ dàng như vậy +/, có nghĩa là bạn có thể đi xa hơn +//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:. Cuối cùng, không cần thiết phải có f:vì hàm có thể được sử dụng ở dạng ngầm. Điều đó sẽ đưa bạn xuống 38!
JohnE

Thật không may, một vài giải pháp khác đã sử dụng để thu gọn bảng tra cứu đã hết ngay cả với giải pháp 38 byte hiện tại : +//(30#"$%&8B#0469@ADOPQRabdegopq")=\:. Đây có thể là điều tốt nhất chúng ta có thể làm.
JohnE

haha, tôi đã sớm đăng bài đó hơn là tôi đã cứu một nhân vật:+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
JohnE

5

C, 127 byte

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

Khá đơn giản. Phiên bản bị đánh cắp:

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

Kiểm tra nó ở đây

Nếu các đối số chức năng không được phép, thì stdinphiên bản sẽ chiếm tới 141 byte:

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

Lưu ý rằng phiên bản trên giả định rằng đầu vào dài tối đa 98 ký tự.

Kiểm tra nó ở đây

Phiên bản đối số dòng lệnh (143 byte):

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

Kiểm tra nó ở đây


1
@DJMcMayhem C thực sự không tệ. Hãy thử chơi gôn ở Fortran 77 .;)
Alex A.

5

Python 2, 96 90 75 67 + 2 = 69 byte

Không thể nghĩ ra bất kỳ cách nào khác để làm điều này ... là những gì tôi đã nghĩ cho đến khi tôi thấy giải pháp của xnor. Tôi sẽ đăng những gì tôi đã có.

Cảm ơn FryAmTheEggman vì đã lưu 6 byte

Được rồi, bây giờ tôi hài lòng với điều này.

Nhờ xnor cho thủ thuật tìm kiếm, tiết kiệm 4 byte.

Đã thêm hai byte vì đầu vào cần phải được đặt trong dấu ngoặc kép.

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

1
Tôi thích việc sử dụng chỉ số thông minh! Ngoài ra, python 3 ngắn hơn một chút vì nó sử dụng đầu vào thay vì raw_input.
DJMcMayhem


Ồ, tôi hiểu rồi. Xin lỗi, tôi đã kết hợp nó với bình luận Python 3 của @ DJMcMayhem.
manatwork

4

Java, 162

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

Vâng, nếu nó là một chương trình đầy đủ ... Nó chỉ là một one-liner rằng trận đấu nhân vật và thay thế chúng bằng một chuỗi dài hơn. Sau đó, trả về sự khác biệt về chiều dài từ bản gốc. Thật không may, java thực sự không có gì để chỉ đếm số lượng trận đấu.

Đây là dòng ngắt dòng:

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 byte

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

Cảm ơn Ismael Miguel đã giúp tôi chơi golf này.


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

Xin lỗi vì đã đếm kém. Vâng, nó là 95.
Ismael Miguel

3

Ruby, 59 byte

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

Nhập từ dòng lệnh hoặc stdin. Ngắn nhất cho đến nay bằng cách sử dụng một ngôn ngữ phi bí truyền.

Cập nhật: chilemagic đánh tôi


3

Võng mạc , 44 byte

1

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

Cung cấp đầu ra trong unary.

Mỗi dòng nên đi đến tập tin riêng của nó hoặc bạn có thể sử dụng -scờ. Ví dụ:

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

Các cặp dòng (mẫu - cặp thay thế) thực hiện các bước thay thế sau:

  • Hủy bỏ 1's
  • Thay thế 1 chữ cái với 1
  • Thay thế 2 chữ cái với 11
  • Remove tất cả mọi thứ nhưng 1's

3

J, 43

Là một chức năng:

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

46 byte (dòng lệnh)

Là một chương trình dòng lệnh độc lập:

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

Lưu dòng trên counter2.ijsvà gọi từ dòng lệnh:

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

Sao chép-dán đầu vào vào mã không được phép nhưng một chức năng có thể lấy đầu vào làm đối số là được. Ví dụ f=:your_function_code.
ngẫu nhiên

2

Julia, 77 74 byte

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

Điều này đọc văn bản từ STDIN và in kết quả sang STDOUT.

Ungolfed + giải thích:

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

Thí dụ:

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

2

rs , 56 byte

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

Bản thử trực tiếp.


Chỉ là một fyi: Tôi đã tạo ra một trang esolang còn sơ khai cho rs. Bạn có thể muốn thêm vào nó: esolangs.org/wiki/Rs
mbomb007

@ mbomb007 WOW !! Điều đó chỉ làm cho tôi ngày. : D
kirbyfan64sos

Chà, "rs" không xuất hiện trong Google hay bất cứ thứ gì vì nó chỉ có hai chữ cái. Bằng cách này, mọi người có thể tìm thấy nó. :)
mbomb007

2

GNU APL, 37 ký tự

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

xây dựng một vectơ ký tự chứa các ký tự 2 bộ đếm hai lần (30⍴)

so sánh từng char đầu vào với mọi ký tự trong vectơ (∘. =)

tổng hợp các trận đấu đã được chỉnh sửa (+ /,)


1

Javascript 159 , 130 byte

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

chưa hoàn thành

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

Với sự giúp đỡ của @ 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
Như ~ -1 == 0, bạn có thể viết ~x?thay vì -1 != x?. Xem tôi trả lời cho một ví dụ về việc sử dụng.
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)}Không cần phải có mapsau đóreduce
edc65

1

Haskell, 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 là một hàm c :: Int -> String -> Intlấy một bộ đếm và một chuỗi và đi qua chuỗi một chữ cái một lần để kiểm tra xem chữ cái hiện tại có phải là thành viên của mảng 1 điểm hay mảng 2 điểm hay không và gọi chính nó cho phần còn lại của chuỗi sau khi tăng các truy cập số lượng thích hợp.

Gọi với bộ đếm = 0 trong ghci:

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

Ung dung:

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

Chuyển đổi chuỗi thành một mảng char, sau đó xem nếu mỗi char nằm trong một trong hai bộ đếm. Nếu nó ở cái thứ hai, tôi chỉ cần tăng nó một lần nữa.


1

Erlang, 103 byte

Đây là một chương trình hoàn chỉnh chạy bằng escript. Dòng đầu tiên của tệp phải trống (thêm 1 byte).

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

Chạy mẫu:

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

Chào mừng bạn đến với PPCG, c (L, "# 0469 @ ADOPQRabdegopq") + 2 * c (L, "$% & 8B") dài hơn c (L, "# 0469 @ ADOPQRabdegopq $% & 8B $% & 8B") byte :).
Katenkyo

@Katyenko, cảm ơn vì lời đề nghị. Đáng tiếc nó không hoạt động chính xác cho các đầu vào nhất định. "$% & 8B" được tính cho 5, nhưng phải là 10. Hàm c / 2 hoạt động bằng cách lọc ra các ký tự của chuỗi không thuộc về một bộ ký tự, chẳng hạn như "$% & 8B". Nó kiểm tra sự bao gồm của tập hợp bằng cách xóa char cần kiểm tra khỏi tập hợp, sau đó so sánh kết quả với tập ban đầu. Nếu chúng không bằng nhau, thì char đã có trong tập hợp và nó được bao gồm. Nhiều bản sao của ký tự trong bộ không có bất kỳ ảnh hưởng nào.
Edwin Fine

Ho, tôi hiểu rồi, tôi không biết erlang, đã nghĩ rằng bạn đang sử dụng một chuỗi để đếm bộ đếm: 3. Dù sao,
đừng bận tâm

0

C, 99 byte

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

Giải trình

Tôi tiếp tục đánh golf câu trả lời của Cool Guy ; nó đã quá dài để là một bình luận. Thay vì if/ else, tôi đã tận dụng việc !chuyển đổi một con trỏ thành bool. Tôi cũng đã thực hiện obao gồm tđể tôi có thể thêm "đang ở o" và "ở trong t" cho tổng số quầy.

Mã mở rộng

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

Đầu ra là trong num, phải được xóa trước mỗi cuộc gọi.

Chương trình kiểm tra và kết quả

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

Bản thân mã chứa 37 bộ đếm theo số liệu của chính nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.