チャレンジ
x
10文字の文字列と1文字の文字列を指定すると、string でy
文字y
が出現する回数を出力するプログラムを作成しますx
。
そうするためのバイト単位の最短プログラムが勝ちです。
例
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
x
10文字の文字列と1文字の文字列を指定すると、string でy
文字y
が出現する回数を出力するプログラムを作成しますx
。
そうするためのバイト単位の最短プログラムが勝ちです。
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
回答:
/ww
実行例:
$ pyth -c '/ww'
sdhkfhjkkj
k
3
もちろん、ユーザーは最初の入力で10文字以上またはそれ以下の文字を入力できますが、ユーザーが仕様に違反したときに何が起こるかを心配する必要はありません。
),}{)-
@ , +);__
!-`{:}
これは、最初に単一文字を読み取り、次にカウントする文字列を読み取り、文字列にヌルバイトがないと想定します。
コードはで始まり),}
、スタックの最下部をに設定し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
(初期オフセットをキャンセルします)。!
カウンターを出力し@
、プログラムを終了します。
print(input().count(input()))
まあ、これは簡単でした。入力は10文字の文字列であると想定しています。
f=lambda x,y:x.count(y)
場合は、短くなりませんか?(これが機能しない場合は申し訳ありませんが、私は携帯電話でチェックできません)
print input().count(input())
またはa,b=input();print a.count(b)
同じ量が節約されます
~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
笑いのためだけに。
ゴルフをしてくれた元バートに感謝します!
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バイト(と思う)について保存すること。
bool
がint
変換について何を言っているのかわからなかったからです。
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でチェック。
(a,b)=>a.split(b).length-1
このクイックアンドイージーソリューションは、匿名関数を定義します。それを使用するには、変数宣言を先頭に追加します。やってみよう:
編集:ああ、私はすでに非常に類似した解決策があると思います。大丈夫だと思います。
+/⍷
これにより、関数トレインが作成されます。文字列(⍷
)で文字が現れるインデックスに対応するゼロと1のベクトルを作成することで機能します。次に、ベクトルが合計されます(+/
)。
Saved 4 bytes thanks to kirbyfan64sos and NBZ!
+/⍷
then (I don't know APL, so I might be wrong).
(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
<>
!
-l
and ensuring that your input has no trailing newline: echo -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
perl -pe '$_+=s/${\<>}//g'
+=
needed? =
seems to work just as well (and should still work when the input happens to start with some digits).
<?=substr_count($argv[1],$argv[2]);
Usage:
Call the script with two arguments.
php script.php qwertzqwertz q
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
script.php?a=qwertzqwertz&b=q
, and do <?=substr_count($a,$b);
, 23 chars
+/=
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.
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
SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM t
, where t
is a pre-populated input table with fields s
and c
.
A B C D
that end in spaces (if you're asked to count spaces), since LEN
ignores trailing spaces.
space
issue when I have a little time
SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
sum(input('','s')==input('','s'))
+/@:=
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.
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%
_
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.
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...
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
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.
$><<
and reduce 4 bytes.
p gets.count(gets)-1
->s,c{p s.count c}
->s,c{p s.count c}.call 'tttggloyoi', 't'
->s,c{p s.count c}.call 'onomatopoe', 'o'