¡Este desafío es el premio de NinjaBearMonkey por ganar mis bloques de bloques de construcción! desafío con la presentación del Caballero Negro . ¡Felicidades NinjaBearMonkey!
El desafío aquí es bastante simple, pero tiene una variedad de enfoques posibles. La historia cuenta que en el mundo de las ilusiones isométricas , hay 6 tipos diferentes de criaturas:
- Ninjas, abreviado
N
- Osos, abreviados
B
- Monos, abreviados
M
- NinjaBears, abreviado
NB
- BearMonkeys, abreviado
BM
- NinjaBearMonkeys, abreviado
NBM
( NinjaBearMonkey es, por supuesto, el último tipo más poderoso).
Su tarea es hacer un censo de estas criaturas cuando están alineadas una al lado de la otra, es decir, cuando sus cadenas de abreviatura están concatenadas. La advertencia es que debes asegurarte de no contar en exceso las partes de algunas criaturas como criaturas separadas que parecen similares. Las criaturas se alinearán de manera que:
- Cualquier instancia de
NBM
es 1 NinjaBearMonkey y 0 otras criaturas. - Cualquier instancia de
NB
no seguidoM
es 1 NinjaBear y 0 otras criaturas. - Cualquier instancia de
BM
no precedidaN
es 1 BearMonkey y 0 otras criaturas. - De lo contrario, las instancias de
N
,B
yM
son Ninjas, Osos y Monos solteros respectivamente.
La línea se lee de izquierda a derecha.
Entonces, por ejemplo, en la línea de criaturas NBMMBNBNBM
, hay 0 Ninjas, 1 Oso, 1 Mono, 1 NinjaBear, 0 BearMonkeys y 2 NinjaBearMonkeys.
Reto
Escriba un programa o función que tome una cadena de caracteres N
,, B
y M
, e imprima o devuelva cuántos de cada uno de los 6 tipos de criaturas están presentes en él.
La salida debe tener la forma
#N #B #M #NB #BM #NBM
con el respectivo conteo de criaturas reemplazando cada #
signo. Se deben mostrar los 6 recuentos, separados por espacios, incluso cuando son 0. Sin embargo, pueden estar en cualquier orden (p. Ej., #NBM
Podrían aparecer primero).
También:
- La cadena de entrada sólo contendrá los caracteres
N
,B
yM
. - Si se ingresa la cadena vacía, todos los recuentos son 0.
- La salida puede contener opcionalmente un único espacio inicial y / o final, y / o una nueva línea final.
La presentación más corta en bytes gana.
Ejemplos
Entrada: NB
Salida:0N 0B 0M 1NB 0BM 0NBM
Entrada: NBM
Salida:0N 0B 0M 0NB 0BM 1NBM
Entrada: NBMMBNBNBM
(ejemplo de arriba)
Salida:0N 1B 1M 1NB 0BM 2NBM
Entrada: MBNNBBMNBM
Salida:1N 1B 1M 1NB 1BM 1NBM
Entrada: NNNMNBMMBMMBMMMNBMNNMNNNBNNNBNBBNBNMMNBBNBMMBBMBMBBBNNMBMBMMNNNNNMMBMMBM
Salida:17N 6B 14M 5NB 8BM 3NBM
NBMNBM
sería una entrada perfectamente válida. Leyendo de izquierda a derecha, claramente hay 2 NinjaBearMonkeys.Respuestas:
Pyth, 22 bytes
Manera bastante hacker de ahorrar 1 byte, gracias a @Jakube.
Pyth, 23 bytes
Demostración.
Imprime en orden inverso, con un espacio final y sin nueva línea final.
.:"NBM")
es todas las subcadenas, las_
coloca en el orden correcto,/zN
cuenta las ocurrencias y=:zNd
sustituye en el lugar cada ocurrencia de la cadena en cuestión con un espacio.fuente
JavaScript ES6, 86 bytes
(Solo tenía que responder esto.) Pasa por cada subcadena de
NBM
, comenzando por las más largas, que tienen mayor prioridad. Busca cada aparición de esa cadena en particular y la elimina (en este caso, reemplazándola con el recuento actual para que no vuelva a coincidir). Finalmente reemplaza cada subcadena con el recuento + la cadena.Este fragmento de pila está escrito en el equivalente ES5 del código anterior para facilitar la prueba desde cualquier navegador. También es un código ligeramente sin golf. La interfaz de usuario se actualiza con cada pulsación de tecla.
fuente
'NBM<newline>BM<newline>...<newline>N'.replace(/./g, ...)'
, donde las<newline>
s son líneas nuevas literales y las'
s son backticks, formando una cadena de plantilla ES6? Guarda dos bytes en la expresión regular (.
no coincide con las nuevas líneas).Pitón 2, 78
Una variante de la respuesta de Vioz . ¡Diversión con representaciones de cuerdas de Python 2!
Cuenta las ocurrencias de la subcadena indirectamente dividiéndola, contando las partes y restando 1. En lugar de reemplazar las subcadenas por un símbolo de relleno, reemplaza la cadena por la lista que
split
produjo. Luego, cuando tomamos su representación de cadena, las partes están separadas por espacios y comas.fuente
Ruby,
166807268 caracteresExplicación:
El recuento se realiza a la inversa. Esto se debe a que los ninjas, osos y monos más largos tienen prioridad sobre los más cortos.
Para
NBM
,BM
yNB
, las secuencias estángsub!
fuera de la cadena original con un bloque para contar cuántas de estas secuencias existen (sí, la función modifica su argumento).BNBMM
lo contrario se contarían comoNBM
y enBM
lugar deB
,NBM
yM
(porque cuandoNBM
se eliminen, se juntaránB
yM
no habrá forma de distinguirlo). Originalmente devolví una cadena de caracteres única (.gsub!('NBM'){c+=1;?|}
), pero me di cuenta de que podía devolver el resultado de+=
(que es un número, por lo que no puede ser ningunoN
B
M
).ParaAhora es un bucle (no sé por qué no pensé en eso en primer lugar), por lo que se hacen de la misma manera.M
,B
yN
, puedo sabercount
cuántos de ellos hay en la cadena (no es necesario eliminarlos a través degsub!
).Solución similar en Avestruz ,
5451 caracteres :Desafortunadamente, no es una solución válida, ya que hay un error en la versión actual de Avestruz (que ahora está solucionado, pero después de que se publicó este desafío).
fuente
%w(NBM BM NB M B N)
y eliminando la división.Java,
166162Y con algunos saltos de línea:
Funciona bastante simple. Simplemente recorra los tokens, reemplazándolos con puntos y contando siempre que la entrada contenga algunos. Cuenta los grandes primero, para que los pequeños no lo estropeen.
Originalmente intenté reemplazar todo de una vez y contar la diferencia en la longitud, pero de esa manera se necesitaron algunos caracteres más :(
fuente
println
declaración sola es más grande que eso. Sin embargo, estoy satisfecho con eso: DString q[]=
aString[]q=
CJam,
363231 bytesGracias a @Optimizer por jugar golf en 1 byte.
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
N*
->`
debería ser suficiente.R,
153134118Esto se alargó muy rápido, pero espero poder afeitarme algunos. La entrada es STDIN y la salida a STDOUT.
Editar cambio de táctica. Se deshizo de la cadena dividida y contando las partes. Ahora reemplazo las partes con una cuerda más corta que la parte. La diferencia entre las longitudes de cadena se recopila para la salida.
Explicación
Prueba de funcionamiento
fuente
Pyth, 19 bytes
Esta es una mezcla de la solución Pyth de @ isaacg y el increíble truco de Python de @ xnor.
Pruébelo en línea: demostración o prueba de arnés
Explicación
fuente
Julia,
10697 bytesEsto crea una función sin nombre que toma una cadena como entrada e imprime el resultado en STDOUT con un solo espacio final y sin nueva línea final. Para llamarlo, asígnele un nombre, p. Ej.
f=b->...
.Ungolfed + explicación:
Ejemplos:
fuente
Pitón 2,
93888984 BytesTomando el enfoque directo.
Llame así:
La salida es así:
fuente
in
.SAS,
144 142 139129Uso (7 bytes agregados para sysparm):
o
Uso:
Resultado:
fuente
cats('s/',z,'/x/')
en 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 ya estás leyendosysparm
, también puedes ejecutarlo como un paso de datos. Y si está ejecutando en lote, no necesitarun;
.%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
No es el más corto, pero ¿qué más esperarías de PHP?
Para usarlo, configure una clave en una COOKIE, POST, GET, SESSION ...
El apporach es básico:
Fácil, verdad?
fuente
JavaScript,
108116 bytesSolo un enfoque directo, nada lujoso
fuente
All 6 counts must be shown, separated by spaces, even when they are 0.
. Caso de prueba:N
Perl, 46
fuente
SpecBAS - 164
Utiliza el mismo enfoque que muchos otros. La línea 4 sigue girando sobre la cadena (desde la más grande primero), la reemplaza si se encuentra.
SpecBAS tiene algunos toques agradables sobre ZX / Sinclair BASIC original (recorrer listas, encontrar personajes) que todavía estoy descubriendo.
fuente
C,
205186184 bytesUn enfoque un poco diferente basado en la máquina de estados. donde
t
esta el estadoExpandido
Función de prueba
fuente
for(;;*s++){...}
lugar dedo{...}while(*s++);
guardar algunos bytes? Además, no necesita el carácter de nueva línea en elprintf
.for(;*s;s++)
. Pero necesitaba un bucle con ese último personaje nulo. Buena llamada para guardar el\n
, que no es obligatorio.C, 146
fuente
Haskell - 177 bytes (sin importaciones)
(Perdón por la nigromancia de Internet aquí).
La plataforma Haskell no tiene búsqueda de cadenas sin importaciones, y quería mostrar y explotar el hecho de que las cadenas buscadas son todas las subcadenas de una (sin repeticiones), por lo que la agrupación de caracteres se puede hacer mediante la identificación de pares que están permitidos seguirse, que es lo que
f
hace aquí.Todavía necesito la lista completa
l
al final para verificar la igualdad y mostrar exactamente como se requiere, pero no lo haría, si el desafío hubiera sido informar el número de ocurrencias posibleswords
en cualquier orden.fuente
Golpe - 101
Pase la cadena como primer argumento.
Explicado un poco:
fuente
rs , 275 bytes
Demostración en vivo y pruebas.
El funcionamiento es simple pero un poco extraño:
Esto utiliza creativamente grupos para activar entradas como:
dentro
La proxima linea:
Esto reemplaza las secuencias de letras mayúsculas con guiones bajos.
Esto simplemente inserta un signo de libra al comienzo de la línea.
Esta es la parte inicial genial. Básicamente toma las secuencias de letras minúsculas y guiones bajos, las convierte en letras mayúsculas, las agrupa y las coloca antes de la libra que se insertó. El propósito de la libra es administrar las secuencias que ya han sido procesadas.
La libra se vuelve a insertar al comienzo de la línea.
Las letras mayúsculas se reemplazan por sus equivalentes de texto con los recuentos asociados. Debido a un error en rs (no quería arriesgarme a arreglarlo y descalificarme), las secuencias vacías se convierten en
(^^)
, que se reemplaza por un 0 en la penúltima línea. La última línea simplemente elimina la libra.fuente
KDB (Q), 76 bytes
Explicación
Prueba
fuente
Haskell: 244 bytes
fuente
p
ys
solo una vez, por lo que no es necesario darle un nombre (->a#[]=[]:a#"NBM"
, lo mismo parap
). Por cierto: enwords"N B M NB BM NBM"
lugar de la lista de cadenas guarda bytes adicionales. Elimport
es sólo paraintercalate
, que es más corto te ejecutarla de nuevo:...putStrLn.tail.((' ':)=<<)$map...
y deshacerse de losimport
. Ponga a todos los guardias|
en la definición de#
en una sola línea y use en1<2
lugar deTrue
:...#(b:m)|a==b=...l#m|1<2=[]...
...?
se puede definir más corto con una lista por comprensión:c?t=sum[1|x<-c,x==t]
. Una vez más, se está utilizando?
sólo una vez, a fin de utilizar el cuerpo directamente:...show(sum[1|x<-l#[],x==t])
.