Vencedor: Resposta CJam do Aditsu ! Uns 25 bytes impressionantes! Agradável!
Você pode continuar enviando sua resposta, mas não poderá mais vencer. Post original mantido para a posteridade:
O jogo "Bzzt" é um jogo em que você deve contar até um número (neste caso, 500). No entanto, se o número tiver um 3 ou for divisível por 3, você não diz o número. Em vez disso, você diz "Bzzt".
Regras:
- Você não pode codificar os números.
- O número deve atender apenas a pelo menos um dos seguintes requisitos
- Divisível por 3
- Número contém um 3
- Algum tipo de separador é obrigatório (12bzzt14 não conta)
- A pontuação é medida em bytes.
- Você deve contar exatamente até 500, começando em 1 ou 0 (você escolheu).
- Os números devem ser impressos, mas não importa como (por exemplo, stdout, gravação em um arquivo de texto, etc.).
- 0 pode ser divisível por 3 ou não divisível. Você pode escolher.
- Você pode imprimir os números um de cada vez (ex: saída 1, depois 2, depois bzzt, depois 4, etc.) ou todos de uma vez (por exemplo, saída 1 2 bzzt 4 5).
- Você deve substituir a letra 3 pela palavra "bzzt". Isso não diferencia maiúsculas de minúsculas (bZzt, Bzzt, bzzt estão todos bem).
- Este é um desafio do código-golfe , portanto o código mais curto vence.
- Este concurso termina em 30 de junho de 2014 (7 dias após a publicação).
buzz
oubzzt
se ambos os requisitos se aplicam? Eu tenho que produzir12bzzt4
oubzzt
para1234
?bzzt
para1234
. É um 'comum' jogo de beber aqui (somente que muitas vezes fazê-lo com 7)Respostas:
CJam - 25
Obrigado Howard :)
Experimente em http://cjam.aditsu.net/
Explicação:
501{…}fI
é basicamentefor(int I=0; I<501; ++I) {…}
3s
converte 3 em sequência, ou seja, "3"I3%
éI
% 3<
obtém a substring esquerda -"3".substring(0, I % 3)
- que é "" paraI
% 3 == 0 e "3", caso contrário,Is
converteI
em sequência-
com 2 strings, faz uma diferença definida, resultando em um vazio cadeia sseI
% 3 == 0 (a primeira cadeia foi vazio) ouI
tem um dígito 3 em que…I"bzzt"?
é como… ? I : "bzzt"
; a cadeia anterior é tratada como um valor booleano, em que "" é falso e qualquer outra cadeia é verdadeiraN
adiciona uma nova linhafonte
501{3sI3%<Is-I"bzzt"?N}fI
.Ruby, 43
Bem direto.
Edit: Salvo um byte, obrigado Howard!
fonte
"#{a}"[?3]||a%3<1
."#{a}"[?3[0,a%3]]
.puts
comp
e salvar 3 caracteres?p
imprime o resultado de chamarinspect
seu argumento (em comparação com puts, que chamato_s
). Portanto, em vez de imprimirBzzt
(o que é:Bzzt.to_s
), seria impresso:Bzzt
, o que não corresponde às especificações de saída.seq e GNU sed -
42333130Funciona diretamente no painel, alguns outros shells podem precisar ter a expansão do histórico desativada, por exemplo, com o bash
set +H
:fonte
0~3!
corre{/3/!b}
e, juntas, essas expressões deixam a linha como se não fosse divisível por e não contenha um 3. O último bit "corrige" a linha para bzzt.código de máquina x86 no DOS (arquivo .com) - 71 bytes
Imprime a saída necessária para stdout com espaço como delimitador; pode ser executado sem problemas no DosBox.
Montagem comentada:
fonte
Perl - 35
40.42.fonte
PHP, sem separador -
62, 61,59,58,52,4947Não diz que deve haver um espaço / nova linha / separador entre eles, sem:
Com o separador,
68,67,65,64,58 / 55,53 / 5251/50echo
, me salvou um pouco.~õ
cria uma nova linhaJavascript -
54,5150Mesmo princípio, mas funções javascript:
fonte
console.log()
obviamente, mas isso é mais curto.<?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;
Oõ
é char 245, um pouco invertido\n
.!strpbrk($1,3)
comtrim(3,$i)
para salvar 4 bytesJavascript
5049-1 byte graças a core1024
fonte
&&
operador booleano . Por exemplo:497 % 3 = 2
=>2 & true = 0
=>bzzt
for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')
- 49: PGolfScript,
3029 caracteresA implementação não tão direta no GolfScript pode ser testada aqui .
fonte
Perl, 36
Edit: Eu não sou um monge Perl, então core1024 parece ter conseguido tirar outro byte disso em sua resposta .
fonte
say
para salvar 4 bytes:say$_%3&&!/3/?$_:bzzt for 1..5e2
C # (71)
Pode ser executado diretamente no LinqPad.
fonte
|
) em vez de lógico ou.Python (52)
Graças grc!
Versão antiga:
fonte
for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
['3'[:i%3]in`i`]
Haskell:
88828079fonte
==0
com<1
elem'3'$show n
, que é um caractere mais curto. Ou não. Eu não verifiquei.elem
notação de prefixo não salva nenhum caractere, pois deve haver um espaço antes do apóstrofo; caso contrário, você receberáNot in scope: elem'3'
. Bom olho com<1
, no entanto!JavaScript
666360Obrigado a edc65 pela sugestão de usar array. A saída agora será separada por vírgula.
Versões antigas
Versão 1a - 66
Imprima de 1 a 500 em uma caixa de alerta de acordo com a regra. A saída é separada por espaço.
Versão 1b - 65
Se considerarmos que 0 não é divisível por 3, podemos reduzir a solução para 65 caracteres:
Versão 2 - 63
Obrigado ao grc pela sugestão de reduzir o comprimento.
fonte
for(a=i="";i<500;)a+=++i ...
PowerShell, 42
Principalmente o trabalho de Ventero, com uma pequena ajuda em sintaxe minha ;-)
fonte
R, 49 caracteres
Explicado:
Uso:
fonte
Cobra - 70
Lote - 222
Porque eu realmente amo esse idioma ... por algum motivo ...
fonte
if
porque sabe que há pelo menos um dígito. Concatenar também o bloco completo dentro defor
com&
pode funcionar para salvar os parênteses.==
vez deEQU
e provavelmente soltar alguns espaços aqui e ali.TI-BASIC - 31
(32) (34) (35) (36) (43)Observe que a maioria dos comandos no TI-BASIC são representados como entidades de byte único.
O código requer que o X seja inicializado com 0 de antemão (caso contrário, são 3 bytes adicionais).
Fiz várias tentativas de barbear vários bytes, por isso não estou detalhando tudo o que fiz aqui, para não bagunçar a postagem. Eles foram principalmente direcionados para encurtar o loop, o que fiz nesta versão por um loop While e encurtando a condição If com a ajuda da
Ans
variável.fonte
bzzt
números contendo 3 de, por exemplo, 13.bzzt
apenas os números divisíveis por 3. Adicionar a outra maneira pode ser possível, mas seria necessário obter mais instruções.C, 93
Só pra caramba ...
fonte
i = 0
Julia 64 bytes
fonte
[println(a%3==0||3 in digits(a)?"bzzt":a) for a=1:500]
é 54 bytes. O retorno de uma matriz também não imprime a matriz inteira, portanto, não tenho certeza se isso conta como "saída". Se devolver uma contagem de matriz, em seguida,[a%3==0||3 in digits(a)?"bzzt":a for a=1:500]
pode contar e marcar 45.cmd.exe - 91
... porque por que usar um arquivo em lotes quando existe uma única linha perfeitamente direta ... :-)
fonte
groovy - 51
editar:
times
agora, a versão impressa é tão curta quanto a "exibição". obrigado @ will-pfonte
(1..500).each
por500.times
C, 80
Usando espaços como separadores em vez de quebras de linha.
fonte
1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt
... Há algo errado aqui.Mathematica, 54 caracteres
Isso parece muito simples. Soluções mais curtas devem ser possíveis.
fonte
T-SQL 2008-80
Não vai ganhar nem nada além de divertido: Tweaked graças a @domager:
Um fato pouco conhecido, @ é um nome válido para uma variável. Parece estranho, pois o código baseado em conjunto é a variante mais SQL, mas mais curto é mais curto! Esta versão funciona em qualquer banco de dados. Edit: Consegui remover duas das semifinais porque elas não eram necessárias. Tenho certeza de que isso é o melhor possível.
Edit2: Nunca diga nunca. Aqui está agora ainda mais grosseiro usando goto, mas nos permite evitar o bloqueio. Podemos substituir enquanto, começar, terminar com o menor se, t:, for salvar 6 caracteres. Também reorganizamos a declaração reescrevendo o loop como um pseudo do-while, semanticamente equivalente. Edit3: Sim, de alguma forma, se agora é mais curto. Original:
Deve ser executado no banco de dados mestre. Eu amo o T-SQL, apesar de suas maneiras barulhentas e feias. Pode haver uma maneira de simplificar isso, mas, infelizmente, o
iif
built-in exige que ambos os lados concordem com os tipos. As regras de precedência dos servidores sql fornecem int precedência mais alta que as strings. O número também é muito longo, mas o alias é mais caracteres do que vale a pena. Pode haver uma maneira melhor de transformar o número em uma string. Edit: str também funciona. 2 caracteres a menos que ltrimfonte
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
@
. O uso de iif () ainda é mais curto que um if (...) print else print, então ganhamos bastante usando aiif
expressão Também podemos usar o mais curto@+=1
para salvar um caracter #+=
. Não o tenho à mão para testar, mas tenho certeza de que ele suporta''+@
a conversão de cadeias usando o código de idioma invariável.+=
foi adicionado em 2008. Ele suporta '' + @, mas não faz o que você deseja. Como eu disse, as regras de precedência convertidas para int primeiro, para que sejam convertidas para''
int, resultando em zero e ainda assim''+@
são@
digitadas como umint
.str
funciona e não é muito mais caro do que qualquer outra coisa (2 caracteres extras para os parens). Eu escolhi o t-sql 2012 aqui por causa doIIF
operador, que sabe que o sql de lançamento de 2016 se livrará de alguns ruídos e começará a ser competitivo (improvável).VBA: 54
Abra seu programa favorito do Office, pressione alt + F11 para abrir o VBA IDE e cole o código no painel imediato e pressione enter.
No VBA,: é o separador de linhas? é abreviação para print, se significa inline se (pense x? "Y": "N"), x / 3 faz divisão de ponto flutuante ex \ 3 faz divisão inteira, instr retorna a posição de um caractere em uma string ou 0 caso contrário, verdadeiro = -1 e falso = 0.
O código basicamente incrementa x e gera x se x / 3 = x \ 3 = instr (1, x, 3) for verdadeiro e "Bzzt", caso contrário. x / 3 = x \ 3 compara (flutua) (x / 3) a (int) (x / 3) e retorna um booleano (0 é falso e -1 é verdadeiro). instr (1, x, 3) retorna 0 se "3" não estiver no número e um número inteiro positivo caso contrário. O único momento em que a expressão retorna true é quando (x / 3 = x \ 3) é false (0) e instr (1, x, 3) é 0 ou, em outras palavras, quando x não é divisível por 3 e não é contém o dígito "3", que é exatamente o que estamos procurando.
fonte
k4
(37)(35)k4
não possui um comando de módulo embutido e o uso desseq
requer um caractere extra; esta versão (ab) usa o formato de saída interno para verificar se a sequência do resultado da divisãox
por 3 possui um ponto decimal.EDITAR:
Por mais inteligente que possa ser o ponto decimal, posso raspar dois bytes verificando
3*floor x%3
se ainda estáx
.fonte
h1
eh2
é bastante importante para justificar uma edição em primeiro lugar.)Bater,
53 52 4846.Requer GNU sed (usa a
c
extensão).fonte
Java,
142131 obrigado a sugestão WozzeCfonte
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)Isso é basicamente a resposta do plannapus um pouco mais curta, mas ainda não posso comentar
Atualização: -4 caracteres (veja o comentário de plannapus)
Resultado:
fonte
strsplit
) geram erro quando alimentadas com não-caracteres, presumi quegrepl
sim. Boa pegada! +1b
antes disso:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
Fortran -
118 114111Um candidato irremediavelmente improvável, embora originalmente desenvolvido para caber em cartões perfurados. Usando todas as construções obscuras do passado, ainda é possível escrever algum código curto:
O "goto computado"
goto(L1,L2,...,Ln) x
ramifica para um dos rótulos L se e somente se 1 <= x <= n.Edit: Conseguiu cortar 4 bytes reorganizando o loop que verifica o dígito 3. Como bônus, o código agora também contém a instrução if aritmética
if(x) a,b,c
, que sempre se ramifica em um dos três rótulos: a if x <0, b se x == 0 ou c se x> 0.Infelizmente, as duas primeiras versões não produziram a saída correta. O loop de dígito 3 agora funciona corretamente, e o código agora também inclui uma instrução if lógica moderna. Mais três bytes se foram, porque quem precisa de uma
enddo
declaração? A saída pode ser verificada aqui .fonte