도전
문자열 x
이 10 자이고 문자가 주어지면 string 에서 y
문자 y
가 발생 하는 횟수를 출력 하는 프로그램을 작성하십시오 x
.
바이트 단위의 가장 짧은 프로그램이 승리합니다.
예
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
문자열 x
이 10 자이고 문자가 주어지면 string 에서 y
문자 y
가 발생 하는 횟수를 출력 하는 프로그램을 작성하십시오 x
.
바이트 단위의 가장 짧은 프로그램이 승리합니다.
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
답변:
/ww
예제 실행 :
$ pyth -c '/ww'
sdhkfhjkkj
k
3
물론 사용자는 첫 번째 입력에 10 자 이상을 입력 할 수 있지만 사용자가 사양을 위반할 때 어떤 일이 발생할지 걱정할 필요가 없습니다.
/
두 번째 입력 문자열의 첫 번째 입력 문자열에서 발생 횟수를 계산합니다. w
입력 라인을받습니다.
(.)(?=.*\1$)
입력의 마지막 문자와 동일한 문자와 일치하는 정규 표현식입니다 (자체 제외). 단일 정규 표현식이 주어지면 Retina는 단순히 일치 횟수를 반환합니다.
),}{)-
@ , +);__
!-`{:}
단일 문자를 먼저 읽은 다음 계산할 문자열을 읽고 문자열에 널 바이트가 없다고 가정합니다.
코드는로 시작 ),}
하여 스택의 맨 아래를로 설정하고 1
첫 번째 문자를 읽고 나중에 사용할 수 있도록 보조 스택으로 옮깁니다. 1
될 것입니다 카운터 (1 오프셋 나중에 취소되고 IP가 필요한 회전을 할 필요가됩니다).
이제 IP가 아래로 이동하여 검색 문자열의 첫 문자를로 읽습니다 ,
. `
올바른 회전 동작을 얻으려면 값을 다시 무시 합니다. STDIN에서 문자를 읽는 동안 IP는 이제이 루프를 따릅니다.
}{)-
, +);__
`{:}
{:}
저장된 문자 코드를 복사 +
하여 현재 값에 추가합니다. 결과 인 경우 0
(즉, 현재의 문자는 우리가 찾고있는 하나입니다), 똑바로 IP 이동 : -
간단히 없애는는 0
, )
증가 카운터, {}
no-op입니다.
그러나 이후의 결과 +
가 0이 아닌 경우 현재 문자를 계산하지 않습니다. 따라서 IP는 대신 우회전을합니다. 그것은 막 다른 길이므로 코드가 두 번, 한 번 앞으로 그리고 한 번 뒤로 실행됩니다. 즉,이 경우 실제 코드는 );___;)+-){}
입니다. );
0이 아닌 차이를 제거하고 ___
3을 0으로 밀고 ;
그 중 하나를 버립니다. )
나머지 두 개의 제로 단위로 하나 +
하나의 추가로 1
, -
카운터로부터이를 감산 )
증분 카운터. 다시 말해, 우리는 매우 정교한 노-업을 만들었습니다.
우리는 EOF, 명중하면 ,
푸시 -1
, `
변신 1
과 IP가 우회전을 걸립니다. 카운터에서 -
빼기 1
(초기 오프셋 취소) !
카운터를 인쇄하고 @
프로그램을 종료합니다.
print(input().count(input()))
Meh, 이것은 쉬웠다. 입력이 10 자 문자열이라고 가정합니다.
f=lambda x,y:x.count(y)
없다면 더 짧지 않습니까? (이것이 작동하지 않으면 죄송합니다, 나는 모바일에 있고 확인할 수 없습니다)
print input().count(input())
나 a,b=input();print a.count(b)
같은 양을 절약 할 수 있습니다
~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
낄낄 거림.
골프를 치기위한 전 바트 덕분에!
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)
(제 생각에).
bool
이 int
전환 에 대해 무엇을 말했는지 잘 모르기 때문에 동작이 정의되어 있는지 확인하고 싶습니다 .
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으로 확인되었습니다.
(a,b)=>a.split(b).length-1
이 빠른 솔루션은 익명 함수를 정의합니다. 사용하려면 변수 선언을 처음에 추가하십시오. 사용해보십시오 :
편집 : 아, 나는 이미 매우 비슷한 해결책이 있다는 것을 알았습니다. 나는 그것이 좋기를 바랍니다.
+/⍷
이것은 기능 기차를 만듭니다. 문자열에 문자가 나타나는 인덱스에 해당하는 0과 1로 구성된 벡터를 만들어 작동합니다 ( ⍷
). 그런 다음 벡터를 합산합니다 (+/
).
kirbyfan64sos 및 NBZ 덕분에 4 바이트가 절약되었습니다!
+/⍷
(APL을 모르므로 잘못되었을 수도 있습니다).
(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
<>
!
-l
입력 을 삭제 하고 후행 줄 바꿈이 없는지 확인 하여 바이트를 절약 할 수 있습니다 .echo -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
perl -pe '$_+=s/${\<>}//g'
+=
필요한가? =
똑같이 작동하는 것처럼 보입니다 (입력이 일부 숫자로 시작될 때 여전히 작동해야 함).
<?=substr_count($argv[1],$argv[2]);
사용법 :
두 개의 인수를 사용 하여 스크립트를 호출하십시오.
php script.php qwertzqwertz q
전역 변수를 등록하면 (PHP 5.3 이하에서만 가능) 12 바이트를 절약 할 수 있습니다 ( Martijn 덕분에 )
<?=substr_count($a,$b);
사용법 :
스크립트를 호출하고 전역 변수를 선언하십시오.php script.php?a=qwertzqwertz&b=q
script.php?a=qwertzqwertz&b=q
, 및 수행 <?=substr_count($a,$b);
, 23 개 문자
+/=
즉 "같은 바이트의 합"입니다. 예 :
f ← +/=
'onomatopoe' f 'o'
4
아니면 그냥
'onomatopoe'(+/=)'o'
4
이번에는 K가 APL을 이길 수 없습니다.
SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
입력 문자열과 문자가 제거 된 문자열의 차이점을 간단히 나타냅니다. 테이블 t에서 입력을받습니다.
공백 계산 문제를 제거하고 SQL에 허용되는 현재 입력을 고려하기 위해 편집이 변경되었습니다. 모든 변경 및 절약에 대한 @BradC 감사합니다
A B C D
하므로 공백으로 끝나는 문자열과 같은 문자열에 대해 잘못된 대답을 제공합니다 (공백을 계산하도록 요청받은 경우) LEN
.
space
약간의 시간이있을 때 문제를 해결 하는 방법을 살펴 보겠습니다.
SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
내가 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 인 경우 증가 시킨 다음에서 첫 번째 문자를 잘라냅니다 . 루프 끝 조건 은 문자열 끝 경계를 검사하고 그렇지 않으면 루프백합니다. 그런 다음 카운터의 가치를 계산합니다._
%1
t
:l
a
t
%2
c
t
t
echo
아마도 FOR
대신 루프 를 사용하는 것이 가능 하지만 DelayedExpansion을 활성화해야 합니다. 실제로는 이것보다 바이트 단위가 더 길 것으로 생각합니다. 그에 대한 검증은 독자에게 연습으로 남습니다.
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 씩 줄여야합니다.
이건 좀 재미 있었어 ...
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
p gets.count(gets)-1
는 -1
사실로 인해입니다 gets
검색하여 입력, 플러스 개행 문자. 루비 는 인수에서 어떤 문자가 문자열에 나오는 String#count
횟수를 계산 합니다.
예를 들어, 입력 [ test\n
, t\n
]의 경우, t
발생은 두 번 \n
발생하고 한 번 발생하므로 빼야합니다.
$><<
4 바이트를 하고 줄일 .
p gets.count(gets)-1