Знайдіть входження символу у рядок введення


18

Виклик

Напишіть програму, яка, даючи рядок xдовжиною 10 символів і символ y, видає кількість разів, коли символ yвиникає в рядку x.

Виграє найкоротша програма в байтах.

Приклад

Input: tttggloyoi, t
Output: 3

Input: onomatopoe, o
Output: 4

11
Це здається майже надто легким викликом. Також навіщо обмежувати вхід 10, а не обмежувати взагалі?
Фаталізувати

7
Потрібна умова виграшу.
isaacg

2
Не соромтеся відкатати мою редакцію, якщо вона не згодна з вами
Beta Decay

8
Наскільки гнучким є формат введення? Чи можемо ми вибрати інший роздільник, як пробіл чи новий рядок? Чи може рядок бути в лапках? Чи можемо ми взяти букву першою, а рядок - другою? Чи завжди символи будуть малими літерами? Якщо ні, то які інші символи можуть виникнути?
Мартін Ендер

5
Це підозріло схоже на запитання про співбесіду С ...
Квентін

Відповіді:


18

Pyth, 3 байти

/ww

Приклад виконання:

$ pyth -c '/ww'
sdhkfhjkkj
k
3

Звичайно, користувач може ввести більше або менше 10 букв на першому вході, але нам не потрібно турбуватися про те, що станеться, коли користувач порушує специфікацію.


здається, це вже не дійсний піт?
Вен

пояснення будь ласка?
MilkyWay90

@ MilkyWay90 Ось як ви можете використовувати це: Спробуйте в Інтернеті! . /просто підраховує кількість випадків виникнення в першому вхідному рядку другого вхідного рядка. wприймає рядок введення.
isaacg

@isaacg о, я бачу. Дякую!
MilkyWay90



6

Баш, 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

6

Сітківка , 12 байт

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

Просто регулярний вираз, який відповідає символу, який дорівнює останньому символу вхідних даних (крім самого себе). При отриманні єдиного регулярного вираження Retina просто повертає кількість збігів.


Нічого собі, я тут намагаюся робити всілякі вигадливі речі з rs , а ти бив мене дурками. +1
kirbyfan64sos

4

Лабіринт , 32 29 27 24 байт

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

Це спочатку зчитує єдиний символ, а потім - рядок, в якому потрібно рахувати, і передбачає, що в рядку немає нульових байтів.

Пояснення

Код починається з ),}, який встановлює нижню частину стека 1, зчитує перший символ і переміщує його в допоміжний стек для подальшого використання. 1Буде наш лічильник (зміщення 1 буде скасований пізніше і необхідно для IP вжити необхідних обертів).

Тепер IP буде рухатися вниз, щоб прочитати перший символ рядка пошуку ,. `Знову не змінюється значення , щоб отримати правильну поведінку повороту. Поки ми читаємо символи з STDIN, тепер IP буде слідувати цьому циклу:

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

{:}робить копію збереженого коду символів і +додає його до поточного значення. Якщо результат 0(тобто поточний символ - той, кого ми шукаємо), IP рухається прямо вперед: -просто позбавляється від 0, )збільшуючи лічильник, {}є неоперативним.

Однак якщо результат після +не дорівнює нулю, ми не хочемо рахувати поточний символ. Таким чином, IP замість цього приймає правий поворот. Це глухий кут, тому цей код виконується два рази, один раз вперед і один раз назад. Тобто фактичним кодом у цьому випадку стає );___;)+-){}. );просто позбавляється від цієї ненульової різниці, ___штовхає 3 нулі, але ;одне з них відкидає. )збільшує один з двох решти двох нулів, +додає їх в єдине 1, -віднімає його від лічильника і )збільшує лічильник. Іншими словами, ми створили дуже продуманий не-оп.

Коли ми натискаємо на EOF, ,штовхає -1, який `перетворюється на, 1і IP бере праворуч. -віднімає 1від лічильника (скасовує початкове зміщення). !друкує лічильник і @припиняє програму.


4

Python 3, 29 байт

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

Мех, це було легко. Припускається, що введення - це десятилітковий рядок.


4
Ви скопіювали мене! : D
isaacg

1
@isaacg Великі уми думають однаково? ; D
бета-розпад

Якщо вам не потрібно читати дані, не f=lambda x,y:x.count(y)буде коротше? (Вибачте, якщо це не працює, я перебуваю на мобільному і не можу перевірити)
cole

@ mbomb007 Моя помилка, дякую за уточнення.
cole

1
Якщо зняти дужки навколо друку, ви заощадите персонажа print input().count(input())або a,b=input();print a.count(b)на стільки ж
Віллем

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

Хороша робота! Я б не подумав, що таке коротке рішення буде можливим у Сніговика.
Олексій А.

4

C ++ Template-Metaprogramming, 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

Спасибі - хотів , щоб бути впевненим , що воно визначено поведінку, тому що я не був упевнений , що стандарт говорить про те, boolщоб intперетворення.
Otomo

Це визначена поведінка.
kirbyfan64sos

Так, зараз я теж це знаю. :) Велике спасибі. (Я думав, можливо, це буде залежним від реалізації.)
Otomo,

1
128 байт: Використовуйте анонімні enumзамість static const. Використовуйте 0замість того, '\0'щоб припинити. Використовуйте intзамість char. Використовуйте дещо іншу декларацію для екземпляра. Видаліть суперфлуос з нового рядка. 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 ++ та клаксу.
екс-барт


3

Javascript (ES6), 26 байт

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

Це швидке швидке рішення визначає анонімну функцію. Щоб використовувати його, додайте змінну заяву до початку. Спробуй:

EDIT: О, я бачу, вже є дуже подібне рішення. Я сподіваюся, що це нормально.



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))

The findinФункція повертає індекси в якості першого аргументу , при якому другий аргумент знайдений в якості вектора. Довжина вектора - це кількість подій.

Збережено один байт завдяки Глену О.


endofзбереже байт замість length.
Glen O

3

APL, 7 3 байти

+/⍷

Це створює функціональний потяг. Він працює, створюючи вектор нулів і ті, що відповідають індексам, при яких символ з'являється в рядку ( ). Потім вектор підсумовується ( +/).

Збережено 4 байти завдяки kirbyfan64sos та NBZ!


APL вигулюється як K? Я б подумав, що ти можеш просто зробити щось на кшталт +/⍷тоді (я не знаю APL, тому я можу помилитися).
kirbyfan64sos

@ kirbyfan64sos Єдине каррі, яке я знаю, - це їжа, тому я не впевнений. Але я загляну в це. Дякую за пропозицію!
Олексій А.

@ kirbyfan64sos Так, це називається функціональним поїздом , тому + / ⍷ справді спрацює, але оскільки ми шукаємо одну таблицю, можна також використовувати = замість ⍷.
Adám

3

Perl, 21 16 символів

(Код 13 символів + параметр командного рядка з 3 символами.)

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

Проба зразка:

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

Акуратний трюк з <>!
ThisSuitIsBlackNot

Ви можете зберегти байт, скинувши -lі переконавшись, що у вашому введенні немає нового рядка:echo -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
ThisSuitIsBlackNot

1
І ви можете збити свою загальну суму до 16 за допомогоюperl -pe '$_+=s/${\<>}//g'
ThisSuitIsBlackNot

Цей посилальний трюк неймовірний. Дякую, @ThisSuitIsBlackNot.
манатура

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'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.