Ganador: ¡La respuesta CJam de Aditsu ! ¡La friolera de 25 bytes! ¡Agradable!
Puede continuar enviando su respuesta, sin embargo, ya no puede ganar. Publicación original mantenida para la posteridad:
El juego "Bzzt" es un juego en el que debes contar hasta un número (en este caso 500). Sin embargo, si el número tiene un 3 o es divisible por 3, no dice el número. En cambio, dices "Bzzt".
Reglas:
- No puedes codificar los números.
- El número solo debe cumplir al menos 1 de los siguientes requisitos
- Divisible por 3
- El número contiene un 3
- Algún tipo de separador es obligatorio (12bzzt14 no cuenta)
- La puntuación se mide en bytes.
- Debe contar exactamente hasta 500, comenzando en 1 o 0 (usted eligió).
- Los números deben enviarse, pero no importa cómo (por ejemplo, stdout, escribir en un archivo de texto, etc.).
- 0 puede ser divisible por 3 o no divisible. Tu puedes elegir.
- Puede generar los números de uno en uno (por ejemplo, salida 1, luego 2, luego bzzt, luego 4, etc.) o todos a la vez (por ejemplo, salida 1 2 bzzt 4 5).
- Debe reemplazar la letra 3 con la palabra "bzzt". Esto no distingue entre mayúsculas y minúsculas (bZzt, Bzzt, bzzt están bien).
- Este es un desafío de código de golf , por lo que gana el código más corto.
- Este concurso finaliza el 30 de junio de 2014 (7 días desde su publicación).
buzz
obzzt
si se aplican ambos requisitos? ¿Tengo que dar salida12bzzt4
obzzt
para1234
?bzzt
por1234
. Es un juego de beber 'común' aquí (solo que a menudo lo hacemos con 7)Respuestas:
CJam - 25
Gracias Howard :)
Pruébalo en http://cjam.aditsu.net/
Explicación:
501{…}fI
básicamentefor(int I=0; I<501; ++I) {…}
3s
convierte 3 en cadena, es decir, "3"I3%
esI
% 3<
obtiene la subcadena izquierda"3".substring(0, I % 3)
- que es "" paraI
% 3 == 0 y "3" de lo contrario, seIs
convierteI
en cadena-
con 2 cadenas hace una diferencia establecida, lo que resulta en un vacío string iffI
% 3 == 0 (la primera cadena estaba vacía) oI
tiene 3 dígitos,…I"bzzt"?
es como… ? I : "bzzt"
; la cadena anterior se trata como un valor booleano, donde "" es falso y cualquier otra cadena es verdaderaN
agrega una nueva líneafuente
501{3sI3%<Is-I"bzzt"?N}fI
.Rubí, 43
Muy claro.
Editar: guardado un byte, gracias Howard!
fuente
"#{a}"[?3]||a%3<1
."#{a}"[?3[0,a%3]]
.puts
conp
y ahorro de 3 caracteres?p
imprime el resultado de invocarinspect
su argumento (en comparación con put, que llamato_s
). Entonces, en lugar de imprimirBzzt
(que es:Bzzt.to_s
), imprimiría:Bzzt
, lo que no coincide con las especificaciones de salida.seq y GNU sed -
42333130Funciona directamente en el tablero, algunos otros shells pueden necesitar deshabilitar la expansión del historial, por ejemplo, con bash
set +H
:fuente
0~3!
se ejecuta{/3/!b}
y juntas estas expresiones dejan la línea como está si no es divisible por y no contiene un 3. El último bit "corrige" la línea a bzzt.Código de máquina x86 en DOS (archivo .com) - 71 bytes
Imprime la salida requerida en stdout con espacio como delimitador; se puede ejecutar sin problemas en DosBox.
Asamblea comentada:
fuente
Perl - 35
4042fuente
PHP, sin separador -
62, 61,59,58,52,4947No dice que debería haber un espacio / nueva línea / separador entre ellos, sin:
Con el separador,
68,67,65,64,58 / 55,53 / 5251/50echo
, me salvó un poco.~õ
crea una nueva líneaJavascript -
54,5150El mismo principio, pero las funciones de JavaScript:
fuente
console.log()
obviamente, pero esto es más corto.<?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;
Elõ
es char 245, un bit invertido\n
.!strpbrk($1,3)
contrim(3,$i)
para guardar 4 bytesJavascript
5049-1 byte gracias a core1024
fuente
&&
operador booleano . Por ejemplo:497 % 3 = 2
=>2 & true = 0
=>bzzt
for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')
- 49: PGolfScript,
3029 caracteresLa implementación no tan sencilla en GolfScript se puede probar aquí .
fuente
Perl, 36
Editar: no soy un monje Perl, por lo que core1024 parece haber logrado jugar otro byte en su respuesta .
fuente
say
para guardar 4 bytes:say$_%3&&!/3/?$_:bzzt for 1..5e2
C # (71)
Se puede ejecutar directamente en LinqPad.
fuente
|
) en lugar de logical-or.Pitón (52)
Gracias grc!
Versión antigua:
fuente
for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
['3'[:i%3]in`i`]
Haskell:
88828079fuente
==0
con<1
elem'3'$show n
, que es un char más corto. O no. No lo comprobé.elem
de la notación de prefijo no guarda ningún carácter porque tiene que haber un espacio antes del apóstrofe; de lo contrario lo conseguirásNot in scope: elem'3'
. Buen ojo con<1
, sin embargo!JavaScript
666360Gracias a edc65 por la sugerencia de usar array. La salida ahora estará separada por comas.
versiones antiguas
Versión 1a - 66
Imprima de 1 a 500 en un cuadro de alerta de acuerdo con la regla. La salida está separada por espacios.
Versión 1b - 65
Si consideramos que 0 no es divisible por 3, podemos acortar la solución a 65 caracteres:
Versión 2 - 63
Gracias a grc por la sugerencia de reducir la longitud.
fuente
for(a=i="";i<500;)a+=++i ...
PowerShell, 42
Principalmente el trabajo de Ventero, con un poco de ayuda en la sintaxis de mi parte ;-)
fuente
R, 49 caracteres
Explicado:
Uso:
fuente
Cobra - 70
Lote - 222
Porque realmente amo este idioma ... por alguna razón ...
fuente
if
porque sabe que hay al menos un dígito. También concatenar el bloque completo dentro defor
with&
podría funcionar para guardar los paréntesis.==
lugar deEQU
y probablemente soltar algunos espacios aquí y allá.TI-BASIC - 31
(32) (34) (35) (36) (43)Tenga en cuenta que la mayoría de los comandos en TI-BASIC se representan como entidades de un solo byte.
El código requiere que X se inicialice a 0 de antemano (de lo contrario, son 3 bytes adicionales).
He hecho varios intentos para reducir varios bytes, por lo que no detallo todo lo que he hecho aquí para no saturar la publicación. Se han dirigido principalmente a acortar el ciclo, lo que he hecho en esta versión mediante un ciclo While y acortar la condición If con la ayuda de la
Ans
variable.fuente
bzzt
números que contienen 3, por ejemplo, 13.bzzt
solo para los números que son divisibles por 3. Agregar la otra manera podría ser posible, pero necesitaría más instrucciones.C, 93
Sólo por el placer de hacerlo...
fuente
i = 0
Julia 64 bytes
fuente
[println(a%3==0||3 in digits(a)?"bzzt":a) for a=1:500]
es de 54 bytes. Además, devolver una matriz no imprime la matriz completa, por lo que no estoy seguro de si cuenta como "salida". Si devolver una matriz cuenta, entonces[a%3==0||3 in digits(a)?"bzzt":a for a=1:500]
podría contar y anotar 45.cmd.exe - 91
... porque ¿por qué usar un archivo por lotes cuando existe una línea directa perfectamente sencilla ... :-)
fuente
maravilloso - 51
editar: usar
times
la versión de impresión ahora es tan corto como "mostrar". gracias @ will-pfuente
(1..500).each
por500.times
C, 80
Usar espacios como separadores en lugar de saltos de línea.
fuente
1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt
... Hay algo mal aquí.Mathematica, 54 Personajes
Esto se siente demasiado sencillo. Soluciones más cortas deben ser posibles.
fuente
T-SQL 2008 - 80
No va a ganar ni nada, pero divertido, no obstante: gracias gracias a @domager:
Un hecho poco conocido, @ es un nombre válido para una variable. Se siente extraño ya que el código basado en el conjunto es la variante más SQL, ¡pero más corto es más corto! Esta versión funciona en cualquier base de datos. Editar: pude eliminar dos de las semifinales ya que no eran necesarias. Estoy bastante seguro de que esto es lo más óptimo posible.
Edit2: nunca digas nunca. Aquí ahora es aún más asqueroso usar goto, pero nos permite evitar el bloqueo. Podemos Reemplazar mientras, comenzar, terminar con el más corto si, t:, salta 6 caracteres. También reorganizamos la declaración reescribiendo el ciclo como un pseudo do-while, semánticamente equivalente. Edit3: Sí, de alguna manera si ahora es más corto. Original:
Debe ejecutarse en la base de datos maestra. Me encanta T-SQL a pesar de sus formas ruidosas y feas. Puede haber una manera de simplificar esto, pero desafortunadamente, la función
iif
integrada requiere que ambas partes acuerden los tipos. Las reglas de precedencia de los servidores SQL dan una precedencia int más alta que las cadenas. El número también es realmente largo, pero el alias tiene más caracteres de lo que vale. Puede haber una mejor manera de convertir el número en una cadena. Editar: str también funciona. 2 caracteres menos que ltrimfuente
declare @i int=1;while(@i<501)begin;if(@i)like'%3%'or @i%3=0 print'bzzt'else print @i;set @i=@i+1 end
@
. Luego, usar iif () es aún más corto que if (...) print else print, por lo que ganamos bastante usando laiif
expresión. También podemos usar el más corto@+=1
para guardar un personaje+=
. No lo tengo a mano para probar, pero estoy bastante seguro de que es compatible''+@
con la conversión de cadenas utilizando la configuración regional invariable.+=
se agregó en 2008. Es compatible con '' + @, pero no hace lo que desea. Como dije, las reglas de precedencia se convierten a int primero, por lo que se convierte''
a int, lo que resulta en cero, por''+@
lo que@
todavía se escribe comoint
.str
funciona y no es mucho más caro que cualquier otra cosa (2 caracteres adicionales para los padres). Elegí t-sql 2012 aquí debido alIIF
operador, quien sabe que quizás la versión sql de 2016 eliminará parte del ruido y comenzará a ser competitivo (poco probable).VBA: 54
Abra su programa de Office favorito, presione alt + F11 para abrir el IDE de VBA y pegue el código en el panel inmediato y presione Entrar.
En VBA,: ¿el separador de línea es? es una forma abreviada de impresión, iif significa en línea si (piensa x? "Y": "N"), x / 3 hace la división de coma flotante y x \ 3 hace la división entera, instr devuelve la posición de un carácter en una cadena, o 0 de lo contrario, verdadero = -1 y falso = 0.
Básicamente, el código incrementa xy genera x si x / 3 = x \ 3 = instr (1, x, 3) es verdadero y "Bzzt" de lo contrario. x / 3 = x \ 3 compara (flotante) (x / 3) con (int) (x / 3) y devuelve un valor booleano (0 es falso y -1 es verdadero). instr (1, x, 3) devuelve 0 si "3" no está en el número, y un entero positivo de lo contrario. El único momento en que la expresión devuelve verdadero es cuando (x / 3 = x \ 3) es falso (0) e instr (1, x, 3) es 0, o en otras palabras, cuando x no es divisible por 3 y no contiene el dígito "3", que es exactamente lo que estamos buscando.
fuente
k4
(37)(35)k4
carece de un comando de módulo incorporado, y usarq
uno tomaría un carácter adicional; esta versión (ab) usa el formato de salida incorporado para verificar si la cadena del resultado de dividirx
entre 3 tiene un punto decimal.EDITAR:
Por inteligente que pueda ser la coincidencia del punto decimal, puedo afeitar dos bytes comprobando que
3*floor x%3
todavía estáx
.fuente
h1
yh2
es lo suficientemente importante como para garantizar una edición en primer lugar).Golpetazo,
53 52 4846Requiere GNU sed (usa la
c
extensión).fuente
Java,
142131 gracias a la sugerencia de WozzeCfuente
class A{public static void main(String[]a){for(int i=0;++i<501;System.out.println(i%3>0&(""+i).indexOf(51)<0?i:"bzzt"));}}
R
(40)(36)Esto es básicamente una respuesta plannapus un poco acortada, pero aún no puedo comentar
Actualización: -4 caracteres (ver comentario de plannapus)
Salida:
fuente
strsplit
) arrojan un error cuando se alimentan sin caracteres, supusegrepl
que también lo hicieron. ¡Buena atrapada! +1b
antes de eso:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
Fortran -
118 114111Un candidato irremediablemente improbable, aunque originalmente desarrollado para adaptarse a las tarjetas perforadas. Usando todas las construcciones oscuras del pasado, aún se puede escribir algún código corto:
El "goto calculado" se
goto(L1,L2,...,Ln) x
ramifica a una de las etiquetas L si y solo si 1 <= x <= n.Editar: logró reducir 4 bytes reorganizando el bucle que verifica el dígito 3. Como beneficio adicional, el código ahora también contiene la declaración aritmética if
if(x) a,b,c
, que siempre se ramifica a una de tres etiquetas: a if x <0, b si x == 0 o c si x> 0.Desafortunadamente, las dos primeras versiones no produjeron el resultado correcto. El bucle digit-3 ahora funciona correctamente, y el código ahora también incluye una sentencia if lógica moderna. Tres bytes más se han ido, porque ¿quién necesita una
enddo
declaración? La salida se puede verificar aquí .fuente