닌자 원숭이와 곰, 오 마이! NinjaBear와 0 개의 다른 생물입니다. BM선행하지 않는 인스턴스

이 도전은 닌자 베어 몽키 (NinjaBearMonkey) 가 내 블록 빌딩 봇 무리 (Block Building Bot Flocks) 를 수상한 상입니다 ! 흑기사 제출에 도전하십시오 . 축하합니다 NinjaBearMonkey!

여기서의 과제는 매우 간단하지만 다양한 방법이 있습니다. 이야기는 Isometric Illusions 세계 에는 6 가지 유형의 생물이 있다는 것입니다.

  1. 닌자, 약자 N
  2. 약식 곰 B
  3. 원숭이, 약자 M
  4. 닌자 곰, 약어 NB
  5. BearMonkeys, 약자 BM
  6. 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, BM, 및 인쇄 또는 생물의 6 종류의 각각의 많은 사람들이 거기에 존재하는 방법을 반환합니다.

출력 양식이 있어야합니다

#N #B #M #NB #BM #NBM

각각의 생물 수는 각 #표지판을 대체합니다 . 6 개가 모두 0 인 경우에도 공백으로 구분하여 표시해야합니다. 그러나 순서는 상관 없습니다 (예 : #NBM먼저 올 수 있음).

또한:

  • 입력 문자열은 문자 만 포함 N, BM.
  • 빈 문자열이 입력되면 모든 카운트는 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, BMNB, 시퀀스가 gsub!존재 방법이 많은 시퀀스 카운트 블록과 원래의 문자열의 출력 D ‘(예, 함수의 인수를 변경).

    • 그렇지 않은 경우가 있기 때문에, 그들은 아무것도 대체 할 수없는 BNBMM등의 계산 될 수 NBMBM대신 B, NBMM합니다 (이 때 때문에 NBM제거 할 것, 그것은을 둘 것 BM함께 그것을 구별 할 수있는 방법이 없을 것이다). 원래 단일 문자열 ( .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
>