이 도전은 닌자 베어 몽키 (NinjaBearMonkey) 가 내 블록 빌딩 봇 무리 (Block Building Bot Flocks) 를 수상한 상입니다 ! 흑기사 제출에 도전하십시오 . 축하합니다 NinjaBearMonkey!
여기서의 과제는 매우 간단하지만 다양한 방법이 있습니다. 이야기는 Isometric Illusions 세계 에는 6 가지 유형의 생물이 있다는 것입니다.
- 닌자, 약자
N
- 약식 곰
B
- 원숭이, 약자
M
- 닌자 곰, 약어
NB
- BearMonkeys, 약자
BM
- NinjaBearMonkeys, 약어
NBM
( NinjaBearMonkey은 물론, 마지막으로, 가장 강력한 형태입니다.)
당신의 임무는 나란히 줄 지어있을 때, 즉 그들의 약자 줄이 연결되어있을 때이 생물체들에 대한 인구 조사 를하는 것입니다. 주의해야 할 점은 일부 생물의 일부를 유사하게 보이는 별도의 생물로 과대 계산하지 않도록해야한다는 것입니다. 그 생물들은 다음과 같이 줄을 서게됩니다 :
- 인스턴스
NBM
는 1 개의 NinjaBearMonkey와 0 개의 다른 생물입니다. NB
뒤에 오지 않는 인스턴스M
는 1 개의 NinjaBear와 0 개의 다른 생물입니다.BM
선행하지 않는 인스턴스N
는 1 BearMonkey 및 0 다른 생물입니다.- 그렇지 않으면, 인스턴스
N
,B
그리고M
하나의 닌자, 곰, 원숭이가 각각 있습니다.
행은 왼쪽에서 오른쪽으로 읽습니다.
예를 들어, 생물 라인 NBMMBNBNBM
에는 닌자 0 개, 곰 1 마리, 원숭이 1 마리, 닌자 베어 1 마리, 곰 몽키 0 마리, 닌자 비어 몽키 2 개가 있습니다.
도전
문자의 문자열에 걸리는 프로그램이나 기능 쓰기 N
, B
및 M
, 및 인쇄 또는 생물의 6 종류의 각각의 많은 사람들이 거기에 존재하는 방법을 반환합니다.
출력 양식이 있어야합니다
#N #B #M #NB #BM #NBM
각각의 생물 수는 각 #
표지판을 대체합니다 . 6 개가 모두 0 인 경우에도 공백으로 구분하여 표시해야합니다. 그러나 순서는 상관 없습니다 (예 : #NBM
먼저 올 수 있음).
또한:
- 입력 문자열은 문자 만 포함
N
,B
및M
. - 빈 문자열이 입력되면 모든 카운트는 0입니다.
- 출력은 선택적으로 단일 선행 및 / 또는 후행 공간 및 / 또는 단일 후행 줄 바꿈을 포함 할 수 있습니다.
바이트 단위의 최단 제출이 이깁니다.
예
입력 : NB
출력 :0N 0B 0M 1NB 0BM 0NBM
입력 : NBM
출력 :0N 0B 0M 0NB 0BM 1NBM
입력 : NBMMBNBNBM
(위의 예)
출력 :0N 1B 1M 1NB 0BM 2NBM
입력 : MBNNBBMNBM
출력 :1N 1B 1M 1NB 1BM 1NBM
입력 : NNNMNBMMBMMBMMMNBMNNMNNNBNNNBNBBNBNMMNBBNBMMBBMBMBBBNNMBMBMMNNNNNMMBMMBM
출력 :17N 6B 14M 5NB 8BM 3NBM
답변
Pyth, 22 바이트
f|pd+/zTT=:zTd_.:"NBM
@Jakube 덕분에 1 바이트를 절약하는 해킹 방법.
Pyth, 23 바이트
FN_.:"NBM")pd+/zNN=:zNd
후행 공백없이 후행 줄 바꿈없이 역순으로 인쇄합니다.
.:"NBM")
모든 하위 문자열이며, _
올바른 순서 로 배치 /zN
하고, 발생 횟수를 세고, =:zNd
해당 문자열의 각 발생을 공백으로 대체합니다.
FN_.:"NBM")pd+/zNN=:zNd
FN for N in :
_ reversed( )
.: ) substrings( )
"NBM" "NBM"
pd print, with a space at the end,
/zN z.count(N)
+ N + N
=:zNd replace N by ' ' in z.
답변
자바 스크립트 ES6, 86 바이트
f=s=>'NBM BM NB M B N'.replace(/\S+/g,e=>(i=0,s=s.replace(RegExp(e,'g'),_=>++i))&&i+e)
(방금 이것에 대답해야했습니다.) NBM
더 긴 문자열 부터 시작하여 더 높은 우선 순위를 갖는의 각 하위 문자열을 통과합니다 . 특정 문자열의 각 항목을 검색하여 제거합니다 (이 경우 문자열을 현재 개수로 바꾸어 다시 일치하지 않음). 마지막으로 각 하위 문자열을 count + 문자열로 바꿉니다.
이 스택 스 니펫은 모든 브라우저에서 쉽게 테스트 할 수 있도록 위의 코드와 동일한 ES5로 작성되었습니다. 약간 ungolfed 코드이기도합니다. 키를 누를 때마다 UI가 업데이트됩니다.
f=function(s){
return'NBM BM NB M B N'.replace(/\S+/g,function(e){
i=0
s=s.replace(RegExp(e,'g'),function(){
return++i
})
return i+e
})
}
run=function(){document.getElementById('output').innerHTML=f(document.getElementById('input').value)};document.getElementById('input').onkeyup=run;run()
<input type="text" id="input" value="NBMMBNBNBM" /><br /><samp id="output"></samp>
답변
파이썬 2, 78
n=input()
for x in"NBM BM NB M B N".split():n=`n`.split(x);print`len(n)-1`+x,
Vioz-의 답변 변형 . 파이썬 2 문자열 표현으로 재미있게!
부분 문자열을 분할하고 부분을 세고 1을 빼서 부분 문자열의 발생을 간접적으로 계산합니다. 부분 문자열을 필러 기호로 바꾸는 대신 문자열을 split
생성 된 목록으로 바꿉니다 . 그런 다음 문자열 표현을 할 때 부분은 공백과 쉼표로 구분됩니다.
답변
루비, 166 80 72 68 자
f=->s{%w(NBM BM NB M B N).map{|t|c=0;s.gsub!(t){c+=1};c.to_s+t}*' '}
설명:
-
계산은 반대로 수행됩니다. 긴 닌자와 곰, 원숭이가 짧은 닌자보다 우선하기 때문입니다.
-
들면
NBM
,BM
및NB
, 시퀀스가gsub!
존재 방법이 많은 시퀀스 카운트 블록과 원래의 문자열의 출력 D ‘(예, 함수의 인수를 변경).- 그렇지 않은 경우가 있기 때문에, 그들은 아무것도 대체 할 수없는
BNBMM
등의 계산 될 수NBM
및BM
대신B
,NBM
및M
합니다 (이 때 때문에NBM
제거 할 것, 그것은을 둘 것B
와M
함께 그것을 구별 할 수있는 방법이 없을 것이다). 원래 단일 문자열 (.gsub!('NBM'){c+=1;?|}
)을 반환했지만 결과를 반환 할 수 있음을 깨달았습니다+=
(숫자이므로 어떤 것도 될 수 없음N
B
M
).
- 그렇지 않은 경우가 있기 때문에, 그들은 아무것도 대체 할 수없는
-
를 들어이제 루프입니다 (왜 처음에 그것을 생각하지 않았는지 모르겠습니다). 이것들은 같은 방식으로 이루어집니다.M
,B
그리고N
, 난 그냥 수count
문자열에이 얼마나 그들 중 많은 (필요 통해 제거 없습니다gsub!
).
타조의 비슷한 솔루션 , 54 51 자 :
:s;`NBM BM NB M B N`" /{:t0:n;s\{;n):n}X:s;nt+}%" *
불행히도 현재 Ostrich 버전에 버그가 있기 때문에 올바른 해결책은 아닙니다 (현재 수정되었지만이 문제가 게시 된 후).
답변
자바 166 162
void f(String a){String[]q="NBM-NB-BM-N-B-M".split("-");for(int i=0,c;i<6;System.out.print(c+q[i++]+" "))for(c=0;a.contains(q[i]);c++)a=a.replaceFirst(q[i],".");}
그리고 몇 줄 바꿈 :
void f(String a){
String[]q="NBM-NB-BM-N-B-M".split("-");
for(int i=0,c;i<6;System.out.print(c+q[i++]+" "))
for(c=0;a.contains(q[i]);c++)
a=a.replaceFirst(q[i],".");
}
꽤 간단하게 작동합니다. 입력에 토큰이 포함되어있는 한, 토큰을 반복하여 점으로 대체하고 계산하십시오. 큰 것을 먼저 계산하여 작은 것을 엉망으로 만들지 않습니다.
원래 한 번에 모두 바꾸고 길이의 차이를 세려고 시도했지만 그런 식으로 몇 문자가 더 필요했습니다. (
답변
CJam, 36 32 31 바이트
l[ZYX]"NBM"few:+{A/_,(A+S@`}fA;
1 바이트로 골프를 치는 @Optimizer에게 감사드립니다.
CJam 통역사 에서 온라인으로 사용해보십시오 .
작동 원리
l e# Read a line L from STDIN.
[ZYX]"NBM" e# Push [3 2 1] and "NBM".
few e# Chop "NBM" into slices of length 3 to 1.
:+ e# Concatenate the resulting arrays of slices.
{ }fA e# For each slice A:
A/ e# Split L at occurrences of A.
_,( e# Push the numbers of resulting chunks minus 1.
A+ e# Append A.
S e# Push a space.
@` e# Push a string representation of the split L.
; e# Discard L.
답변
R, 153 (134) 118
이것은 정말로 더 길어졌지만 희망적으로 몇 가지를 면도 할 수 있기를 바랍니다. 입력은 STDIN이며 STDOUT으로 출력됩니다.
압정 변경을 편집합니다 . 분할 문자열과 계수 부품을 제거했습니다. 이제 부품보다 짧은 문자열로 부품을 교체합니다. 문자열 길이의 차이는 출력을 위해 수집됩니다.
N=nchar;i=scan(,'');for(s in scan(,'',t='NBM BM NB M B N'))cat(paste0(N(i)-N(i<-gsub(s,strtrim(' ',N(s)-1),i)),s),'')
설명
N=nchar;
i=scan(,''); # Get input from STDIN
for(s in scan(,'',t='NBM BM NB M B N')) # Loop through patterns
cat( # output
paste0( # Paste together
N(i) - # length of i minus
N(i<-gsub( # length of i with substitution of
s, # s
strtrim(' ',N(s)-1) # with a space string 1 shorter than s
,i) # in i
),
s) # split string
,'')
시운전
> N=nchar;i=scan(,'');for(s in scan(,'',t='NBM BM NB M B N'))cat(paste0(N(i)-N(i<-gsub(s,strtrim(' ',N(s)-1),i)),s),'')
1: NNNMNBMMBMMBMMMNBMNNMNNNBNNNBNBBNBNMMNBBNBMMBBMBMBBBNNMBMBMMNNNNNMMBMMBM
2:
Read 1 item
Read 6 items
3NBM 8BM 5NB 14M 6B 17N
> N=nchar;i=scan(,'');for(s in scan(,'',t='NBM BM NB M B N'))cat(paste0(N(i)-N(i<-gsub(s,strtrim(' ',N(s)-1),i)),s),'')
1: NBMMBNBNBM
2:
Read 1 item
Read 6 items
2NBM 0BM 1NB 1M 1B 0N
>