Найти вхождения символа во входной строке


18

Вызов

Напишите программу, которая, учитывая строку xдлиной 10 символов и символ y, выводит, сколько раз символ yвстречается в строке x.

Самая короткая в байтах программа для этого побеждает.

пример

Input: tttggloyoi, t
Output: 3

Input: onomatopoe, o
Output: 4

11
Это кажется слишком легкой задачей. Также зачем ограничивать ввод 10, а не вообще?
Fatalize

7
Требуется условие победы.
Исаак

2
Не стесняйтесь отменить мои изменения, если они не согласны с вами
Beta Decay

8
Насколько гибок формат ввода? Можем ли мы выбрать другой разделитель, например пробел или перевод строки? Может ли строка быть в кавычках? Можем ли мы взять письмо первым, а строку вторым? Будут ли символы всегда в нижнем регистре? Если нет, какие еще символы могут появляться?
Мартин Эндер

5
Это выглядит подозрительно, как вопрос интервью С ...
Квентин

Ответы:


18

Pyth, 3 байта

/ww

Пример выполнения:

$ pyth -c '/ww'
sdhkfhjkkj
k
3

Конечно, пользователь мог ввести более или менее 10 букв на первом вводе, но нам не нужно беспокоиться о том, что произойдет, когда пользователь нарушает спецификацию.


Похоже, что это не действительный Pyth больше?
Ven

объяснение пожалуйста?
MilkyWay90

@ MilkyWay90 Вот как вы можете использовать это: Попробуйте онлайн! , /просто считает количество вхождений в первой входной строке второй входной строки. wзанимает строку ввода.
Исаак

@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
Исаак

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

Если вам не нужно читать ввод, не f=lambda x,y:x.count(y)будет короче? (Извините, если это не работает, я на мобильном и не могу проверить)
Коул

@ mbomb007 Моя ошибка, спасибо за разъяснения.
Коул

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

Хорошо сделано! Я бы не подумал, что такое короткое решение будет возможно в Snowman.
Алекс А.

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преобразования.
Отомо

Это определенное поведение.
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

Это быстрое и простое решение определяет анонимную функцию. Чтобы использовать его, добавьте объявление переменной в начало. Попробуйте это:

РЕДАКТИРОВАТЬ: О, я вижу, уже есть очень похожее решение. Я надеюсь, что все в порядке.



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

findinФункция возвращает индексы в качестве первого аргумента , при котором второй аргумент найден в качестве вектора. Длина вектора - это число вхождений.

Сохранено один байт благодаря Глену О.


endofсэкономит вам байт вместо length.
Глен О

3

APL, 7 3 байта

+/⍷

Это создает функциональный поезд. Он работает путем создания вектора нулей и единиц, соответствующих индексам, при которых символ появляется в строке ( ). Затем вектор суммируется ( +/).

Сохранено 4 байта благодаря kirbyfan64sos и NBZ!


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

@ kirbyfan64sos Единственное карри, которое я знаю, это еда, поэтому я не уверен. Но я посмотрю на это. Спасибо за предложение!
Алекс А.

@ kirbyfan64sos Да, это называется поездом функций , поэтому + / indeed действительно сработает, но, поскольку мы ищем один символ, лучше использовать = вместо ⍷.
Адам

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.
Манатворк

Зачем это +=нужно? =кажется, работает так же хорошо (и все равно должен работать, когда ввод начинается с нескольких цифр).
экс-Барт

3

PHP, 36 35 байт

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


Использование:
вызов сценария с двумя аргументами.
php script.php qwertzqwertz q

PHP, 23 байта

Если вы регистрируете глобальные переменные (возможно только в PHP 5.3 и ниже), вы можете сохранить 12 байтов (благодаря Martijn )

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


Использование:
вызов скрипта и объявление глобальных переменных.php script.php?a=qwertzqwertz&b=q


1
Вы можете удалить пробел после запятой, чтобы получить на один байт меньше
Voitcus

1
Если зарегистрировать глобал вы можете сделать script.php?a=qwertzqwertz&b=q, и сделать <?=substr_count($a,$b);, 23 символов
Мартейн

@ Martijn хорошая идея, спасибо!
июля

3

Дьялог АПЛ , 3 байта

      +/=

Т.е. "сумма равных байтов". Например:

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

или просто

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

К на этот раз не победил APL.

Попробуйте онлайн.


Пожалуйста, не редактируйте десятки сообщений одновременно. Вы полностью заполняете первую страницу. Если существует много постов, которые нужно редактировать (что иногда случается, например, из-за добавления нового тега), то обычно хорошо делать только 3 из них за один раз, а затем подождать не менее 12 часов, чтобы они могли выпадать с фронта. стр.
Мартин Эндер

@ MartinBüttner Да, тогда я этого не понимал. :-( У обычных пользователей нет опции «Незначительное редактирование» ... Я понимаю, почему она не может быть доступна для всех.
Адам

К сожалению, такой опции нет вообще, даже для модераторов.
Мартин Эндер

3

T-SQL, 99 40 байт

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

Просто делает разницу между входной строкой и строкой с удаленным символом. Принимает данные из таблицы т

Изменить, чтобы устранить проблему с подсчетом пробелов и учесть текущие приемлемые входные данные для SQL. Спасибо @BradC за все изменения и экономию


Вам не нужно все леса, просто сделайте SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM t, где t предварительно заполненная входная таблица с полями sи c.
BradC

С другой стороны, этот код дает неправильный ответ для таких строк, A B C D которые заканчиваются пробелами (если вас просят подсчитать пробелы), поскольку LENигнорирует конечные пробелы.
BradC

@BradC Я думаю, тогда правила, что было приемлемо, особенно в отношении SQL, были ограничительными и неясными. Я посмотрю, как исправить spaceпроблему, когда у меня будет немного времени
MickyT

Я обычно просто дополняю конец и вычитаю один; в этом случае ввод гарантированно будет ровно 10 символов, вы можете просто жестко закодировать его какSELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
BradC

@BradC да, глядя на это еще раз, не уверен, почему я учел переменную длину. Вносить изменения.
MickyT


2

J, 5 байт

+/@:=

Я чувствую, что у J есть встроенная функция для этого, но я не смог найти ее - может быть, один из активных пользователей J может просветить меня. Таким образом, вместо этого это сначала относится =к входам, превращая каждый символ в, 1если он равен запрошенному или 0нет. Затем +/вычисляет сумму этого списка.


2

Пакетный файл, 121 байт

Потому что я мазохист ...

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%

Предупреждение. Предполагается, что _этого не происходит во входной строке. Если это так, то переменная eдолжна быть скорректирована соответствующим образом.

Это устанавливает нашу переменную-счетчик cи нашу демаркацию конца строки как _, прежде чем добавить ее к нашей входной строке %1и установить для объединенной строки значение t. Затем мы входим в цикл :l, мы устанавливаем временную символьную переменную aв качестве первого символа t, проверяем, соответствует ли она нашей второй входной строке, %2и увеличиваем, cесли true, затем обрезаем первый символ t. Наше условие конца цикла проверяет tнашу демаркацию конца строки и возвращается в исходное состояние, если нет. Затем мы echoполучаем значение нашего счетчика.

Вероятно, было бы возможно использовать FORцикл вместо этого, но это потребовало бы включения DelayedExpansion , который, я думаю, будет на самом деле длиннее, чем этот. Проверка этого оставлена ​​в качестве упражнения для читателя.


2

CJam, 5 байтов

ll/,(

объяснение

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

2

PowerShell, 32 байта

Четыре на одного! И они все одинаковой длины! :)

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

или

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

С другой стороны,

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

или

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

Первые два стиля используют встроенный оператор -split, а вторые два неявно приводят первый аргумент в виде строки и используют.Split() оператор на основе строки. Во всех случаях возвращается массив, где мы должны уменьшить значение Count на единицу, так как мы возвращаем на один элемент массива больше, чем вхождения второго аргумента.

Это было довольно весело ...


2

Юлия, 21 байт

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

Обратите внимание, что для этого требуется cсимвол, а не строка из одного символа. Таким образом, вы используете его как f("test me",'e')(который возвращает 2), а не f("test me","e")(который возвращает 0, потому что 'e'!="e").


2

> <> (Рыба) , 30 байт

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

Берет строку, затем символ для подсчета. Ввод не разделен (по крайней мере, в онлайн-переводчике). Попробуйте это на онлайн-переводчике: http://fishlanguage.com Я посчитал байты вручную, поэтому дайте мне знать, если я ошибаюсь.

объяснение

Во-первых,> <> является двухмерным и проходит по строке или столбцу, пока не достигнет ; ошибку или. Это означает, что если он движется слева направо (как это происходит в начале программы), он обернется вокруг строки, если достигнет конца и не будет перемещен или получит указание остановить программу. Некоторые символы в строке будут повторяться, потому что они имеют разные функции в зависимости от направления указателя, а четвертая строка будет содержать символы в обратном порядке, поскольку указатель перемещается справа налево.

Краткое описание программы приводится ниже. Посмотрите инструкции, перечисленные для> <> на esolangs, чтобы увидеть, что делает каждый отдельный символ.

Строка 1: 0&v

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

Строка 2: =?\ilb

(начиная с того места, где строка 1 перемещает указатель, то есть третий символ)

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

строка 3: =?\:@=&+&l1

(начиная с третьего символа)

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

Строка 4: n&/;

(начиная с третьего символа)

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

2

Рубин, 22 20 байт

p gets.count(gets)-1

Демо: http://ideone.com/MEeTd2

Это -1связано с тем, что getsизвлекает ввод, плюс символ новой строки. Ruby's String#countподсчитывает, сколько раз любой символ из аргумента встречается в строке.

Например, для input [ test\n, t\n], tпроисходит дважды, а \nвстречается один раз, и его нужно вычесть.


Вы можете удалить $><<и уменьшить 4 байта.
Васу Адари

@VasuAdari, но мне нужно как-то напечатать результат ...
Кристиан Лупаску,

ты не можешь этого сделать? ->p gets.count(gets)-1
Васу Адари

@VasuAdari Ты прав; на данный момент я думал, что это поставит квоты вокруг вывода, но он числовой, так что все в порядке. Благодарность!
Кристиан Лупаску

2

Рубин, 18 байт

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

Использование:

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