カウンターカウンター


18

タイポグラフィでは、カウンターは文字の形または記号で完全または部分的に囲まれた文字の領域です。閉じたカウンターは、文字形式または記号で完全に囲まれたカウンターです。入力として文字列を取り、テキスト内の閉じたカウンターの総数を出力するプログラムを作成する必要があります。

あなたの入力:

  • コマンドライン入力またはSTDINから入力できますが、どちらを指定する必要があります。

  • 印刷可能なASCII文字のみで構成されます。つまり、32〜126の間のすべてのASCII値を意味します。これにはスペースが含まれます。詳しくは。

現在、これはフォント間でわずかに異なります。たとえば、これを読んでいるフォントは、「g」に1つの閉じたカウンターがあると見なしますが、googleフォントには「g」に2つの閉じたカウンターがあります。これが問題にならないように、文字ごとのクローズドカウンターの公式数を以下に示します。

閉じたカウンターのないすべてのシンボル:

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

これにはスペースが含まれることに注意してください。

以下は、1つの閉じたカウンターを持つすべてのシンボルです。

#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
完全なプログラムの代わりに、2つの回答が機能を提出しました。それはデフォルトで許可されていますが、あなたの言葉遣いはそうでないことを示唆しています。明確にできますか?
デニス

カウンターのカウントに使用したものを開示してもらえますか?
マーティンエンダー

3
私が質問を見ているフォントはどれもあなたが与えたカウントに対応していません。たとえば、ブラウザでは、ゼロには斜めのスラッシュが付いており、2つのカウンターがあります。Androidアプリのフォントにはありませんが、ここにgは2つの閉じたカウンターがあります。特定のフォントに基づいてカウンターを決定しましたか?
マーティンエンダー

1
@DJMcMayhem 'g'には1があります。ただし、コードに記載されている場所にgは2があります。読むのは少し混乱しますが、場所によって異なるとは思いません。
OJフォード

1
0特定のフォント、特に多くの等幅フォントに2つの閉じたカウンターがありませんか?
VSZ

回答:


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

簡単なアプローチ。閉じたカウンターを使用して各文字を反復処理し、発生回数を合計します。2つの閉じたカウンターを使用して文字を2回繰り返します。代わりに書くのは同じ長さでしょう

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

回避するにはPython 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が、それを見つけることができませんでした。ありがとう!
デニス

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")=\:。これが最善の方法かもしれません。
ヨーネ

+//(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でゴルフをお試しください。;)
アレックスA.

5

Python 2、96 90 75 67 + 2 = 69バイト

これを行う他の方法を考えることはできません...私はxnorの解決策を見るまで私が考えていたものです。とにかく持っていたものを投稿します。

6バイトを節約してくれたFryAmTheEggmanに感謝

さて、これで満足です。

4バイトを節約する検索のトリックを提供してくれたxnorに感謝します。

入力を引用符で囲む必要があるため、2バイトを追加しました。

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

1
インデックスの賢い使い方が好きです!また、Python 3はraw_inputの代わりに入力を使用するため、少し短くなっています。
DJMcMayhem


ああなるほど。申し訳ありませんが、@ DJMcMayhemのPython 3コメントと組み合わせました。
マナトワーク

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

それ完全なプログラムでなければならない場合 ...文字に一致し、それらをより長い文字列に置き換える単なる1行です。次に、元の長さとの差を返します。残念ながら、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)
イスマエルミゲル

ひどくカウントしてすみません。はい、その95
イスマエルミゲル

3

ルビー、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に出力します。

Ungolfed +説明:

# 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のスタブエソランページを作成しました。追加することをお勧め
mbomb007

@ mbomb007すごい!! それはちょうど私の一日を作りました。:D
kirbyfan64sos

「rs」は2文字しかないので、Googleなどには表示されません。この方法で、人々はそれを見つけることができます。:)
mbomb007

2

GNU APL、37文字

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

2カウンター文字を2回含む文字ベクトルを作成します(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ポイント配列のメンバーであるかどうかを一度に1文字ずつチェックし、インクリメント後に文字列の残りの部分を呼び出す適切な量​​のカウンター。

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がいずれかのカウンターにあるかどうかを確認します。2番目の場合は、カウンターを再びインクリメントするだけです。


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へようこそ、c(L、 "#0469 @ ADOPQRabdegopq")+ 2 * c(L、 "$%&8B")はc(L、 "#0469 @ ADOPQRabdegopq $%&8B $%&8B")より5長いバイト:)。
かてんきょう

@Katyenko、提案をありがとう。残念ながら、特定の入力では正しく機能しません。「$%&8B」は5としてカウントされますが、10である必要があります。c/ 2関数は、「$%&8B」などの一連の文字に属さない文字列の文字を除外することによって機能します。セットからテストする文字を削除し、結果を元のセットと比較することにより、セットの包含をチェックします。それらが等しくない場合、charはセット内にあり、含まれます。セット内のcharの複数のコピーは効果がありません。
エドウィンファイン

ほら、私はアーランを知らない、あなたがカウンターを数えるのに文字列を使っていると思っていた: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++);}

説明

クールガイの答えをさらにゴルフしまし ; コメントにするには長すぎました。if/の代わりに、ポインターをブールelse!変換することを利用しました。また、カウンターの総数に「is in 」と「is in 」を追加できるようにoincludeを作成しました。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.