Digamos que tienes una cadena como esta:
abaabbbbbaabba
Cuente el número de veces que aparece un carácter específico en la cadena de entrada, pero solo si el carácter aparece solo una vez en una fila . Por ejemplo, si el personaje es a
,
abaabbbbbaabba
^ x x ^
El total sería 2 (el aa
's no contaría porque a
aparece dos veces seguidas).
¿Cómo se relaciona esto con FizzBuzz?
Si el personaje aparece 3 (o un múltiplo de 3) veces seguidas, o 5 (o un múltiplo de 5) veces seguidas, el contador se decrementa en su lugar. Si es un múltiplo de 3 y 5 veces, el contador aún se incrementa. Recuerde que el contador también se incrementa si el personaje aparece solo una vez en una fila, y se ignora si el personaje aparece cualquier otra cantidad de veces en una fila (además de las situaciones descritas anteriormente).
Para recapitular, si la cadena a unir es a
,
input counter (explanation)
a 1 (single occurence)
aaa -1(multiple of 3)
aaaaa -1(multiple of 5)
aaaaaaaaaaaaaaa 1 (multiple of 15)
aa 0 (none of the above)
aba 2 (two single instances)
aaba 1 (one single occurence(+1) and one double occurence(ignored))
aaaba 0 (one single occurence(+1) and one triple (-1)
aaaaaa -1 (six is a multiple of three)
Implementación de referencia (sin golf) en java:
import java.util.Scanner;
import java.util.regex.*;
public class StrMatcher {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //Scanner to get user input
int total = 0;//Running total of matches
System.out.println("Enter a string: ");
String strBeingSearched = sc.nextLine(); //String that will be searched
System.out.println("Enter string to match with: ");
String strBeingMatched = sc.nextLine(); //Substring used for searching
//Simple regex matcher
Pattern pattern = Pattern.compile("(" + strBeingMatched + ")+");
Matcher matcher = pattern.matcher(strBeingSearched);
while(matcher.find()){ //While there are still matches
int length = matcher.end() - matcher.start();
int numberOfTimes = length/strBeingMatched.length();//Calculate how many times in a row the string is matched
if((numberOfTimes == 1)||((numberOfTimes % 3 == 0) && (numberOfTimes % 5 == 0))){
total++; //Increment counter if single match or divisible by 15
} else if((numberOfTimes % 3 == 0)||(numberOfTimes % 5 == 0)) {
total--; //Decrement counter if divisible by 3 or 5 (but not 15)
}
strBeingSearched = strBeingSearched.substring(matcher.end());
matcher = pattern.matcher(strBeingSearched); //Replace string/matcher and repeat
}
System.out.println(total);
}
}
- La cadena que se buscará puede tener cualquier longitud, pero el patrón solo será un carácter.
- Ninguna cadena tendrá caracteres especiales regex.
- Este es el código de golf ; el programa más corto en bytes gana.
- No hay lagunas estándar.
Respuestas:
Funciton , 1840 bytes
Maldición, este lenguaje es ingobernable.
Este programa espera que el primer carácter de la entrada sea el carácter para buscar, y el resto de la entrada para hacer que la cadena busque. Esto significa que
aaaba
buscaráa
en la entradaaaba
(y, por lo tanto, en la salida 1). Usted puede separarlos con un salto de línea o espacio (a aaba
), pero sólo porque el salto de línea / espacio extra no hace ninguna diferencia a la salida.Como siempre, puede obtener una representación más bonita (sin el espacio entre líneas) si ejecuta
$('pre').css('line-height',1)
en la consola de su navegador.(1840 bytes cuando se codifica como UTF-16.)
Explicación
¹
devuelve el primer caracter de una cadena.²
cuenta el número de apariciones de un carácter al comienzo de una cadena dada. Por ejemplo, dado el caráctera
y la cadenaaaba
, devuelve 2. Fora
ybaa
, devuelve 0.³
llama²
para obtener el número de caracteres al inicio, examina si el número es divisible por 3 y 5 y si es igual a 1 y determina el incremento / decremento adecuado. También elimina un carácter adicional desde el inicio de la cadena (por ejemplo, dadoaaabba
que elimina 3 + 1 = 4 caracteres, dandoba
). Luego se llama recursivamente con la cadena más corta y agrega el resultado.¹
para eliminar el primer carácter de la entrada y llama³
con ese carácter y el resto de la cadena como argumentos separados.fuente
CJam,
4036353230 bytes¡Gracias a @ MartinBüttner por jugar golf en 1 byte!
¡Gracias a @AndreaBiondo por jugar 2 bytes y allanar el camino para 3 más!
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
llcf=e`::*0-{(_!\6563282Zb:(=}%1b
es 33 bytes.C,
160126125119114109104100 bytesProbablemente se puede mejorar ... Esto toma información de los argumentos de la línea de comando (el primer argumento es el patrón, el segundo es la cadena). No admite la búsqueda de patrones de caracteres NULL (\ x00).
EDITAR **
126125119114109104100 bytes **: Después de incorporar las sugerencias de Dennis y algunas ideas adicionales (eliminada la cláusula else, combinó el while en una sola declaración y usó la resta en lugar de! =). También se eliminó el punto y coma extra en el bucle for (que en realidad era parte de la sugerencia de Dennis). Se acortó aún más al eliminar las variables 'i' y 'a'.Se eliminaron los operadores if y negación ('!') Al abusar del operador ternario. Comprimió las comprobaciones de modularidad usando
ese 'AND' bit a bitun doble && porque bitwise '&' tiene un error, y colocando la comparación (t <2) dentro de los operadores ternarios. Reemplazado !! t * (...) moviendo !! t al operador ternario, lo que me permite eliminar paréntesis.Hombre, realmente quiero ponerlo debajo de la marca de 100 bytes: S
Soluciones provisionales: No estoy seguro de si estas se considerarían válidas, pero puedo bajar a 93 caracteres si uso exit (s) en lugar de printf ("% d", s). Pero entonces la salida no sería visible, sino que sería un código de retorno. Si la salida es realmente necesaria, también puedo reducirla a 98 bytes, pero también requeriría imprimir todos los valores intermedios de s antes de la respuesta final ...
fuente
i,t,s,a;main(c,z)char**z;{a=*z[1];while(c){if((c=z[2][i])!=a)s+=(!!t)*((t<2)-!(t%3)-!(t%5)+3*!(t%15)),t=0;else++t;++i;}printf("%d",s);}
debería funcionar igual de bien (y es 23 bytes más corto).main
confor(a=*z[1];c;i++)
, no necesitas{}
el if ... else.Ruby,
11110396 bytesEste desafío fue hecho para Ruby
Enumerable#chunk
, así que tuve que publicar esto. :)Prueba en línea: http://ideone.com/pG4mAn
El código es bastante sencillo. Aquí hay una versión más legible: http://ideone.com/ub3siA .
fuente
Python 3,
361, 300, 296, 263, 256, 237, 229, 188, 178, 164 bytes.Guardado 15 bytes gracias a vaultah de SOPython.
Guardado 9 bytes gracias a Joe Kington de SOPython.
Guardado 11 bytes gracias a DSM de SOPython.
Esta es la primera vez que envío una respuesta, así que estoy seguro de que esto podría ser mucho más corto. Toma la cadena de prueba como la primera respuesta a la entrada y el carácter de búsqueda como la segunda.
Versión sin golf:
Descubrí que estaba fallando en uno de los casos de prueba.
fuente
Haskell, 120 bytes
f
hace el trabajo.fuente
Java,
146152143138139136 bytes%3&%5
comprobaciones.i<2
Comparación acortada .%3&%5
comprobación no funciona como se pensaba).Implementado como
BiFunction<String, String, Integer>
en Java 8, avíseme si es necesario que sea un programa completo (o si incluso puedo eliminar eljava.util.regex
prefijo del paquete a continuación).El recuento de bytes anterior no incluye la nueva línea a continuación, que simplemente se agrega para fines de formateo en este sitio.
Explicación aproximada:
b
, es decir"[^"+b+"]"
."a" -> 1
).-1
,0
y1
.sum()
para obtener respuestafuente
Javascript, 206 bytes
Expandido:
Explicación:
Estoy usando expresiones regulares para contar el total de veces que aparece un personaje, luego restar de eso todas las veces que apareció en grupos. Finalmente, reviso los grupos y hago el incremento / decremento del zumbido efervescente.
Pasa los casos de prueba dados en la pregunta:
y así
fuente
new
, use enexec
lugar dematch
y aliaslength
, y debería ser bueno.Perl,
82656359 bytes58 bytes + 1 byte parámetro de línea de comando
No es particularmente corto, pero es un comienzo, continuará acortándolo.
Asumir que
-i
se puede usar para dar a la cadena de entrada un ejemplo de uso es el siguiente:fuente
Pyth, 32 bytes
¡tan cerca! 2 bytes más para vincular la excelente entrada de Dennis en CJam
Pruébelo en línea
fuente
gawk, 140
Ingrese como "cadena de espacio de caracteres", así
Sin golf
fuente
Pyth, 27 bytes
Banco de pruebas
Ingrese en el formulario, por ejemplo:
Explicación:
fuente