Esse desafio é o prêmio de NinjaBearMonkey por ganhar meus blocos de construção de blocos de blocos! desafio com a finalização do Cavaleiro Negro . Parabéns NinjaBearMonkey!
O desafio aqui é bastante simples, mas tem uma variedade de abordagens possíveis. A história diz que, no mundo das Ilusões Isométricas , existem 6 tipos diferentes de criaturas:
- Ninjas, abreviado
N
- Ursos, abreviados
B
- Macacos, abreviados
M
- NinjaBears, abreviado
NB
- BearMonkeys, abreviado
BM
- NinjaBearMonkeys, abreviado
NBM
( NinjaBearMonkey é, obviamente, o último e mais poderoso tipo.)
Sua tarefa é fazer um censo dessas criaturas quando elas estão alinhadas lado a lado, ou seja, quando suas cadeias de abreviação são concatenadas. A ressalva é que você precisa se certificar de não contar demais as partes de algumas criaturas como criaturas separadas que parecem semelhantes. As criaturas se alinharão de tal forma que:
- Qualquer instância de
NBM
é 1 NinjaBearMonkey e 0 outras criaturas. - Qualquer instância de
NB
não seguido porM
1 NinjaBear e 0 outras criaturas. - Qualquer instância
BM
não precedida porN
é 1 BearMonkey e 0 outras criaturas. - Caso contrário, as instâncias de
N
,B
eM
são Ninjas, Ursos e Macacos únicos, respectivamente.
A linha é lida da esquerda para a direita.
Assim, por exemplo, na linha de criaturas NBMMBNBNBM
, existem 0 Ninjas, 1 Urso, 1 Macaco, 1 NinjaBear, 0 BearMonkeys e 2 NinjaBearMonkeys.
Desafio
Escreva um programa ou função que recebe de uma série de personagens N
, B
, e M
e impressões ou retornos quantos de cada um dos 6 tipos de criaturas estão presentes nele.
A saída deve ter o formato
#N #B #M #NB #BM #NBM
com a respectiva contagem de criaturas substituindo cada #
sinal. Todas as 6 contagens devem ser exibidas, separadas por espaços, mesmo quando são 0. No entanto, elas podem estar em qualquer ordem (por exemplo, #NBM
pode vir primeiro).
Além disso:
- A cadeia de entrada irá conter apenas os personagens
N
,B
eM
. - Se a sequência vazia for inserida, todas as contagens serão 0.
- A saída pode opcionalmente conter um único espaço à esquerda e / ou à direita e / ou uma nova linha à direita.
O menor envio em bytes vence.
Exemplos
Entrada: NB
Saída:0N 0B 0M 1NB 0BM 0NBM
Entrada: NBM
Saída:0N 0B 0M 0NB 0BM 1NBM
Entrada: NBMMBNBNBM
(exemplo acima)
Saída:0N 1B 1M 1NB 0BM 2NBM
Entrada: MBNNBBMNBM
Saída:1N 1B 1M 1NB 1BM 1NBM
Entrada: NNNMNBMMBMMBMMMNBMNNMNNNBNNNBNBBNBNMMNBBNBMMBBMBMBBBNNMBMBMMNNNNNMMBMMBM
Saída:17N 6B 14M 5NB 8BM 3NBM
NBMNBM
seria uma entrada perfeitamente válida. Lendo da esquerda para a direita, existem claramente 2 NinjaBearMonkeys.Respostas:
Pitão, 22 bytes
Maneira bastante hackish de economizar 1 byte, graças a @Jakube.
Pitão, 23 bytes
Demonstração.
Imprime na ordem inversa, com um espaço à direita e sem nova linha à direita.
.:"NBM")
é todas as substrings,_
coloca-as na ordem correta,/zN
conta as ocorrências e=:zNd
no local substitui cada ocorrência da sequência em questão por um espaço.fonte
JavaScript ES6, 86 bytes
(Eu apenas tive que responder a isso.) Ele passa por cada substring de
NBM
, começando pelos mais longos, que têm maior prioridade. Ele procura cada ocorrência dessa sequência específica e a remove (nesse caso, substituindo-a pela contagem atual para que não seja correspondida novamente). Finalmente, substitui cada substring pela contagem + a string.Esse snippet de pilha está escrito no equivalente do código acima ES5 para facilitar o teste em qualquer navegador. Também é um código ligeiramente não-destruído. A interface do usuário é atualizada a cada pressionamento de tecla.
fonte
'NBM<newline>BM<newline>...<newline>N'.replace(/./g, ...)'
, onde<newline>
s são novas linhas literais e'
s são backticks, formando uma sequência de modelos ES6? Salva dois bytes no regex (.
não corresponde a novas linhas).Python 2, 78
Uma variante da resposta de Vioz . Diversão com representações de string em Python 2!
Conta as ocorrências da substring indiretamente, dividindo-as, contando as partes e subtraindo 1. Em vez de substituir as substrings por um símbolo de preenchimento, substitui a string pela lista que foi
split
produzida. Então, quando tomamos sua representação de string, as partes são separadas por espaços e vírgulas.fonte
Ruby,
166807268 caracteresExplicação:
A contagem é feita ao contrário. Isso ocorre porque os ninjas, ursos e macacos mais longos têm precedência sobre os mais curtos.
Para
NBM
,,BM
eNB
, as seqüências estãogsub!
fora da string original com um bloco para contar quantas dessas sequências existem (sim, a função modifica seu argumento).BNBMM
seria contado comoNBM
eBM
em vez deB
,NBM
eM
(porque quando oNBM
seria removido, ele iria colocar oB
eM
juntos e não haveria uma maneira de distingui-lo). Originalmente, retornei uma única sequência de caracteres (.gsub!('NBM'){c+=1;?|}
), mas percebi que poderia retornar o resultado de+=
(que é um número, portanto não pode ser nenhumN
B
M
).ParaAgora é um loop (não sei por que não pensei nisso em primeiro lugar), então isso é feito da mesma maneira.M
,,B
eN
, possocount
saber quantos deles existem na cadeia de caracteres (não é necessário removê-los viagsub!
).Solução semelhante em Avestruz ,
5451 caracteres :Infelizmente, não é uma solução válida, pois há um erro na versão atual do Avestruz (que agora está corrigida, mas depois que esse desafio foi lançado).
fonte
%w(NBM BM NB M B N)
e removendo a divisão.Java,
166162E com algumas quebras de linha:
Funciona de maneira bem simples. Basta fazer um loop sobre os tokens, substituindo-os por pontos e contando enquanto a entrada contiver alguns. Conta os grandes primeiro, para que os pequenos não estraguem tudo.
Inicialmente, tentei substituir tudo de uma vez e contar a diferença de tamanho, mas foram necessários mais alguns caracteres dessa maneira :(
fonte
println
afirmação sozinha é maior que isso. Estou satisfeito com isso, no entanto: DString q[]=
paraString[]q=
CJam,
363231 bytesAgradecimentos ao @Optimizer por jogar fora 1 byte.
Experimente online no intérprete CJam .
Como funciona
fonte
N*
->`
deve ser suficiente.R,
153134118Isso ficou muito mais rápido, mas espero poder raspar alguns. A entrada é STDIN e a saída para STDOUT.
Editar Alteração de aderência. Livre-se da corda dividida e da contagem de peças. Agora substituo as peças por uma corda mais curta que a peça. A diferença entre os comprimentos de sequência é coletada para saída.
Explicação
Execução de teste
fonte
Pitão, 19 bytes
Esta é uma mistura da solução Pyth do @ isaacg e do incrível truque do Python do @ xnor.
Experimente on-line: demonstração ou equipamento de teste
Explicação
fonte
Julia,
10697 bytesIsso cria uma função sem nome que recebe uma string como entrada e imprime o resultado em STDOUT com um único espaço à direita e sem uma nova linha à direita. Para chamá-lo, dê um nome, por exemplo
f=b->...
.Ungolfed + explicação:
Exemplos:
fonte
Python 2,
93888984 BytesAdotando a abordagem direta.
Ligue assim:
A saída é assim:
fonte
in
.SAS,
142 142 139129Uso (7 bytes adicionados ao sysparm):
ou
Uso:
Resultado:
fonte
cats('s/',z,'/x/')
no lugar de's/'||strip(z)||'/x/'
.macro a i="&sysparm";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;%
data;i="&sysparm";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;
. Como você já está lendosysparm
, é melhor executá-lo como uma etapa de dados. E se você estiver executando em lote, não precisarárun;
.%macro a(i);i="&i";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;%mend;
PHP4.1, 92 bytes
Não é o mais curto, mas o que mais você esperaria do PHP?
Para usá-lo, defina uma chave em COOKIE, POST, GET, SESSION ...
O apporach é básico:
Fácil né?
fonte
JavaScript,
108116 bytesApenas uma abordagem direta, nada extravagante
fonte
All 6 counts must be shown, separated by spaces, even when they are 0.
. Caso de teste:N
Perl, 46
fonte
EspecificaçõesBAS - 164
Usa a mesma abordagem que muitas outras. A linha 4 continua fazendo loop sobre a string (da maior primeira), substituindo-a se encontrada.
O SpecBAS tem alguns toques legais sobre o ZX / Sinclair BASIC original (percorrendo listas, encontrando caracteres) que ainda estou descobrindo.
fonte
C,
205186184 bytesUma abordagem um pouco diferente baseada na máquina de estado. onde
t
fica o estadoExpandido
Função de teste
fonte
for(;;*s++){...}
vez dedo{...}while(*s++);
salvar alguns bytes? Além disso, você não precisa do caractere de nova linha noprintf
.for(;*s;s++)
. Mas eu precisava fazer um loop com esse último caractere nulo. Boa chamada para salvar o\n
que não é necessário.C, 146
fonte
Haskell - 177 bytes (sem importações)
(Desculpe pela necromancia da internet aqui.)
A Plataforma Haskell não possui pesquisa de strings sem importações, e eu queria mostrar e explorar o fato de que as strings pesquisadas são todas substrings de uma (sem repetições), para que o agrupamento de caracteres possa ser feito através da identificação de pares que têm permissão para seguem um ao outro, que é o que
f
faz aqui.No final, ainda preciso da lista completa
l
para verificar a igualdade e exibir exatamente como necessário, mas não teria, se o desafio fosse apenas relatar o número de ocorrências possíveiswords
em qualquer ordem.fonte
Bash - 101
Passe a string como o primeiro argumento.
Explicou um pouco:
fonte
rs , 275 bytes
Demonstração e testes ao vivo.
O funcionamento é simples, mas um pouco estranho:
Isso usa criativamente grupos para ativar entradas como:
para dentro
A próxima linha:
Isso substitui as seqüências de letras maiúsculas por sublinhados.
Isso simplesmente insere um sinal de libra no início da linha.
Esta é a parte legal do começo. Basicamente, pega as seqüências de letras minúsculas e sublinhados, converte-as em letras maiúsculas, agrupa-as e as coloca antes da libra que foi inserida. O objetivo da libra é gerenciar as seqüências que já foram processadas.
A libra é reinserida no início da linha.
As letras maiúsculas são substituídas por seus equivalentes de texto pelas contagens associadas. Por causa de um bug no rs (eu não queria arriscar corrigi-lo e ser desqualificado), as seqüências vazias são convertidas em
(^^)
, que são substituídas por um 0 na penúltima linha. A última linha simplesmente remove a libra.fonte
KDB (Q), 76 bytes
Explicação
Teste
fonte
Haskell: 244 bytes
fonte
p
es
apenas uma vez, portanto não há necessidade de dar um nome (->a#[]=[]:a#"NBM"
, o mesmo parap
). BTW: emwords"N B M NB BM NBM"
vez da lista de cadeias salva bytes adicionais. Oimport
é apenas paraintercalate
, é mais curto para reimplementá-lo:...putStrLn.tail.((' ':)=<<)$map...
e se livrar doimport
. Coloque todos os guardas|
na definição de#
em uma única linha e use em1<2
vez deTrue
:...#(b:m)|a==b=...l#m|1<2=[]...
...?
pode ser definido mais curto com uma compreensão da lista:c?t=sum[1|x<-c,x==t]
. Mais uma vez, você está usando?
apenas uma vez, por isso use o corpo diretamente:...show(sum[1|x<-l#[],x==t])
.