입력 문자열에서 문자의 출현을 찾으십시오


18

도전

문자열 x이 10 자이고 문자가 주어지면 string 에서 y문자 y가 발생 하는 횟수를 출력 하는 프로그램을 작성하십시오 x.

바이트 단위의 가장 짧은 프로그램이 승리합니다.

Input: tttggloyoi, t
Output: 3

Input: onomatopoe, o
Output: 4

11
이것은 도전하기가 너무 쉬운 것 같습니다. 또한 입력을 전혀 제한하지 않고 입력을 10으로 제한하는 이유는 무엇입니까?
치명적

7
승리 조건이 필요합니다.
isaacg

2
동의하지 않으면 수정 사항을 롤백하십시오.
Beta Decay

8
입력 형식은 얼마나 유연합니까? 공백이나 줄 바꿈과 같은 다른 구분 기호를 선택할 수 있습니까? 문자열을 따옴표로 묶을 수 있습니까? 우리는 먼저 문자와 둘째 문자열을 취할 수 있습니까? 문자는 항상 소문자입니까? 그렇지 않은 경우 다른 문자가 발생할 수 있습니까?
마틴 엔더

5
이것은 C 면접 질문처럼 의심스럽게 보인다 ...
Quentin

답변:


18

Pyth, 3 바이트

/ww

예제 실행 :

$ pyth -c '/ww'
sdhkfhjkkj
k
3

물론 사용자는 첫 번째 입력에 10 자 이상을 입력 할 수 있지만 사용자가 사양을 위반할 때 어떤 일이 발생할지 걱정할 필요가 없습니다.


더 이상 유효한 pyth가 아닌 것 같습니다.
Ven

설명 부탁 해요?
MilkyWay90

@ MilkyWay90 사용 방법은 다음과 같습니다. 온라인으로 사용해보십시오! . /두 번째 입력 문자열의 첫 번째 입력 문자열에서 발생 횟수를 계산합니다. w입력 라인을받습니다.
isaacg

@isaacg 아, 알겠습니다. 감사합니다!
MilkyWay90


7

자바 스크립트, 32

(p=prompt)().split(p()).length-1

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로 모든 종류의 멋진 일을 하려고 노력하고 있으며, 당신은 lookaheads로 나를 이겼습니다. +1
kirbyfan64sos

4

미로 , 32 29 27 24 바이트

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

단일 문자를 먼저 읽은 다음 계산할 문자열을 읽고 문자열에 널 바이트가 없다고 가정합니다.

설명

코드는로 시작 ),}하여 스택의 맨 아래를로 설정하고 1첫 번째 문자를 읽고 나중에 사용할 수 있도록 보조 스택으로 옮깁니다. 1될 것입니다 카운터 (1 오프셋 나중에 취소되고 IP가 필요한 회전을 할 필요가됩니다).

이제 IP가 아래로 이동하여 검색 문자열의 첫 문자를로 읽습니다 ,. `올바른 회전 동작을 얻으려면 값을 다시 무시 합니다. STDIN에서 문자를 읽는 동안 IP는 이제이 루프를 따릅니다.

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

{:}저장된 문자 코드를 복사 +하여 현재 값에 추가합니다. 결과 인 경우 0(즉, 현재의 문자는 우리가 찾고있는 하나입니다), 똑바로 IP 이동 : -간단히 없애는는 0, )증가 카운터, {}no-op입니다.

그러나 이후의 결과 +가 0이 아닌 경우 현재 문자를 계산하지 않습니다. 따라서 IP는 대신 우회전을합니다. 그것은 막 다른 길이므로 코드가 두 번, 한 번 앞으로 그리고 한 번 뒤로 실행됩니다. 즉,이 경우 실제 코드는 );___;)+-){}입니다. );0이 아닌 차이를 제거하고 ___3을 0으로 밀고 ;그 중 하나를 버립니다. )나머지 두 개의 제로 단위로 하나 +하나의 추가로 1, -카운터로부터이를 감산 )증분 카운터. 다시 말해, 우리는 매우 정교한 노-업을 만들었습니다.

우리는 EOF, 명중하면 ,푸시 -1, `변신 1과 IP가 우회전을 걸립니다. 카운터에서 -빼기 1(초기 오프셋 취소) !카운터를 인쇄하고 @프로그램을 종료합니다.


4

파이썬 3, 29 바이트

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

Meh, 이것은 쉬웠다. 입력이 10 자 문자열이라고 가정합니다.


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)같은 양을 절약 할 수 있습니다
Willem

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

잘 했어! 나는 눈사람에서 짧은 해결책이 가능할 것이라고 생각하지 않았을 것입니다.
Alex A.

4

C ++ 템플릿 메타 프로그래밍, 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;

약 6 바이트를 절약하기 위해 단축 ((x==y)?1:0)할 수 있습니다 (x==y)(제 생각에).
kirbyfan64sos

감사합니다. 표준 boolint전환 에 대해 무엇을 말했는지 잘 모르기 때문에 동작이 정의되어 있는지 확인하고 싶습니다 .
Otomo

정의 된 동작입니다.
kirbyfan64sos

그래, 나도 알아 :) 대단히 감사합니다. (어쩌면 구현에 따라 달라질 수 있다고 생각했습니다.)
Otomo

1
128 바이트 : enum대신 익명 을 사용하십시오 static const. 0대신에 사용하십시오 '\0'. int대신에 사용하십시오 char. 약간 다른 선언을 사용하여 설정하십시오. 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;. g ++ 및 clang으로 확인되었습니다.
전 바트


3

자바 스크립트 (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 함수는 두 번째 인수가 벡터로있는 첫 번째 인수의 인덱스를 반환합니다. 벡터의 길이는 발생 횟수입니다.

Glen O 덕분에 1 바이트를 절약했습니다.


endof대신 바이트를 저장합니다 length.
Glen O

3

APL, 7 3 바이트

+/⍷

이것은 기능 기차를 만듭니다. 문자열에 문자가 나타나는 인덱스에 해당하는 0과 1로 구성된 벡터를 만들어 작동합니다 ( ). 그런 다음 벡터를 합산합니다 (+/ ).

kirbyfan64sos 및 NBZ 덕분에 4 바이트가 절약되었습니다!


APL은 K처럼 카레입니까? 나는 당신이 다음과 같은 일을 할 수 있다고 생각할 것입니다 +/⍷(APL을 모르므로 잘못되었을 수도 있습니다).
kirbyfan64sos

내가 아는 유일한 카레는 음식이므로 확실하지 않습니다. 그러나 나는 그것을 조사 할 것이다. 제안 해 주셔서 감사합니다!
Alex A.

@ kirbyfan64sos 예, 함수 트레인 이라고 하므로 + / ⍷는 실제로 작동하지만 단일 문자를 찾고 있기 때문에 ⍷ 대신 =를 사용할 수도 있습니다.
Adám

3

펄, 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.
manatwork

+=필요한가? =똑같이 작동하는 것처럼 보입니다 (입력이 일부 숫자로 시작될 때 여전히 작동해야 함).
전 바트

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
쉼표 뒤에 공백을 제거하여 1 바이트를 줄일 수 있습니다.
Voitcus

1
당신은 당신이 할 수있는 전역을 등록 할 경우 script.php?a=qwertzqwertz&b=q, 및 수행 <?=substr_count($a,$b);, 23 개 문자
마티

@Martijn 좋은 생각 감사합니다!
jrenk

3

Dyalog APL , 3 바이트

      +/=

즉 "같은 바이트의 합"입니다. 예 :

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

아니면 그냥

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

이번에는 K가 APL을 이길 수 없습니다.

온라인으로 사용해보십시오.


한 번에 수십 개의 게시물을 편집하지 마십시오. 첫 페이지가 완전히 넘칩니다. 수정이 필요한 게시물이 많은 경우 (예 : 새 태그 추가 등으로 인해 가끔 발생), 일반적으로 한 번에 3 개만 수행 한 다음 12 시간 이상 기다렸다가 앞면에서 제거 할 수 있습니다. 페이지.
마틴 엔더

@ MartinBüttner 네, 그때는 몰랐어요. :-( 일반 사용자에게는 "사소한 편집"옵션이 없습니다 ... 모든 사람이 사용할 수없는 이유를 알고 있습니다.
Adám

불행히도 중재자에게는 그런 옵션이 전혀 없습니다.
마틴 엔더

3

T-SQL, 99 40 바이트

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

입력 문자열과 문자가 제거 된 문자열의 차이점을 간단히 나타냅니다. 테이블 t에서 입력을받습니다.

공백 계산 문제를 제거하고 SQL에 허용되는 현재 입력을 고려하기 위해 편집이 변경되었습니다. 모든 변경 및 절약에 대한 @BradC 감사합니다


당신은 할 모든에게 발판을 필요가 없습니다 SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM tt 입니다 미리 채워진 입력 테이블 필드 sc.
BradC

또 다른 참고로,이 코드 는 후행 공백을 무시 A B C D 하므로 공백으로 끝나는 문자열과 같은 문자열에 대해 잘못된 대답을 제공합니다 (공백을 계산하도록 요청받은 경우) LEN.
BradC

@BradC 그 당시에는 특히 SQL과 관련하여 수용 가능한 것에 관한 규칙이 제한적이고 불분명했습니다. space약간의 시간이있을 때 문제를 해결 하는 방법을 살펴 보겠습니다.
MickyT

나는 보통 끝을 채우고 뺍니다. 이 경우 입력은 정확히 10 SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
자임을

@BradC 그래, 이것을 다시보고, 왜 내가 가변 길이를 허용했는지 확실하지 않습니다. 변경합니다.
MickyT


2

J, 5 바이트

+/@:=

J에 내장 기능이 있다고 생각하지만 찾을 수 없었습니다. 아마도 활성 J 사용자 중 한 명이 나를 밝힐 수 있습니다. 대신 이것은 먼저 =입력에 적용 되어 각 문자 1가 요청 된 문자와 같거나 0다른 문자로 바뀌 도록합니다 . 그런 다음 +/해당 목록의 합계를 계산합니다.


2

배치 파일, 121 바이트

내가 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%

경고 : _입력 문자열에서 발생하지 않는 것으로 가정 합니다. 그렇다면 변수e 를 적절히 조정해야합니다.

입력 문자열에 추가 하고 연결된 문자열을로 설정 하기 전에 카운터 변수, c문자열 끝 경계를로 설정합니다 . 그런 다음 loop 입력 하고 임시 문자 변수 를 첫 번째 문자로 설정 하고 두 번째 입력 문자열 과 일치하는지 확인 하고 true 인 경우 증가 시킨 다음에서 첫 번째 문자를 잘라냅니다 . 루프 끝 조건 은 문자열 끝 경계를 검사하고 그렇지 않으면 루프백합니다. 그런 다음 카운터의 가치를 계산합니다._%1t:lat%2cttecho

아마도 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 바이트

4 대 1! 그리고 그들은 모두 같은 길이입니다! :)

($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를 1 씩 줄여야합니다.

이건 좀 재미 있었어 ...


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 나는 손으로 바이트를 계산, 내가 틀렸다면 알려주세요.

설명

우선,> <>는 2 차원이며 a ;또는 오류가 발생할 때까지 선 또는 열을 반복 합니다. 즉, 프로그램이 시작될 때와 같이 왼쪽에서 오른쪽으로 진행되는 경우 줄 끝에 도달하여 이동하지 않거나 프로그램을 중지하라는 메시지가 표시되면 줄을 감싸는 것입니다. 행당 일부 문자는 포인터의 방향에 따라 기능이 다르기 때문에 반복되며 네 번째 행은 포인터가 오른쪽에서 왼쪽으로 이동하기 때문에 반대 순서로 문자를 갖습니다.

프로그램 요약이 아래에 제공됩니다. 상기 봐 esolangs에> <>에 대해 나열된 지침은 각각의 캐릭터가 무엇을 볼 수 있습니다.

1 행 : 0&v

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

2 행 : =?\ilb

(1 행, 포인터를 3 번째 문자로 이동시키는 곳에서 시작)

\ -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검색하여 입력, 플러스 개행 문자. 루비 는 인수에서 어떤 문자가 문자열에 나오는 String#count횟수를 계산 합니다.

예를 들어, 입력 [ test\n, t\n]의 경우, t발생은 두 번 \n발생하고 한 번 발생하므로 빼야합니다.


제거 할 수 있습니다 $><<4 바이트를 하고 줄일 .
Vasu Adari

@VasuAdari하지만 어떻게 든 결과를 인쇄해야합니다 ...
Cristian Lupascu

당신은 이것을 할 수 없습니까? ->p gets.count(gets)-1
Vasu Adari

@VasuAdari 당신이 맞아요; 잠시 동안 출력 주위에 qutoes를 넣을 것이라고 생각했지만 숫자이므로 괜찮습니다. 감사!
Cristian Lupascu

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'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.