Katakan bahwa Anda memiliki string seperti ini:
abaabbbbbaabba
Hitung berapa kali karakter tertentu muncul dalam string input, tetapi hanya jika karakter hanya muncul sekali dalam satu baris . Misalnya, jika karakternya adalah a
,
abaabbbbbaabba
^ x x ^
Totalnya adalah 2 ( aa
tidak akan dihitung karena a
muncul dua kali berturut-turut).
Bagaimana ini terkait dengan FizzBuzz?
Jika karakter muncul 3 (atau kelipatan 3) kali berturut-turut, atau 5 (atau kelipatan 5) kali berturut-turut, penghitung akan dikurangi sebagai gantinya. Jika kelipatan 3 dan 5 kali, penghitung masih bertambah. Ingat bahwa penghitung juga bertambah jika karakter hanya muncul sekali dalam satu baris, dan diabaikan jika karakter muncul beberapa kali berturut-turut (selain situasi yang dijelaskan di atas).
Untuk rekap, jika string yang cocok adalah a
,
input counter (explanation)
a 1 (single occurence)
aaa -1(multiple of 3)
aaaaa -1(multiple of 5)
aaaaaaaaaaaaaaa 1 (multiple of 15)
aa 0 (none of the above)
aba 2 (two single instances)
aaba 1 (one single occurence(+1) and one double occurence(ignored))
aaaba 0 (one single occurence(+1) and one triple (-1)
aaaaaa -1 (six is a multiple of three)
Implementasi referensi (ungolfed) di java:
import java.util.Scanner;
import java.util.regex.*;
public class StrMatcher {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //Scanner to get user input
int total = 0;//Running total of matches
System.out.println("Enter a string: ");
String strBeingSearched = sc.nextLine(); //String that will be searched
System.out.println("Enter string to match with: ");
String strBeingMatched = sc.nextLine(); //Substring used for searching
//Simple regex matcher
Pattern pattern = Pattern.compile("(" + strBeingMatched + ")+");
Matcher matcher = pattern.matcher(strBeingSearched);
while(matcher.find()){ //While there are still matches
int length = matcher.end() - matcher.start();
int numberOfTimes = length/strBeingMatched.length();//Calculate how many times in a row the string is matched
if((numberOfTimes == 1)||((numberOfTimes % 3 == 0) && (numberOfTimes % 5 == 0))){
total++; //Increment counter if single match or divisible by 15
} else if((numberOfTimes % 3 == 0)||(numberOfTimes % 5 == 0)) {
total--; //Decrement counter if divisible by 3 or 5 (but not 15)
}
strBeingSearched = strBeingSearched.substring(matcher.end());
matcher = pattern.matcher(strBeingSearched); //Replace string/matcher and repeat
}
System.out.println(total);
}
}
- String yang akan dicari bisa panjang, tetapi polanya hanya satu karakter.
- String tidak akan memiliki karakter khusus regex.
- Ini adalah kode-golf ; program terpendek dalam byte menang.
- Tidak ada celah standar.
Jawaban:
Funciton , 1840 byte
Sialan, bahasa ini tidak bisa diubah.
Program ini mengharapkan karakter pertama dari input menjadi karakter untuk dicari, dan sisanya dari input untuk membuat string untuk dicari. Ini berarti bahwa
aaaba
akan mencaria
inputaaba
(dan dengan demikian output 1). Anda dapat memisahkannya dengan baris baru atau spasi (a aaba
) tetapi hanya karena baris baru / spasi tidak membuat perbedaan pada output.Seperti biasa, Anda bisa mendapatkan rendering yang tampak lebih bagus (tanpa spasi baris) jika Anda mengeksekusi
$('pre').css('line-height',1)
di konsol browser Anda.(1840 byte ketika dikodekan sebagai UTF-16.)
Penjelasan
¹
mengembalikan karakter pertama dari sebuah string.²
menghitung jumlah kemunculan karakter pada awal string yang diberikan. Misalnya, mengingat karaktera
dan stringaaba
, ia mengembalikan 2. Untuka
danbaa
, mengembalikan 0.³
panggilan²
untuk mendapatkan jumlah karakter di awal, memeriksa apakah jumlahnya dapat dibagi 3 dan 5 dan apakah itu sama dengan 1 dan menentukan kenaikan / penurunan yang tepat. Itu juga menghilangkan satu karakter tambahan dari awal string (mis. Diberikanaaabba
itu menghilangkan 3 + 1 = 4 karakter, memberiba
). Kemudian ia memanggil dirinya secara rekursif dengan string yang lebih pendek dan menambahkan hasilnya.¹
untuk menghapus karakter pertama dari input dan panggilan³
dengan karakter itu dan sisa string sebagai argumen terpisah.sumber
CJam,
4036353230 byteTerima kasih kepada @ MartinBüttner untuk bermain golf 1 byte!
Terima kasih kepada @AndreaBiondo untuk bermain golf 2 byte dan membuka jalan untuk 3 lagi!
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
llcf=e`::*0-{(_!\6563282Zb:(=}%1b
adalah 33 byte.C,
160126125119114109104100 byteMungkin bisa dibuat lebih baik ... Ini mengambil input dari argumen baris perintah (argumen pertama adalah pola, kedua adalah string). Tidak mendukung pencarian pola NULL char (\ x00).
EDIT **
126125119114109104100 byte **: Setelah memasukkan saran Dennis, dan beberapa ide tambahan (dihapus klausa lain, menggabungkan sementara ke dalam satu pernyataan tunggal dan menggunakan pengurangan bukannya! =). Juga menghapus titik koma ekstra untuk loop (yang sebenarnya merupakan bagian dari saran Dennis). Lebih singkat lagi dengan menghapus variabel 'i' dan 'a'.Menghapus operator if dan negation ('!') Dengan menyalahgunakan operator ternary. Mengompresi pemeriksaan modularitas dengan menggunakan
bitwise 'DAN' trikganda && karena bitwise '&' memiliki bug, dan menempatkan perbandingan (t <2) di dalam operator ternary. Digantikan !! t * (...) dengan memindahkan !! t ke operator ternary, sehingga memungkinkan saya untuk menghapus tanda kurung.Sobat, saya benar-benar ingin mendapatkannya di bawah tanda 100 byte: S
Solusi TENTATIF: Saya tidak yakin apakah ini akan dianggap valid, tetapi saya bisa turun ke 93 karakter jika saya menggunakan exit (bukan) printf ("% d", s). Tapi kemudian output tidak akan terlihat, melainkan kode balik. Jika output benar-benar diperlukan, saya juga bisa turun ke 98 byte, tetapi akan membutuhkan pencetakan semua nilai menengah sebelum jawaban akhir juga ...
sumber
i,t,s,a;main(c,z)char**z;{a=*z[1];while(c){if((c=z[2][i])!=a)s+=(!!t)*((t<2)-!(t%3)-!(t%5)+3*!(t%15)),t=0;else++t;++i;}printf("%d",s);}
harus bekerja dengan baik (dan 23 byte lebih pendek).main
denganfor(a=*z[1];c;i++)
, Anda tidak perlu{}
sekitar if ... else.Ruby,
111 10396 byteTantangan ini dibuat untuk Ruby
Enumerable#chunk
, jadi saya harus memposting ini. :)Tes online: http://ideone.com/pG4mAn
Kode ini cukup mudah. Ini versi yang lebih mudah dibaca: http://ideone.com/ub3siA .
sumber
Python 3,
361, 300, 296, 263, 256, 237, 229, 188, 178, 164 byte.Disimpan 15 byte berkat vaultah dari SOPython.
Disimpan 9 byte berkat Joe Kington dari SOPython.
Disimpan 11 byte berkat DSM dari SOPython.
Ini adalah pertama kalinya saya mengirimkan jawaban, jadi saya yakin ini bisa menjadi jauh lebih singkat. Dibutuhkan string uji sebagai respons pertama terhadap input, dan char pencarian sebagai yang kedua.
Versi tidak disatukan:
Mengetahui saya gagal dalam salah satu kasus uji.
sumber
Haskell, 120 byte
f
melakukan pekerjaan.sumber
Java,
146152143138139136 byte%3&%5
pemeriksaan.i<2
Perbandingan singkat .%3&%5
centang tidak berfungsi seperti yang diperkirakan).Diterapkan sebagai
BiFunction<String, String, Integer>
dalam Java 8, beri tahu saya apakah ini diperlukan untuk menjadi program lengkap (atau jika saya bahkan dapatjava.util.regex
meletakkan awalan paket di bawah).Jumlah byte di atas tidak termasuk baris baru di bawah ini, yang hanya ditambahkan untuk keperluan pemformatan di situs ini.
Penjelasan kasar:
b
, yaitu"[^"+b+"]"
."a" -> 1
.).-1
,0
dan1
.sum()
untuk mendapat jawaban.sumber
Javascript, 206 byte
Diperluas:
Penjelasan:
Saya menggunakan regex untuk menghitung total kali karakter muncul, lalu kurangi dari itu setiap kali muncul dalam grup. Akhirnya, saya pergi melalui kelompok dan melakukan kenaikan / penurunan desis desis.
Lulus uji kasus yang diberikan dalam pertanyaan:
dan seterusnya
sumber
new
, gunakanexec
bukanmatch
, dan aliaslength
, dan Anda harus baik.Perl,
82656359 byte58 byte + 1 byte parameter baris perintah
Tidak terlalu pendek, tapi ini awal - akan terus memperpendeknya.
Dengan asumsi
-i
dapat digunakan untuk memberikan string input contoh penggunaan adalah sebagai berikut:sumber
Pyth, 32 byte
sangat dekat! 2 byte lagi untuk mengikat entri CJam yang sangat baik dari Dennis
Uji secara online
sumber
melongo, 140
Masukkan sebagai "string spasi", seperti itu
Tidak disatukan
sumber
Pyth, 27 byte
Suite uji
Masukan dalam bentuk misalnya:
Penjelasan:
sumber