Temukan kemunculan karakter dalam string input

18

Tantangan

Tulis program yang, diberi string xyang panjangnya 10 karakter dan sebuah karakter y, menampilkan berapa kali karakter ymuncul dalam string x.

Program terpendek dalam byte yang berhasil akan menang.

Contoh

Input: tttggloyoi, t
Output: 3

Input: onomatopoe, o
Output: 4
rosslyn taghoy
sumber
11
Ini sepertinya tantangan yang terlalu mudah. Juga mengapa membatasi input hingga 10, bukannya tidak ada batasan sama sekali?
Fatalkan
7
Membutuhkan kondisi kemenangan.
isaacg
2
Jangan ragu untuk mengembalikan hasil edit saya jika tidak setuju dengan Anda
Beta Decay
8
Seberapa fleksibel format input? Bisakah kita memilih pembatas yang berbeda, seperti spasi atau baris baru? Bisakah string dalam tanda kutip? Bisakah kita mengambil surat terlebih dahulu dan string kedua? Apakah karakter akan selalu menjadi huruf kecil? Jika tidak, karakter lain mana yang dapat muncul?
Martin Ender
5
Ini terlihat seperti pertanyaan wawancara C yang mencurigakan ...
Quentin

Jawaban:

18

Pyth, 3 byte

/ww

Contoh dijalankan:

$ pyth -c '/ww'
sdhkfhjkkj
k
3

Tentu saja, pengguna dapat memasukkan lebih dari 10 huruf pada input pertama, tetapi kita tidak perlu khawatir tentang apa yang terjadi ketika pengguna melanggar spesifikasi.

isaacg
sumber
Sepertinya itu tidak valid lagi?
Ven
tolong jelaskan?
MilkyWay90
@ MilkyWay90 Begini cara Anda menggunakan ini: Coba online! . /hanya menghitung jumlah kemunculan dalam string input pertama dari string input kedua. wmengambil jalur input.
isaacg
@isaacg oh, begitu. Terima kasih!
MilkyWay90
11

Pyth - 3 byte

Jawaban Pyth yang berbeda, kurang jelas, dengan ukuran yang sama. Ini melipat penghitungan input.

/FQ

Test Suite .

Maltysen
sumber
7

JavaScript, 32

(p=prompt)().split(p()).length-1
edc65
sumber
6

Bash, 24 karakter

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

Contoh dijalankan:

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

bash-4.3$ bash letter-count.sh onomatopoe o
4
manatwork
sumber
6

Retina , 12 byte

(.)(?=.*\1$)

Cukup regex yang cocok dengan karakter yang sama dengan karakter terakhir dalam input (kecuali dirinya sendiri). Saat diberi regex tunggal, Retina hanya mengembalikan jumlah kecocokan.

Martin Ender
sumber
Wow, saya di sini mencoba melakukan segala macam hal mewah dengan rs , dan Anda memukuli saya dengan tampan. +1
kirbyfan64sos
4

Labyrinth , 32 29 27 24 byte

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

Ini membaca karakter tunggal terlebih dahulu, diikuti oleh string yang digunakan untuk menghitung, dan mengasumsikan bahwa tidak ada null-byte dalam string.

Penjelasan

Kode dimulai dengan ),}, yang mengatur bagian bawah tumpukan 1, membaca karakter pertama dan memindahkannya ke tumpukan tambahan untuk digunakan di masa mendatang. The 1akan menjadi kontra kami (offset dari 1 akan dibatalkan kemudian dan diperlukan untuk IP bergiliran yang diperlukan).

IP sekarang akan bergerak turun untuk membaca karakter pertama dari string pencarian ,. Nilai dinegasikan dengan `, sekali lagi untuk mendapatkan perilaku belok yang benar. Sementara kita membaca karakter dari STDIN, IP sekarang akan mengikuti loop ini:

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

{:}membuat salinan kode karakter yang disimpan dan +menambahkannya ke nilai saat ini. Jika hasilnya 0(yaitu karakter saat ini adalah yang kita cari), IP bergerak lurus ke depan: -cukup singkirkan 0, )tambah penghitung, {}adalah no-op.

Namun, jika hasil setelahnya +adalah nol, kami tidak ingin menghitung karakter saat ini. Jadi IP mengambil belokan kanan sebagai gantinya. Itu jalan buntu, sehingga kode di sana dieksekusi dua kali, sekali ke depan dan sekali ke belakang. Artinya, kode aktual dalam hal ini menjadi );___;)+-){}. );hanya menghilangkan perbedaan yang tidak nol itu, ___mendorong 3 angka nol, tetapi ;membuang salah satunya. )menambah satu dari dua nol yang tersisa, +menambahkannya ke dalam satu 1, -menguranginya dari penghitung dan )menambah penghitung. Dengan kata lain, kami telah membuat no-op yang sangat rumit.

Ketika kita menekan EOF, ,mendorong -1, yang `berubah menjadi 1dan IP mengambil belokan ke kanan. -kurangi 1dari penghitung (membatalkan offset awal). !mencetak penghitung dan @mengakhiri program.

Martin Ender
sumber
4

Python 3, 29 byte

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

Meh, ini mudah. Mengasumsikan input adalah string sepuluh huruf.

Peluruhan Beta
sumber
4
Anda menyalin saya! : D
isaacg
1
@isaacg Pikiran besar berpikir sama? ; D
Beta Decay
Jika Anda tidak perlu membaca input, bukankah f=lambda x,y:x.count(y)lebih pendek? (Maaf jika ini tidak berhasil, saya menggunakan ponsel dan tidak dapat memeriksa)
cole
@ mbomb007 Kesalahan saya, terima kasih telah menjelaskan.
cole
1
Menghapus tanda kurung di sekitar cetakan menghemat satu karakter print input().count(input())atau a,b=input();print a.count(b)dengan jumlah yang sama
Willem
4

Snowman 1.0.2 , 16 karakter

~vgvgaSaLNdEtSsP

Sangat pendek. Penjelasan:

~      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
Gagang pintu
sumber
Kerja bagus! Saya tidak akan berpikir bahwa solusi sesingkat itu akan mungkin di Snowman.
Alex A.
4

C ++ Template-Metaprogramming, 160 154 116 byte

Hanya untuk cekikikan.

Terima kasih kepada mantan bart untuk bermain golf!

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;

Penggunaan: Karakter pertama di instanciation template adalah karakter untuk dicari.

Complile dengan dentang -std = c ++ 11 -c -> hasilnya ada di awal pesan kesalahan.

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

Complile dengan gcc -std = c ++ 11 -c -> hasilnya ada di bagian bawah pesan kesalahan.

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)

Cari A < 3 , 't', '\ 000'> dan A < 3 , 't', '\ x00'>

Versi 154 byte

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;

Versi 160 byte:

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;
Otomo
sumber
Anda dapat mempersingkat ((x==y)?1:0)menjadi hanya (x==y)untuk menghemat sekitar 6 byte (saya pikir).
kirbyfan64sos
Terima kasih - ingin memastikan bahwa itu didefinisikan perilaku, karena saya tidak yakin apa yang dikatakan standar tentang booluntuk intkonversi.
Otomo
Itu perilaku yang didefinisikan.
kirbyfan64sos
Yap, sekarang saya juga tahu itu. :) Terima kasih banyak. (Saya pikir mungkin itu tergantung pada implementasi.)
Otomo
1
128 byte: Gunakan anonim, enumbukan static const. Gunakan 0alih-alih '\0'untuk mengakhiri. Gunakan intsebagai ganti char. Gunakan deklarasi yang sedikit berbeda untuk memulai. Hapus baris 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;. Diperiksa dengan g ++ dan dentang.
ex-bart
3

Bash + grep, 26 byte

grep -o "$1"<<<"$2"|wc -l
Tarod
sumber
3

Javascript (ES6), 26 byte

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

Solusi cepat dan mudah ini mendefinisikan fungsi anonim. Untuk menggunakannya, tambahkan deklarasi variabel ke awal. Cobalah:

EDIT: Oh, saya melihat ada solusi yang sangat mirip. Saya harap tidak apa-apa.

Produksi ETH
sumber
3

Haskell, 21 byte

a!b=sum[1|x<-a,x==b]
Otomo
sumber
3

C ++, 78 byte

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

Panggil seperti ini:

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

Elemen , 23 byte

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

Baris baru adalah bagian dari program. Saya sebenarnya menggunakannya sebagai nama variabel .

Program ini pada dasarnya bekerja dengan menyimpan karakter target dalam variabel, menjaga string saat ini di atas tumpukan, dan kemudian mengulangi proses "memotong, membandingkan, dan memindahkan hasil di bawah", menambahkan hasil pada akhirnya.

Baris baru sebagai nama variabel berasal dari penggunaan baris baru di akhir input dengan memotongnya dan menyimpannya. Baris baru dalam kode adalah tempat saya membacanya.

Inputnya seperti ini:

qqqqwwweee
q

Outputnya seperti ini

4
PhiNotPi
sumber
3

Julia, 26 25 byte

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

The findinmengembalikan fungsi indeks pada argumen pertama di mana argumen kedua ditemukan sebagai vektor. Panjang vektor adalah jumlah kemunculannya.

Disimpan satu byte berkat Glen O.

Alex A.
sumber
endofakan menghemat byte di tempat length.
Glen O
3

APL, 7 3 byte

+/⍷

Ini menciptakan fungsi kereta. Ini bekerja dengan membuat vektor nol dan yang sesuai dengan indeks di mana karakter muncul di string ( ). Vektor kemudian dijumlahkan (+/ ).

Disimpan 4 byte berkat kirbyfan64sos dan NBZ!

Alex A.
sumber
Apakah APL dikeringkan seperti K? Saya pikir Anda bisa melakukan sesuatu seperti +/⍷itu (saya tidak tahu APL, jadi saya mungkin salah).
kirbyfan64sos
@ kirbyfan64sos Satu-satunya kari yang saya tahu adalah makanan jadi saya tidak yakin. Tapi saya akan memeriksanya. Terima kasih untuk sarannya!
Alex A.
@ kirbyfan64sos Ya, ini disebut kereta fungsi , jadi + / indeed memang akan berfungsi, tetapi karena kita mencari char tunggal, kita mungkin menggunakan = alih-alih ⍷.
Adám
3

Perl, 21 16 karakter

(13 karakter kode + 3 opsi opsi perintah karakter.)

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

Contoh dijalankan:

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
manatwork
sumber
Trik rapi dengan <>!
ThisSuitIsBlackNot
Anda dapat menyimpan byte dengan menjatuhkan -ldan memastikan bahwa input Anda tidak memiliki baris baru:echo -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
ThisSuitIsBlackNot
1
Dan Anda dapat menurunkan total Anda menjadi 16 denganperl -pe '$_+=s/${\<>}//g'
ThisSuitIsBlackNot
Trik referensi itu luar biasa. Terima kasih, @ ThisSuitIsBlackNot.
manatwork
Mengapa +=dibutuhkan? =tampaknya bekerja dengan baik (dan masih harus bekerja ketika input dimulai dengan beberapa digit).
ex-bart
3

PHP, 36 35 byte

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


Penggunaan:
Panggil skrip dengan dua argumen.
php script.php qwertzqwertz q

PHP, 23 byte

Jika Anda mendaftarkan Variabel global (hanya mungkin dalam PHP 5.3 dan di bawah) Anda dapat menyimpan 12 byte (terima kasih kepada Martijn )

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


Penggunaan:
Panggil skrip dan deklarasikan variabel globalphp script.php?a=qwertzqwertz&b=q

jrenk
sumber
1
Anda dapat menghapus spasi setelah koma untuk mendapatkan satu byte lebih sedikit
Voitcus
1
Jika Anda telah mendaftarkan global yang dapat Anda lakukan script.php?a=qwertzqwertz&b=q, dan lakukan <?=substr_count($a,$b);, 23 chars
Martijn
@ Martijn ide bagus terima kasih!
jrenk
3

Dyalog APL , 3 byte

      +/=

Yaitu "Jumlah byte yang sama". Misalnya:

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

atau hanya

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

K tidak mengalahkan APL kali ini.

Cobalah online.

Adm
sumber
Tolong jangan edit lusinan posting sekaligus. Anda benar-benar membanjiri halaman depan. Jika ada banyak posting yang perlu diedit (yang kadang-kadang terjadi, misalnya karena tag baru ditambahkan), maka umumnya baik untuk melakukan hanya 3 dari mereka sekaligus dan kemudian menunggu setidaknya 12 jam sehingga mereka dapat turun di depan halaman.
Martin Ender
@ MartinBüttner Ya, saya tidak menyadarinya saat itu. :-( Pengguna biasa tidak memiliki opsi "Edit kecil" ... Saya menyadari mengapa itu tidak tersedia untuk semua orang.
Adám
Sayangnya, tidak ada opsi seperti itu sama sekali, bahkan untuk moderator sekalipun.
Martin Ender
3

T-SQL, 99 40 Bytes

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

Sederhananya perbedaan antara string input dan string dengan karakter dihapus. Mengambil input dari tabel t

Edit diubah untuk menghapus masalah dengan penghitungan spasi dan untuk memperhitungkan input SQL saat ini yang dapat diterima. Terima kasih @BradC untuk semua perubahan dan penghematan

MickyT
sumber
Anda tidak perlu semua perancah, cukup lakukan SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM t, di mana t tabel input pra-diisi dengan bidang sdan c.
BradC
Pada catatan lain, kode ini memberikan jawaban yang salah untuk string seperti A B C D yang berakhir pada spasi (jika Anda diminta untuk menghitung spasi), karena LENmengabaikan spasi tambahan.
BradC
@BradC Saya pikir saat itu, aturan seputar apa yang dapat diterima, terutama seputar SQL bersifat membatasi dan tidak jelas. Saya akan melihat memperbaiki spacemasalah ketika saya punya sedikit waktu
MickyT
Saya biasanya hanya mengisi akhir dan mengurangi satu; dalam hal ini input dijamin tepat 10 karakter, Anda bisa SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
menuliskannya
@ BCR ya, melihat ini lagi, tidak yakin mengapa saya mengizinkan panjang variabel. Membuat perubahan.
MickyT
2

Oktaf / Matlab, 33 byte

sum(input('','s')==input('','s'))
Luis Mendo
sumber
2

J, 5 byte

+/@:=

Saya merasa J akan memiliki built-in untuk ini, tetapi saya belum dapat menemukannya - mungkin salah satu pengguna J aktif dapat mencerahkan saya. Jadi alih-alih ini pertama berlaku =untuk input, mengubah setiap karakter menjadi 1jika itu sama dengan yang diminta atau 0sebaliknya. Kemudian +/hitung jumlah dari daftar itu.

Martin Ender
sumber
2

File Batch, 121 Bytes

Karena aku seorang masokis ...

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%

Peringatan: Diasumsikan itu _tidak terjadi pada string input. Jika ya, maka variabel eperlu disesuaikan dengan benar.

Ini mengatur variabel penghitung kami c,, dan demarkasi akhir string kami sebagai _, sebelum menambahkannya ke string input kami %1dan mengatur string yang digabungkan ke t. Kemudian, kita memasuki loop :l, kita menetapkan variabel karakter sementara amenjadi karakter pertama t, periksa apakah cocok dengan string input kedua %2dan kenaikan cjika benar, kemudian pangkas karakter pertama t. Kondisi end-of-loop tkami memeriksa demarkasi end-of-string kami, dan loop kembali jika tidak. Kami kemudian echokeluar nilai counter kami.

Mungkin akan mungkin untuk menggunakan FORloop sebagai gantinya, tetapi itu akan mengharuskan mengaktifkan DelayedExpansion , yang saya pikir sebenarnya akan lebih lama byte-bijaksana daripada ini. Verifikasi itu dibiarkan sebagai latihan untuk pembaca.

AdmBorkBork
sumber
2

CJam, 5 byte

ll/,(

Penjelasan

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

PowerShell, 32 Bytes

Empat untuk satu! Dan mereka semua memiliki panjang yang sama! :)

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

atau

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

Kalau tidak,

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

atau

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

Dua gaya pertama menggunakan operator sebaris -split, sedangkan dua gaya kedua secara implisit melemparkan argumen pertama sebagai String dan menggunakan.Split() operator berbasis string. Dalam semua kasus, sebuah array dikembalikan, di mana kita harus mengurangi Hitungan satu, karena kita mendapatkan kembali satu item array lebih banyak daripada kemunculan argumen kedua.

Yang ini agak menyenangkan ...

AdmBorkBork
sumber
2

Julia, 21 byte

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

Perhatikan bahwa ini membutuhkan ckarakter char, bukan string karakter tunggal. Jadi Anda menggunakannya sebagai f("test me",'e')(yang mengembalikan 2) dan tidak f("test me","e")(yang mengembalikan 0, karena 'e'!="e").

Glen O
sumber
2

> <> (Ikan) , 30 byte

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

Mengambil string, lalu karakter untuk dihitung. Masukan tidak terpisahkan (setidaknya dalam juru bahasa online). Cobalah di penerjemah online: http://fishlanguage.com Saya menghitung byte dengan tangan, jadi beri tahu saya jika saya salah.

Penjelasan

Pertama,> <> adalah 2 dimensi dan dan loop melalui garis atau kolom hingga menyentuh ;atau kesalahan. Ini berarti bahwa jika itu berjalan dari kiri ke kanan (seperti yang dilakukannya pada awal program), itu akan membungkus garis jika mencapai akhir dan tidak dipindahkan atau disuruh menghentikan program. Beberapa karakter per baris akan diulang karena mereka memiliki fungsi yang berbeda tergantung pada arah pointer, dan baris keempat akan memiliki karakter dalam urutan terbalik karena pointer bergerak ke kanan ke kiri.

Ringkasan program disediakan di bawah ini. Lihatlah instruksi yang tercantum untuk> <> pada esolang untuk melihat apa yang dilakukan masing-masing karakter.

Baris 1: 0&v

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

Baris 2: =?\ilb

(mulai dari mana baris 1 memindahkan pointer ke, yaitu karakter ketiga)

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

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

(mulai dari karakter ketiga)

:@ -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

Baris 4: n&/;

(mulai dari karakter ketiga)

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

Ruby, 22 20 byte

p gets.count(gets)-1

Demo: http://ideone.com/MEeTd2

Ini -1karena fakta yang getsmengambil input, ditambah karakter baris baru. Ruby String#countmenghitung berapa kali karakter apa pun dari argumen muncul dalam string.

Misalnya, untuk input [ test\n, t\n], tterjadi dua kali dan \nterjadi sekali, dan perlu dikurangi.

Cristian Lupascu
sumber
Anda dapat menghapus $><<dan mengurangi 4 byte.
Vasu Adari
@VasuAdari tapi saya perlu mencetak hasilnya entah bagaimana ...
Cristian Lupascu
tidak bisakah kamu melakukan ini? ->p gets.count(gets)-1
Vasu Adari
@VasuAdari Anda benar; untuk saat ini saya pikir itu akan menempatkan qutoes di sekitar output, tapi itu numerik jadi tidak apa-apa. Terima kasih!
Cristian Lupascu
2

Ruby, 18 byte

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

Pemakaian:

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

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