入力文字列内の文字の出現を見つける


18

チャレンジ

x10文字の文字列と1文字の文字列を指定すると、string でy文字yが出現する回数を出力するプログラムを作成しますx

そうするためのバイト単位の最短プログラムが勝ちです。

Input: tttggloyoi, t
Output: 3

Input: onomatopoe, o
Output: 4

11
これは難しすぎるように思えます。また、入力を無制限ではなく10に制限するのはなぜですか?
Fatalize

7
勝利条件が必要です。
isaacg

2
それはあなたに同意しない場合は、私の編集をロールバックすること自由に感じなさい
ベータ崩壊

8
入力形式はどの程度柔軟ですか?スペースや改行など、別の区切り文字を選択できますか?文字列を引用符で囲むことはできますか?最初に文字を取得し、次に文字列を取得できますか?文字は常に小文字になりますか?そうでない場合、他のどの文字が発生しますか?
マーティンエンダー

5
これはCのインタビューの質問のように見えます
クエンティン

回答:


18

Pyth、3バイト

/ww

実行例:

$ pyth -c '/ww'
sdhkfhjkkj
k
3

もちろん、ユーザーは最初の入力で10文字以上またはそれ以下の文字を入力できますが、ユーザーが仕様に違反したときに何が起こるかを心配する必要はありません。


それはもう有効なピスではないようです?
ヴェン

説明してください?
MilkyWay90

@ MilkyWay90これを使用する方法は次のとおりです。オンラインでお試しください!/2番目の入力文字列の最初の入力文字列の出現回数をカウントするだけです。w入力の行を取ります。
isaacg

@isaacgああ、なるほど。ありがとうございました!
MilkyWay90



6

Bash、24文字

x=${1//[^$2]}
echo ${#x}

サンプル実行:

bash-4.3$ bash letter-count.sh tttggloyoi t
3

bash-4.3$ bash letter-count.sh onomatopoe o
4


4

ラビリンス32 29 27 24バイト

),}{)-
@ ,  +);__
!-`{:}

これは、最初に単一文字を読み取り、次にカウントする文字列を読み取り、文字列にヌルバイトがないと想定します。

説明

コードはで始まり),}、スタックの最下部をに設定し1、最初の文字を読み取り、将来の使用のために補助スタックに移動します。これ1がカウンターになります(オフセット1は後でキャンセルされ、IPが必要なターンを取るために必要です)。

これで、IPは下に移動して、で検索文字列の最初の文字を読み取ります,`正しい回転動作を得るために、値はで否定されます。STDINから文字を読み取っている間、IPは次のループに従います。

  }{)-
  ,  +);__
  `{:}

{:}格納されている文字コードのコピーを作成+し、現在の値に追加します。結果がある場合0(つまり、現在の文字は、我々が探しているもの)、IPは直進:-単にを取り除く0)カウンタをインクリメント、{}何もしません。

ただし、後の結果+がゼロ以外の場合、現在の文字をカウントしたくありません。そのため、IPは代わりに右折します。それは行き止まりなので、そこにあるコードは2回実行され、1回は前方に、1回は後方に実行されます。つまり、この場合の実際のコードはになり);___;)+-){}ます。);ゼロ以外の差を取り除き、___3つのゼロをプッシュ;しますが、そのうちの1つを破棄します。)残りの2つのゼロのうちの1つをインクリメント+し、それらを1つ1-加算して、カウンターから減算し、)インクリメントします。つまり、非常に手の込んだノーオペレーションを作成しました。

EOFをヒットすると、が,プッシュされ-1、に`変わり1、IPが右折します。カウンターからを-減算します1(初期オフセットをキャンセルします)。!カウンターを出力し@、プログラムを終了します。


4

Python 3、29バイト

print(input().count(input()))

まあ、これは簡単でした。入力は10文字の文字列であると想定しています。


4
あなたは私をコピーしました!:D
isaacg

1
@isaacg偉大な心は同じように考えていますか?; D
ベータ崩壊

入力を読む必要がないf=lambda x,y:x.count(y)場合は、短くなりませんか?(これが機能しない場合は申し訳ありませんが、私は携帯電話でチェックできません)
コール

@ mbomb007私の間違い、明確にしてくれてありがとう。
コール

1
印刷物の周りの角かっこを削除すると、1人のキャラクターprint input().count(input())またはa,b=input();print a.count(b)同じ量が節約されます
Willem

4

雪だるま1.0.2、16文字

~vgvgaSaLNdEtSsP

驚くほど短い。説明:

~      make all vars active (even though we only need two, we don't really care)
vgvg   get two lines of input
aS     split first line on second line
aL     length of the new array
NdE    decrement (because ex. "axbxc""x"aS -> ["a" "b" "c"] which is length 3)
tSsP   to-string and print

よくやった!Snowmanでこのような解決策が可能になるとは思いもしませんでした。
アレックスA.

4

C ++テンプレートメタプログラミング、160 154 116バイト

笑いのためだけに。

ゴルフをしてくれた元バートに感謝します!

template<int w,int x,int y,int...s>class A:A<w+(x==y),x,s...>{};A<0,'t','t','t','t','g','g','l','o','y','o','i',0>a;

使用法:テンプレートのインスタンス化の最初の文字は、検索する文字です。

clang -std = c ++ 11 -c->でコンパイルすると、エラーメッセージの先頭に結果が表示されます。

Occurences.cpp:1:66: error: too few template arguments for class template 'A'
template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};
                                                             ^
Occurences.cpp:1:66: note: in instantiation of template class 'A<3, 't', '\x00'>' requested here
template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};

gcc -std = c ++ 11 -c->でコンパイルすると、エラーメッセージの下部に結果が表示されます。

Occurences.cpp: In instantiation of ‘const int A<3, 't', '\000'>::a’:
Occurences.cpp:1:64:   recursively required from ‘const int A<1, 't', 't', 't', 'g', 'g', 'l', 'o', 'y', 'o', 'i', '\000'>::a’
Occurences.cpp:1:64:   required from ‘const int A<0, 't', 't', 't', 't', 'g', 'g', 'l', 'o', 'y', 'o', 'i', '\000'>::a’
Occurences.cpp:2:62:   required from here
Occurences.cpp:1:64: error: wrong number of template arguments (2, should be at least 3)

A < 3、 't'、 '\ 000'>およびA < 3、 't'、 '\ x00'>を検索します

154バイトバージョン

template<int w,char x,char y,char...s>class A{static const int a=A<w+(x==y),x,s...>::a;};                          
int a=A<0,'t','t','t','t','g','g','l','o','y','o','i','\0'>::a;

160バイトバージョン:

template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};                          
int a=A<0,'t','t','t','t','g','g','l','o','y','o','i','\0'>::a;

あなたは短縮できる((x==y)?1:0)だけに(x==y)6バイト(と思う)について保存すること。
kirbyfan64sos

おかげで-それが定義された振る舞いであることを確認したいのです。なぜなら私は標準boolint変換について何を言っているのかわからなかったからです。
大友

定義された動作です。
kirbyfan64sos

うん、今、私もそれを知っています。:) どうもありがとうございました。(おそらく実装に依存するだろうと思った。)
大友

1
128バイト:のenum代わりに匿名を使用しますstatic const。の0代わりに使用'\0'して終了します。のint代わりに使用しますchar。わずかに異なる宣言を使用してインスタンス化します。superflouos改行を削除します。template<int w,int x,int y,int...s>class A{enum{a=A<w+(x==y),x,s...>::a};};A<0,'t','t','t','t','g','g','l','o','y','o','i',0>a;。g ++およびclangでチェック。
元バート


3

Javascript(ES6)、26バイト

(a,b)=>a.split(b).length-1

このクイックアンドイージーソリューションは、匿名関数を定義します。それを使用するには、変数宣言を先頭に追加します。やってみよう:

編集:ああ、私はすでに非常に類似した解決策があると思います。大丈夫だと思います。



3

C ++、78バイト

int main(int,char**v){int c=0,i=0;while(i<10)v[1][i++]==*v[2]&&++c;return c;}

このような呼び出し:

$ g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out tttggloyoi t; echo $?
3

3

要素、23バイト

__);11'[)\
~="0 1@][+]`

改行はプログラムの一部です。実際に変数名として使用しています

このプログラムは基本的に、ターゲットキャラクターを変数に保存し、現在の文字列をスタックの一番上に保持し、「下にある結果の切り取り、比較、移動」プロセスをループし、結果を合計します。

変数名としての改行は、入力の最後で改行を使用して切り取り、保存することで得られます。コードの改行は、そこから読み取る場所です。

入力は次のとおりです。

qqqqwwweee
q

出力はこんな感じ

4

3

ジュリア、26 25バイト

f(s,c)=endof(findin(s,c))

findin関数は、2番目の引数がベクトルとして見つかる最初の引数にインデックスを返します。ベクトルの長さは、出現回数です。

Glen Oのおかげで1バイト節約されました。


endofの代わりに1バイト節約しますlength
グレンO

3

APL、7 3バイト

+/⍷

これにより、関数トレインが作成されます。文字列()で文字が現れるインデックスに対応するゼロと1のベクトルを作成することで機能します。次に、ベクトルが合計されます(+/)。

Saved 4 bytes thanks to kirbyfan64sos and NBZ!


Is APL curried like K? I would think you could just do something like +/⍷ then (I don't know APL, so I might be wrong).
kirbyfan64sos

@kirbyfan64sos The only curry I know is food so I'm not sure. But I'll look into it. Thanks for the suggestion!
Alex A.

@kirbyfan64sos Yes, it is called a function train, so +/⍷ would indeed work, but since we are looking for a single char, one might as well use = instead of ⍷.
Adám

3

Perl, 21 16 characters

(13 characters code + 3 character command line option.)

$_=0+s/$^I//g

Sample run:

bash-4.3$ perl -it -pe '$_=0+s/$^I//g' <<< tttggloyoi
3

bash-4.3$ perl -io -pe '$_=0+s/$^I//g' <<< onomatopoe
4

bash-4.3$ perl -i5 -pe '$_=0+s/$^I//g' <<< 1234
0

Neat trick with <>!
ThisSuitIsBlackNot

You could save a byte by dropping -l and ensuring that your input has no trailing newline: echo -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
ThisSuitIsBlackNot

1
And you can knock your total down to 16 with perl -pe '$_+=s/${\<>}//g'
ThisSuitIsBlackNot

That referencing trick is incredible. Thank you, @ThisSuitIsBlackNot.
manatwork

Why is the += needed? = seems to work just as well (and should still work when the input happens to start with some digits).
ex-bart

3

PHP, 36 35 bytes

<?=substr_count($argv[1],$argv[2]);


Usage:
Call the script with two arguments.
php script.php qwertzqwertz q

PHP, 23 bytes

If you register global Variables (only possible in PHP 5.3 and below) you can save 12 bytes (thanks to Martijn)

<?=substr_count($a,$b);


Usage:
Call the script and declare global variables php script.php?a=qwertzqwertz&b=q


1
You can remove a space after the comma to get one byte less
Voitcus

1
If you have register globals you can do script.php?a=qwertzqwertz&b=q, and do <?=substr_count($a,$b);, 23 chars
Martijn

@Martijn good idea thank you!
jrenk

3

Dyalog APL, 3 bytes

      +/=

I.e. "The sum of the equal bytes". E.g.:

      f ← +/=
      'onomatopoe' f 'o'
4

or just

      'onomatopoe'(+/=)'o'
4

K doesn't beat APL this time.

Try it online.


Please don't edit dozens of posts at once. You're completely flooding the front page. If there are many posts that need editing (which occasionally does happen, e.g. because a new tag is added), then it's generally nice to only do 3 of them at a time and then wait at least 12 hours so they can drop off the front page.
Martin Ender

@MartinBüttner Yeah, I didn't realize at the time. :-( Regular users do not have the "Minor edit" option... I do realize why it cannot be available for everyone.
Adám

Unfortunately, there is no such option at all, not even for moderators.
Martin Ender

3

T-SQL, 99 40 Bytes

SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t

Simply does a difference between the input string and the string with the character removed. Takes input from table t

Edit changed to remove an issue with counting spaces and to take into account current acceptable inputs for SQL. Thanks @BradC for all the changes and savings


You shouldn't need all the scaffolding, just do SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM t, where t is a pre-populated input table with fields s and c.
BradC

On another note, this code gives the wrong answer for strings like A B C D that end in spaces (if you're asked to count spaces), since LEN ignores trailing spaces.
BradC

@BradC I think way back then, the rules around what was acceptable, especially around SQL was restrictive and unclear. I'll have a look at fixing the space issue when I have a little time
MickyT

I usually just pad the end and subtract one; in this case input is guaranteed to be exactly 10 characters, you could just hard code it as SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
BradC

@BradC yeah, looking at this again, not sure why I allowed for variable length. Making changes.
MickyT


2

J, 5 bytes

+/@:=

I feel like J would have a built-in for this, but I haven't been able to find one - maybe one of the active J users can enlighten me. So instead this first applies = to the inputs, turning each character into 1 if it's equal to the requested one or 0 otherwise. Then +/ computes the sum of that list.


2

Batch File, 121 Bytes

Because I'm a masochist ...

SET c=0
SET e=_
SET t=%1%%e%
:l
SET a=%t:~0,1%
IF "%a%"=="%2" SET /A c+=1
SET t=%t:~1%
IF NOT "%t%"=="%e%" GOTO l
ECHO %c%

Warning: Assumes that _ doesn't occur in the input string. If it does, then the variable e needs to be adjusted appropriately.

This sets up our counter variable, c, and our end-of-string demarcation as _, before appending that to our input string %1 and setting the concatenated string to t. Then, we're entering loop :l, we set a temporary character variable a to be the first character of t, check if it matches our second input string %2 and increment c if true, then trim the first character off of t. Our end-of-loop condition checks t against our end-of-string demarcation, and loops back if not. We then echo out the value of our counter.

It would probably be possible to use a FOR loop instead, but that would necessitate enabling DelayedExpansion, which I think will actually be longer byte-wise than this. Verification of that is left as an exercise to the reader.


2

CJam, 5 bytes

ll/,(

Explanation

l      e# read x
 l     e# read y
  /    e# split x by y
   ,   e# count
    (  e# subtract one

2

PowerShell, 32 Bytes

A four-for-one! And they're all the same length! :)

($args[0]-split$args[1]).Count-1

or

param($a,$b)($a-split$b).Count-1

Alternatively,

$args[0].Split($args[1]).Count-1

or

param($a,$b)$a.Split($b).Count-1

The first two styles use the inline operator -split, while the second two implicitly casts the first argument as a String and uses the .Split() string-based operator. In all instances an array is returned, where we must decrement Count by one, since we're getting back one more array item than occurrences of the second argument.

This one was kinda fun...


2

Julia, 21 bytes

f(s,c)=sum(i->c==i,s)

Note that it requires that c be a char, not a single-character string. So you use it as f("test me",'e') (which returns 2) and not f("test me","e") (which returns 0, because 'e'!="e").


2

><> (Fish), 30 bytes

0&v
=?\ilb
=?\:@=&+&l1
n&/;

Takes the string, then character to count. Input isn't separated (at least in the online interpreter). Try it on the online interpreter: http://fishlanguage.com I counted the bytes by hand, so let me know if I'm wrong.

Explanation

First off, ><> is 2 dimensional and and loops through a line or column until it hits a ; or error. This means that if it's proceeding left to right (like it does at the beginning of a program), it will wrap around the line if it reaches the end and is not moved or told to stop the program. Some characters per line will be repeated because they have different functions depending on the direction of the pointer, and the fourth line will have characters in reverse order because the pointer moves right to left.

A summary of the program is provided below. Look at the instructions listed for ><> on esolangs to see what each individual character does.

Line 1: 0&v

0&v -put 0 into the register and change direction to down-up

Line 2: =?\ilb

(starting where line 1 moves the pointer to, i.e. the third character)

\ -reflect the pointer and make it move left-right
i -read input
lb=?\ -reflect downwards if there are 11 values in the stack

line 3: =?\:@=&+&l1

(starting at the third character)

:@ -duplicate y and shift the stack e.g. ['x','y','y'] -> ['y','x','y']
=&+& -increment the register if the character popped from x = y
l1=?\ -reflect downwards if there is 1 value in the stack

Line 4: n&/;

(starting at the third character)

/ -reflect right-left
&n; -print value of the register

2

Ruby, 22 20 bytes

p gets.count(gets)-1

Demo: http://ideone.com/MEeTd2

The -1 is due to the fact that gets retrieves the input, plus a newline character. Ruby's String#count counts the number of times any character from the argument occurs in the string.

For example, for the input [test\n, t\n], the t occurs twice and the \n occurs once, and needs to be subtracted.


You can remove $><< and reduce 4 bytes.
Vasu Adari

@VasuAdari but I need to print the result somehow...
Cristian Lupascu

can you not do this? -> p gets.count(gets)-1
Vasu Adari

@VasuAdari You're right; for the moment I thought that would put qutoes around the output, but it's numeric so it's OK. Thanks!
Cristian Lupascu

2

Ruby, 18 bytes

->s,c{p s.count c}

Usage:

->s,c{p s.count c}.call 'tttggloyoi', 't'

->s,c{p s.count c}.call 'onomatopoe', 'o'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.