Znajdź wystąpienia znaku w ciągu wejściowym


18

Wyzwanie

Napisz program, który, biorąc pod uwagę ciąg o xdługości 10 znaków i znak y, wypisuje liczbę wystąpień znaku yw ciągu x.

Najkrótszy program w bajtach do wygrania wygrywa.

Przykład

Input: tttggloyoi, t
Output: 3

Input: onomatopoe, o
Output: 4

11
To wydaje się zbyt łatwe. Po co też ograniczać wejście do 10, zamiast w ogóle bez limitu?
Fatalize

7
Potrzebuje wygranej.
isaacg

2
Zapraszam do wycofania mojej edycji, jeśli nie zgadza się z Tobą
Beta Decay

8
Jak elastyczny jest format wejściowy? Czy możemy wybrać inny separator, np. Spację lub nową linię? Czy ciąg może być w cudzysłowie? Czy możemy wziąć najpierw literę, a łańcuch drugą? Czy znaki będą zawsze małymi literami? Jeśli nie, jakie inne postacie mogą wystąpić?
Martin Ender

5
To wygląda podejrzanie jak pytanie z wywiadu C ...
Quentin

Odpowiedzi:


18

Pyth, 3 bajty

/ww

Przykładowy przebieg:

$ pyth -c '/ww'
sdhkfhjkkj
k
3

Oczywiście użytkownik może wprowadzić mniej więcej 10 liter przy pierwszym wprowadzeniu, ale nie musimy się martwić, co się stanie, gdy użytkownik naruszy specyfikację.


wygląda na to, że to już nie jest poprawne pytanie?
Ven

wyjaśnienie proszę?
MilkyWay90

@ MilkyWay90 Oto, jak możesz tego użyć: Wypróbuj online! . /po prostu zlicza liczbę wystąpień w pierwszym ciągu wejściowym drugiego ciągu wejściowego. wpobiera wiersz danych wejściowych.
isaacg

@isaacg oh, rozumiem. Dziękuję Ci!
MilkyWay90



6

Bash, 24 znaki

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

Przykładowy przebieg:

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

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


4

Labirynt , 32 29 27 24 bajtów

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

Odczytuje najpierw pojedynczy znak, a następnie ciąg, w którym należy policzyć, i zakłada, że ​​w łańcuchu nie ma bajtów zerowych.

Wyjaśnienie

Kod zaczyna się od ),}, która ustawia spód stosu 1, odczytuje pierwszy znak i przenosi go do stosu pomocniczego do przyszłego użytku. 1Będzie nasz licznik (offset 1 zostanie anulowana później i jest niezbędne dla IP do podjęcia wymaganych obroty).

Adres IP zostanie teraz przesunięty w dół, aby odczytać pierwszy znak ciągu wyszukiwania za pomocą ,. Wartość jest negowana `, ponownie, aby uzyskać prawidłowe zachowanie podczas skręcania. Podczas odczytywania znaków ze STDIN adres IP będzie teraz podążał za tą pętlą:

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

{:}tworzy kopię zapisanego kodu znaków i +dodaje go do bieżącej wartości. Jeśli wynikiem jest 0(tj. Obecna postać jest tą, której szukamy), IP porusza się prosto: -po prostu pozbywając się 0, )zwiększa licznik, {}nie ma możliwości.

Jeśli jednak wynik po +jest niezerowy, nie chcemy liczyć bieżącego znaku. Dlatego adres IP skręca w prawo. To ślepy zaułek, więc kod jest wykonywany dwukrotnie, raz do przodu i raz do tyłu. Oznacza to, że rzeczywisty kod w tym przypadku staje się );___;)+-){}. );pozbywa się tej niezerowej różnicy, ___wypycha 3 zera, ale ;odrzuca jedno z nich. )zwiększa jeden z dwóch pozostałych dwóch zer, +dodaje je do jednego 1, -odejmuje od licznika i )zwiększa licznik. Innymi słowy, stworzyliśmy bardzo rozbudowany system no-op.

Kiedy uderzamy w EOF, ,popycha -1, co `zmienia się, 1a IP skręca w prawo. -odejmuje 1licznik (anulowanie początkowego przesunięcia). !wypisuje licznik i @kończy program.


4

Python 3, 29 bajtów

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

To było łatwe. Zakłada, że ​​wejście jest ciągiem dziesięciu liter.


4
Skopiowałeś mnie! : D
isaacg

1
@isaacg Wielkie umysły myślą podobnie? ; D
Beta Decay

Jeśli nie musisz czytać danych wejściowych, nie f=lambda x,y:x.count(y)byłbyś krótszy? (Przepraszam, jeśli to nie działa, jestem na telefonie komórkowym i nie mogę sprawdzić)
cole

@ mbomb007 Mój błąd, dziękuję za wyjaśnienie.
cole

1
Usunięcie nawiasów wokół wydruku pozwala zaoszczędzić postać print input().count(input())lub a,b=input();print a.count(b)taką samą kwotę
Willem

4

Snowman 1.0.2 , 16 znaków

~vgvgaSaLNdEtSsP

Zaskakująco krótki. Wyjaśnienie:

~      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

Dobra robota! Nie pomyślałbym, że tak krótkie rozwiązanie byłoby możliwe w Snowman.
Alex A.

4

C ++ Metaprogramowanie, 160 154 116 bajtów

Tylko na chichoty.

Dzięki byłemu bartowi za grę w golfa!

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;

Użycie: Pierwszym znakiem w instannacji szablonu jest szukana postać.

Skompiluj z clang -std = c ++ 11 -c -> wynik znajduje się na początku komunikatu o błędzie.

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

Skompiluj z gcc -std = c ++ 11 -c -> wynik znajduje się na dole komunikatu o błędzie.

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)

Wyszukaj A < 3 , „t”, „\ 000”> i A < 3 , „t”, „\ x00”>

Wersja 154 bajtów

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;

Wersja 160 bajtów:

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;

Możesz skrócić, ((x==y)?1:0)aby (x==y)zaoszczędzić około 6 bajtów (tak myślę).
kirbyfan64sos

Dzięki - chciał mieć pewność, że jest to określone zachowanie, bo nie był pewien, co powiedział o standard booldo intnawrócenia.
Otomo

To określone zachowanie.
kirbyfan64sos

Tak, teraz też to wiem. :) Dziękuję Ci bardzo. (Myślałem, że może będzie to zależało od implementacji).
Otomo

1
128 bajtów: użyj anonimowego enumzamiast static const. Użyj 0zamiast, '\0'aby zakończyć. Użyj intzamiast char. Użyj nieco innej deklaracji, aby zainicjować. Usuń nową linię 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;. Sprawdzone za pomocą g ++ i clang.
były bart


3

JavaScript (ES6), 26 bajtów

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

To szybkie i łatwe rozwiązanie definiuje anonimową funkcję. Aby go użyć, dodaj deklarację zmiennej na początku. Wypróbuj to:

EDYCJA: Och, widzę, że jest już bardzo podobne rozwiązanie. Mam nadzieję, że to w porządku.



3

C ++, 78 bajtów

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

Zadzwoń tak:

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

3

Element , 23 bajty

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

Nowa linia jest częścią programu. Właściwie używam go jako nazwy zmiennej .

Ten program działa w zasadzie, przechowując znak docelowy w zmiennej, trzymając bieżący ciąg na górze stosu, a następnie zapętlając proces „rąbania, porównywania i przenoszenia wyniku pod”, sumując wyniki na końcu.

Nowa linia jako nazwa zmiennej pochodzi z używania nowej linii na końcu danych wejściowych poprzez odcięcie jej i zapisanie w niej. Nowa linia w kodzie to miejsce, w którym z niej czytam.

Dane wejściowe są takie:

qqqqwwweee
q

Dane wyjściowe są takie

4

3

Julia, 26 25 bajtów

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

The findinZwraca indeksy w pierwszym argumentem w którym drugi argument występuje w postaci wektora. Długość wektora to liczba wystąpień.

Oszczędność jednego bajtu dzięki Glenowi O.


endofzaoszczędzi ci bajt zamiast length.
Glen O

3

APL, 7 3 bajty

+/⍷

To tworzy ciąg funkcji. Działa, tworząc wektor zer i jedynek odpowiadających indeksom, przy których znak pojawia się w ciągu ( ). Wektor jest następnie sumowany (+/ ).

Zaoszczędzono 4 bajty dzięki kirbyfan64sos i NBZ!


Czy APL jest curry jak K? Myślałem, że możesz po prostu zrobić coś takiego +/⍷(nie znam APL, więc mogę się mylić).
kirbyfan64sos

@ kirbyfan64sos Jedyne curry, jakie znam, to jedzenie, więc nie jestem pewien. Ale przyjrzę się temu. Dzieki za sugestie!
Alex A.

@ kirbyfan64sos Tak, nazywa się to ciągiem funkcji , więc + / ⍷ rzeczywiście by działało, ale ponieważ szukamy jednego znaku, równie dobrze można użyć = zamiast ⍷.
Adám

3

Perl, 21 16 znaków

(13-znakowy kod + 3-znakowa opcja wiersza poleceń.)

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

Przykładowy przebieg:

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

Zgrabna sztuczka z <>!
ThisSuitIsBlackNot

Możesz zapisać bajt, upuszczając -li upewniając się, że twój wpis nie ma końcowego nowego wiersza:echo -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
ThisSuitIsBlackNot

1
I możesz zmniejszyć sumę do 16 za pomocąperl -pe '$_+=s/${\<>}//g'
ThisSuitIsBlackNot

Ta sztuczka odniesienia jest niesamowita. Dziękuję, @ThisSuitIsBlackNot.
manatwork

Dlaczego jest +=potrzebny? =wydaje się działać równie dobrze (i powinien nadal działać, gdy dane wejściowe zaczynają się od niektórych cyfr).
były bart

3

PHP, 36 35 bajtów

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


Użycie:
Wywołaj skrypt z dwoma argumentami.
php script.php qwertzqwertz q

PHP, 23 bajty

Jeśli zarejestrujesz zmienne globalne (możliwe tylko w PHP 5.3 i niższych), możesz zapisać 12 bajtów (dzięki Martijn )

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


Użycie:
Wywołaj skrypt i zadeklaruj zmienne globalnephp script.php?a=qwertzqwertz&b=q


1
Możesz usunąć spację po przecinku, aby uzyskać jeden bajt mniej
Voitcus

1
Jeśli masz zarejestrowane globale, możesz zrobić script.php?a=qwertzqwertz&b=qi zrobić <?=substr_count($a,$b);23 znaki
Martijn

@Martijn dobry pomysł, dziękuję!
jrenk

3

Dyalog APL , 3 bajty

      +/=

Tj. „Suma równych bajtów”. Na przykład:

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

Lub tylko

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

Tym razem K nie pokonuje APL.

Wypróbuj online.


Nie edytuj dziesiątek postów naraz. Całkowicie zalewasz pierwszą stronę. Jeśli jest wiele postów, które wymagają edycji (co czasami się zdarza, np. Ponieważ dodawany jest nowy tag), na ogół miło jest zrobić tylko 3 z nich na raz, a następnie odczekać co najmniej 12 godzin, aby mogli wysiąść z przodu strona.
Martin Ender

@ MartinBüttner Tak, nie zdawałem sobie wtedy sprawy. :-( Zwykli użytkownicy nie mają opcji „Drobne zmiany” ... Zdaję sobie sprawę, dlaczego nie może być dostępna dla wszystkich.
Adám

Niestety nie ma takiej opcji, nawet dla moderatorów.
Martin Ender

3

T-SQL, 99 40 bajtów

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

Po prostu robi różnicę między łańcuchem wejściowym a łańcuchem z usuniętym znakiem. Pobiera dane z tabeli t

Edycja została zmieniona, aby usunąć problem z liczeniem spacji i uwzględnić aktualne dopuszczalne dane wejściowe dla SQL. Dzięki @BradC za wszystkie zmiany i oszczędności


Nie powinieneś potrzebować całego rusztowania, po prostu zrób to SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM t, gdzie t jest wstępnie wypełniona tabela wprowadzania z polami si c.
BradC,

Z drugiej strony, ten kod podaje złą odpowiedź na ciągi takie jak A B C D ten koniec spacji (jeśli zostaniesz poproszony o zliczenie spacji), ponieważ LENignoruje końcowe spacje.
BradC,

@BradC Myślę, że w tamtych czasach reguły dotyczące tego, co było do zaakceptowania, szczególnie wokół SQL, były restrykcyjne i niejasne. space
Spróbuję

Zazwyczaj po prostu wstawiam koniec i odejmuję jeden; w tym przypadku dane wejściowe mają dokładnie 10 znaków, możesz po prostu na SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
stałe

@BradC tak, patrząc ponownie na to, nie jestem pewien, dlaczego pozwoliłem na zmienną długość. Dokonywanie zmian.
MickyT,


2

J, 5 bajtów

+/@:=

Wydaje mi się, że J miałby do tego wbudowaną funkcję, ale nie udało mi się jej znaleźć - może jeden z aktywnych użytkowników J może mnie oświecić. Zamiast tego obowiązuje to pierwsze= do danych wejściowych, zamieniając każdy znak, 1jeśli jest równy żądanemu lub w 0inny sposób. Następnie +/oblicza sumę tej listy.


2

Plik wsadowy, 121 bajtów

Ponieważ jestem 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%

Ostrzeżenie: zakłada, że _ nie występuje w ciągu wejściowym. Jeśli tak, zmienna emusi zostać odpowiednio dostosowana.

To ustawia naszą zmienną licznika ci naszą rozgraniczenie końca łańcucha jako _, przed dołączeniem tego do naszego ciągu wejściowego %1i ustawieniem łańcucha konkatenowanego na t. Następnie wchodzimy do pętli :l, ustawiamy tymczasową zmienną znakową ajako pierwszą postać t, sprawdzamy, czy pasuje ona do naszego drugiego ciągu wejściowego %2i zwiększamy, cjeśli jest to prawda, a następnie usuwamy pierwszy znak t. Nasz warunek końca pętli sprawdza tnaszą demarkację końca łańcucha i zapętla się, jeśli nie. Następnie echowyliczamy wartość naszego licznika.

Prawdopodobnie byłoby możliwe użycie FORzamiast tego pętli, ale wymagałoby to włączenia Opóźnionej Ekspansji , która moim zdaniem będzie w rzeczywistości dłuższa bajtowo niż ta. Weryfikację pozostawiono czytelnikowi jako ćwiczenie.


2

CJam, 5 bajtów

ll/,(

Wyjaśnienie

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

2

PowerShell, 32 bajty

Cztery za jednego! I wszystkie są tej samej długości! :)

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

lub

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

Alternatywnie,

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

lub

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'

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.