카운터 카운터


18

타이포그래피에서 카운터 는 문자 양식 또는 기호로 전체 또는 부분적으로 둘러싸인 문자 영역입니다. 닫힌 카운터는 문자 양식이나 기호로 완전히 둘러싸인 카운터입니다. 프로그램을 작성해야 문자열을 입력으로 받아서 텍스트에 닫힌 카운터의 총 수를 인쇄합니다.

입력 :

  • 명령 행 입력일 수도 있고 STDIN에서 올릴 수도 있지만 어느 것을 지정해야합니다.

  • 인쇄 가능한 ASCII 문자로 구성되며 32에서 126 사이의 모든 ASCII 값을 의미합니다. 공백이 포함됩니다. 추가 정보.

이제 글꼴마다 약간 다릅니다. 예를 들어이 글꼴을 읽는 글꼴은 '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
두 가지 답변이 전체 프로그램 대신 기능을 제출했습니다. 그것이 기본적으로 허용되는 반면, 당신의 말은 그렇지 않으면 제안합니다. 당신은 명확히 할 수 있습니까?
Dennis

카운터를 계산할 때 어떤 방법을 사용하는지 공개 하시겠습니까?
마틴 엔더

3
질문을보고있는 글꼴 중 어느 것도 귀하가 제공 한 수에 해당하지 않습니다. 예를 들어 브라우저에서 0은 대각선 슬래시를 통해 두 개의 카운터를 제공합니다. 안드로이드 앱의 글꼴은 그렇지 않지만 여기 g에는 두 개의 닫힌 카운터가 있습니다. 특정 글꼴을 기준으로 카운터를 결정 했습니까?
마틴 엔더

1
@DJMcMayhem 'g'는 1입니다. 코드에 나열된 위치에 g2가 있습니다. 약간 읽기가 혼란 스럽지만 위치에 따라 다르다고 생각하지 않습니다.
OJFord

1
하지 않습니다 0특정 글꼴, 특히 많은 고정 폭 글꼴이 개 폐쇄 카운터가?
vsz

답변:


10

Pyth, 31 바이트

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

데모.

ASCII가 아닌 문자를 사용하면 코드가 제대로 표시되지 않을 수 있습니다. 올바른 코드는 링크에 있습니다.

각 입력 문자에 대해 원하는 출력의 룩업 테이블을 만들고 Pyth의 모듈 식 인덱싱을 사용하기 위해 32로 회전하고 처음에 1을 붙인 다음 기본 3 숫자로 해석하여 숫자를 제공했습니다 2229617581140564569750295263480330834137283757. 그런 다음이 숫자를 기본 256으로 변환하고 응답으로 사용되는 문자열 인 문자열로 변환했습니다.


29

파이썬 3, 63

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

간단한 접근 방식. 닫힌 카운터로 각 문자를 반복하고 발생 횟수를 합산하여 두 개의 닫힌 카운터가있는 캐릭터에 대해 두 번 반복합니다. 대신 쓰는 길이는 같습니다

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

파이썬 3은 피해야 raw_input합니다.


12

CJam, 41 39 37 34 바이트

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

3 바이트를 골라내는 @ jimmy23013에게 감사드립니다!

온라인으로 사용해보십시오.

작동 원리

"$%&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 : eu및 의 몇 가지 변형을 시도 el했지만 결코 찾지 못했습니다. 감사!
Dennis

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

펄, 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

자바 스크립트, 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"=)'
JohnE

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

파이썬 2, 96 90 75 67 + 2 = 69 바이트

이 작업을 수행하는 다른 방법을 생각할 수 없습니다 ... xnor의 솔루션을 볼 때까지 내가 생각했던 것입니다. 어쨌든 내가 가지고있는 것을 게시 할 것입니다.

6 바이트를 절약 한 FryAmTheEggman에게 감사합니다

좋아, 이제 나는 이것에 만족한다.

찾기 트릭에 대한 xnor 덕분에 4 바이트를 절약했습니다.

입력을 따옴표로 묶어야하므로 2 바이트가 추가되었습니다.

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

1
나는 영리한 인덱스 사용을 좋아합니다! 또한 파이썬 3은 raw_input 대신 input을 사용하기 때문에 조금 짧습니다.
DJMcMayhem


아, 알겠습니다 죄송합니다, @DJMcMayhem의 Python 3 주석과 결합했습니다.
manatwork

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

자바 스크립트, 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

잘못 계산해서 죄송합니다. 그렇습니다, 95.
Ismael Miguel

3

루비, 59 바이트

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

명령 행 또는 stdin에서 입력 비 비전 어를 사용하여 지금까지 가장 짧은.

업데이트 : 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 페이지를 작성했습니다. 당신은 그것에 추가 할 수 있습니다 : esolangs.org/wiki/Rs
mbomb007

트윗 담아 가기 그게 내 하루가되었습니다. : D
kirbyfan64sos

글쎄, "rs"는 두 글자이기 때문에 구글이나 어떤 것도 나오지 않습니다. 이렇게하면 사람들이 찾을 수 있습니다. :)
mbomb007

2

GNU APL, 37 자

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

2 카운터 문자를 두 번 포함하는 문자형 벡터를 구성합니다 (30⍴)

각 입력 문자를 벡터의 모든 문자와 비교 (∘. =)

래블 링 된 경기 요약 (+ /,)


1

자바 스크립트 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 2016 년

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 배열로 변환 한 다음 각 문자가 어느 카운터에 있는지 확인합니다. 두 번째에 있으면 카운터를 다시 증가시킵니다.


1

얼랭, 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에 오신 것을 환영합니다. 바이트 :).
Katenkyo

@Katyenko, 제안 해 주셔서 감사합니다. 유감스럽게도 특정 입력에 대해 올바르게 작동하지 않습니다. "$ % & 8B"는 5로 계산되지만 10이어야합니다. c / 2 함수는 "$ % & 8B"와 같이 일련의 문자에 속하지 않는 문자열의 문자를 필터링하여 작동합니다. 세트에서 테스트 할 문자를 삭제 한 다음 결과를 원래 세트와 비교하여 세트 포함을 확인합니다. 동일하지 않으면 문자가 세트에 포함되어 포함됩니다. 세트의 여러 문자 사본은 영향을 미치지 않습니다.
Edwin Fine

Ho, 나는 erlang을 모른다, 당신이 카운터를 계산하기 위해 문자열을 사용하고 있다고 생각했다 : 3. 어쨌든, 신경
쓰지

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

설명

나는 Cool Guy의 답을 더 골프로 쳤다 . 댓글이 너무 길었습니다. if/ 대신 포인터를 bool로 변환하는 else이점을 얻었습니다 !. 또한 총 카운터 수에 대해 "is in "및 "is in "을 추가 할 수 있도록 o포함했습니다 .tot

확장 코드

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

출력은에 있으며 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 개의 카운터가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.