Gioca al gioco "bzzt"


56

Vincitore: la risposta CJam di Aditsu ! 25 byte enormi! Bello!

Puoi continuare a inviare la tua risposta, tuttavia non puoi più vincere. Posta originale conservata per i posteri:


Il gioco "Bzzt" è un gioco in cui devi contare per un numero (in questo caso 500). Tuttavia, se il numero contiene un 3 o è divisibile per 3, non devi pronunciare il numero. Invece, dici "Bzzt".

Regole:

  • Non è possibile codificare i numeri.
  • Il numero deve soddisfare solo 1 dei seguenti requisiti
    • Divisibile per 3
    • Il numero contiene un 3
  • Un certo tipo di separatore è obbligatorio (12bzzt14 non conta)
  • Il punteggio viene misurato in byte.
  • Devi contare esattamente fino a 500, a partire da 1 o 0 (hai scelto).
  • I numeri devono essere emessi, ma non importa come (es. Stdout, scrivere su un file di testo, ecc.).
  • 0 può essere divisibile per 3 o non divisibile. Puoi scegliere.
  • È possibile emettere i numeri uno alla volta (es. Uscita 1, quindi 2, quindi bzzt, quindi 4, ecc.) O tutti contemporaneamente (ad es. Uscita 1 2 bzzt 4 5).
  • È necessario sostituire la lettera 3 con la parola "bzzt". Questo non fa distinzione tra maiuscole e minuscole (bZzt, Bzzt, bzzt vanno bene).

  • Questa è una sfida di , quindi vince il codice più corto.
  • Questo concorso termina il 30 giugno 2014 (7 giorni dalla pubblicazione).

1
Ai fini di questa domanda, è 0 divisibile per 3?
Οuroso

2
È "buzz" o "bzzt"? Finora hai scritto "buzz" due volte.
aditsu,

3
Si prega di precisare. Devo produrre buzzo bzztse si applicano entrambi i requisiti? Devo produrre 12bzzt4o bzztper 1234?
nyuszika7h,

4
Direi bzztper 1234. È un gioco di bevute 'comune' qui (solo noi lo facciamo spesso con 7)
Martijn,

66
"0 può essere divisibile per 3 o non divisibile. Puoi scegliere." Non credo davvero che tu possa scegliere. 0 mod 3 è 0, non è proprio una questione di opinione.
David Conrad,

Risposte:


33

CJam - 25

501{3sI3%<Is-I"bzzt"?N}fI

Grazie Howard :)

Provalo su http://cjam.aditsu.net/

Spiegazione:

501{…}fIfondamentalmente for(int I=0; I<501; ++I) {…}
3sconverte 3 in stringa, ovvero "3"
I3%è I% 3
<ottiene la sottostringa sinistra - "3".substring(0, I % 3)- che è "" per I% 3 == 0 e "3" altrimenti
Isconverte Iin stringa
-con 2 stringhe fa una differenza impostata, risultando in un vuoto stringa iff I% 3 == 0 (la prima stringa era vuota) o Iha una cifra di 3
…I"bzzt"?è simile … ? I : "bzzt"; la stringa precedente viene considerata come un valore booleano, dove "" è falso e qualsiasi altra stringa è vera
Naggiunge una nuova riga


È possibile utilizzare lo stesso trucco come nella mia soluzione golfscript e salvare la logica e: 501{3sI3%<Is-I"bzzt"?N}fI.
Howard,

29

Ruby, 43

501.times{|a|puts"#{a}"[?3]||a%3<1?:Bzzt:a}

Abbastanza diretto.

Modifica: salvato un byte, grazie Howard!


1
È possibile salvare un singolo spazio bianco se si scrive "#{a}"[?3]||a%3<1.
Howard,

@Howard: davvero grazie mille!
Ventero,

1
Ancor più illeggibile ma purtroppo stessa lunghezza: "#{a}"[?3[0,a%3]].
Howard,

Che dire di sostituzione putscon pe salvare 3 caratteri?
David Unric,

1
@DavidUnric pstampa il risultato della chiamata inspectsul suo argomento (rispetto a put, che chiama to_s). Quindi invece di stampare Bzzt(che è :Bzzt.to_s), stampa :Bzzt, che non corrisponde alle specifiche di output.
Ventero,

25

seq e GNU sed - 42 33 31 30

Funziona direttamente in dash, potrebbe essere necessario disabilitare l'espansione della cronologia per alcune altre shell, ad esempio con bash set +H:

seq 500|sed 0~3!{/3/!b}\;cbzzt

Come funziona?
nbubis,

L'espansione della cronologia è disabilitata per impostazione predefinita negli script di shell.
nyuszika7h,

@ nyuszika7h: vero, ma mi aspetto che molti proveranno la risposta in una shell interattiva.
Thor,

1
@nbubi: la versione aggiornata funziona generando la sequenza con seq. 0~3!corre {/3/!b}e insieme queste espressioni lasciano la linea così com'è se non è divisibile per e non contiene un 3. L'ultimo bit "corregge" la linea in bzzt.
Thor,

18

codice macchina x86 su DOS (file .com) - 71 byte

00000000  31 c9 68 20 24 89 e5 89  c8 bb 03 00 31 d2 f7 f3  |1.h $.......1...|
00000010  85 d2 74 1a 89 c8 b3 0a  31 d2 f7 f3 80 fa 03 74  |..t.....1......t|
00000020  0d 80 c2 30 86 d6 52 44  85 c0 75 ea eb 08 89 ec  |...0..RD..u.....|
00000030  68 7a 74 68 62 7a 89 e2  b4 09 cd 21 89 ec 41 81  |hzthbz.....!..A.|
00000040  f9 f4 01 7e c2 59 c3                              |...~.Y.|

Stampa l'output richiesto su stdout con spazio come delimitatore; può essere eseguito senza problemi in DosBox.

Assemblaggio commentato:

    org 100h

start:
    ; 0 - 500 counter
    xor cx,cx
    ; we'll use the stack as scratch space to build the strings to print
    ; first of all, push ' $' on the stack (in reverse order); this will be
    ; the end of each string we'll print
    push 2420h
    ; save the stack pointer, to get back to this position after each print
    mov bp,sp
mainloop:
    ; first try to divide by three
    mov ax,cx
    mov bx,3
    xor dx,dx
    div bx
    test dx,dx
    ; no remainder => bzzt
    jz bzzt
    ; otherwise, go into the decimal-print loop
    mov ax,cx
divloop:
    ; bh is already at zero due to the mov bx,3 above
    mov bl,10
    xor dx,dx
    ; divide by 10
    div bx
    ; remainder is 3 => bzzt
    cmp dl,3
    je bzzt
    ; convert number to digit
    add dl,'0'
    ; trick: we move the digit to the upper byte of dx: this allows us to
    ; push the whole dx (you cannot do push dl) but to easily kill the
    ; undesidered byte by touching the stack pointer (it will be overwritten
    ; by the next stack operation/ignored by the print)
    xchg dl,dh
    push dx
    inc sp
    ; check is there anything left to print, rinse & repeat
    test ax,ax
    jnz divloop
    ; skip straight to print
    jmp print
bzzt:
    ; since we may be here from inside divloop, reset the stack pointer to
    ; where we left ' $'
    mov sp,bp
    ; push 'bzzt'
    push 747ah
    push 7a62h
print:
    ; print what is on the stack
    mov dx,sp
    mov ah,9h
    int 21h
    ; move us back to ' $'
    mov sp,bp

    ; increment cx and repeat while we are <=500
    inc cx
    cmp cx,500
    jle mainloop
end:
    ; fix back the stack pointer to the original value (=kill the first push)
    pop cx
    ; quit
    ret

5
RISPETTO!!!!! Sorprendente!
yossico,

@yossico: grazie! :) in realtà, non è niente di veramente speciale, sono sicuro che le persone che hanno effettivamente scritto assembly per DOS potrebbero sicuramente eliminare qualche byte in più.
Matteo Italia,

17

Perl - 35 40 42

print$_*!/3/%3?$_:bzzt,$/for 1..500

17

PHP, nessun separatore - 62, 61,59,58,52,49 47

Non dice che ci dovrebbe essere uno spazio / newline / separatore tra di loro, senza:

while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt;

Con il separatore, 68,67,65,64,58 / 55,53 / 52 51/50

while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt,' '; // 51
while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ; // 50
  • Ho appena trovato un piccolo "trucco", non ho bisogno di spazio dopo echo, mi ha salvato un po '.
  • Il crea una nuova riga
  • Un altro piccolo 'cheat', il bzzt non ha bisogno di virgolette (testato). Non è la strada da percorrere, ma funziona.

Javascript - 54,51 50

Stesso principio, ma funzioni javascript:

for(i=0;i++<500;)alert(i%3<1|/3/.test(i)?'bzzt':i)

Grazie @ core per le parentesi e per () suggerimento. Il for mi ha fatto bloccare il browser alcune volte ^^
Martijn il

Haha. L'ho provato console.log()ovviamente, ma questo è più breve.
Martijn,

1
La tua soluzione Javascript conta fino a 501.
nderscore,

1
PHP per 52: <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;Il õè char 245, un bit invertito \n.
primo

1
È possibile sostituire !strpbrk($1,3)con trim(3,$i)per salvare 4 byte
data

16

Javascript 50 49

-1 byte grazie a core1024

for(i=0;i++<500;)alert(i%3*!/3/.test(i)?i:'bzzt')

Sapevo che si poteva fare! Ma non ho trovato come
edc65,

1
Puoi immaginare la mia faccia quando una soluzione JavaScript batte la mia LiveScript.
nyuszika7h,

nella tua seconda soluzione potresti rimuoverne uno e firmare e funzionerà ancora
user902383

@ user902383 Non è un risultato valido senza un &&operatore booleano . Ad esempio: 497 % 3 = 2=> 2 & true = 0=>bzzt
nderscore

for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')- 49: P
core1024

11

GolfScript, 30 29 caratteri

501,{:^`3`^3%<?)'bzzt'^if n}/

L'implementazione non così semplice in GolfScript può essere testata qui .


10

Perl, 36

print$_%3&&!/3/?$_:Bzzt,$/for 1..500

Modifica: non sono un monaco Perl, quindi core1024 sembra essere riuscito a golfare un altro byte fuori da questo nella sua risposta .


1
Utilizzare sayper salvare 4 byte:say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid,

@Zaid perché 5e2 e non 500?
Non che Charles il

@Charles: sono equivalenti
Zaid

1
@Zaid quindi perché non essere più chiaro?
Non che Charles, il

4
@Charles: nel contesto di una sfida di code-golf, dovrebbe interessarsene?
Zaid,

10

C # (71)

Può essere eseguito direttamente in LinqPad.

for(var i=0;++i<501;)(i%3<1|(i+"").Contains("3")?"buzz":i+"").Dump();

1
È possibile salvare un carattere usando bitwise-o ( |) invece che logico-o.
Johnbot,

@Johnbot Grazie per il tuo suggerimento.
EvilFonti,

Puoi anche rimuovere le parentesi attorno al condizionale.
Johnbot,

@Johnbot: non è bit a bit o. È logico (non in cortocircuito), poiché gli operandi sono booleani.
Ryan M,

Dump è solo LinqPad, giusto? Fare questo in C # come applicazione richiederebbe l'aggiunta di un metodo di estensione. (Ed è 'bzzt' non 'buzz' =))
Paul,

9

Python (52)

Grazie grc!

for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]

Vecchia versione:

print['Bzzt'if'3'in`i`or i%3<1 else`i`for i in range(501)]

1
Un po 'più breve:for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
GRC

4
Un carattere più corto:['3'[:i%3]in`i`]
xnor

7

Haskell: 88 82 80 79

main=mapM_ f[1..500]
f n|n`mod`3<1||'3'`elem`show n=putStrLn"bzzt"
f n=print n

Se scrivessi una risposta, abbandonerei IO e restituirei un valore stringa.
orgoglioso haskeller il

1
Dovresti anche cambiare ==0con<1
orgoglioso haskeller il

Inoltre, prova a creare il prefisso elem. Penso che dovresti essere in grado di scrivere elem'3'$show n, che è un carattere più breve. O no. Non ho controllato.
orgoglioso haskeller il

@proudhaskeller: La specifica afferma che i "numeri devono essere emessi", quindi IO deve essere coinvolto. E l'uso elemdella notazione con prefisso non salva alcun carattere perché deve esserci uno spazio prima dell'apostrofo; altrimenti otterrai Not in scope: elem'3'. Buon occhio <1, però!
Taylor Fausak,

6

JavaScript 66 63 60

for(a=i=[];i<500;)a[i++]=i%3&&!/3/.test(i)?i:'bzzt';alert(a)

Grazie a edc65 per il suggerimento di usare l'array. L'output verrà ora separato da virgola.


Vecchie versioni

Versione 1a - 66

Stampa da 1 a 500 in una casella di avviso in base alla regola. L'output è separato dallo spazio.

a="";for(i=1;i<501;i++)a+=i%3&&!/3/.test(i)?i+" ":"bzzt ";alert(a)

Versione 1b - 65

Se consideriamo 0 non divisibile per 3, possiamo accorciare la soluzione a 65 caratteri:

a=0;for(i=1;i<501;i++)a+=i%3&&!/3/.test(i)?" "+i:" bzzt";alert(a)

Versione 2 - 63

for(a=i="";i<501;)a+=++i%3&&!/3/.test(i)?i+" ":"bzzt ";alert(a)

Grazie a grc per il suggerimento di ridurre la lunghezza.


1
Penso che potresti iniziare confor(a=i="";i<500;)a+=++i ...
GRC

I l'output separato da virgole è OK, un array sarà più corto: for (o = i = []; i <500;) o [i ++] = i% 3 &&! / 3 / .test (i)? I: 'bzzt' ; alert (o)
edc65,

6

PowerShell, 42

1..500|%{($_,'bzzt')[$_-match3-or!($_%3)]}

Principalmente il lavoro di Ventero, con un piccolo aiuto sulla sintassi da parte mia ;-)


6

R, 49 caratteri

a=1:500;b='bzzt';a[!a%%3]=b;a[grep(3,a)]=b;cat(a)

Ha spiegato:

a=1:500 #Creates a vector with all integers from 1 to 500
b='bzzt'
a[!a%%3]=b #Replace all multiples of 3 by 'bzzt', thus coercing all other integers to character strings
a[grep(3,a)]=b #Replaces the character strings containing 3 by 'bzzt'
cat(a) #Print to stdout

Uso:

> a=1:500;b='bzzt';a[!a%%3]=b;a[grep(3,a)]=b;cat(a)
1 2 bzzt 4 5 bzzt 7 8 bzzt 10 11 bzzt bzzt 14 bzzt 16 17 bzzt 19 20 bzzt 22 bzzt bzzt 25 26 bzzt 28 29 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 40 41 bzzt bzzt 44 bzzt 46 47 bzzt 49 50 bzzt 52 bzzt bzzt 55 56 bzzt 58 59 bzzt 61 62 bzzt 64 65 bzzt 67 68 bzzt 70 71 bzzt bzzt 74 bzzt 76 77 bzzt 79 80 bzzt 82 bzzt bzzt 85 86 bzzt 88 89 bzzt 91 92 bzzt 94 95 bzzt 97 98 bzzt 100 101 bzzt bzzt 104 bzzt 106 107 bzzt 109 110 bzzt 112 bzzt bzzt 115 116 bzzt 118 119 bzzt 121 122 bzzt 124 125 bzzt 127 128 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 140 bzzt 142 bzzt bzzt 145 146 bzzt 148 149 bzzt 151 152 bzzt 154 155 bzzt 157 158 bzzt 160 161 bzzt bzzt 164 bzzt 166 167 bzzt 169 170 bzzt 172 bzzt bzzt 175 176 bzzt 178 179 bzzt 181 182 bzzt 184 185 bzzt 187 188 bzzt 190 191 bzzt bzzt 194 bzzt 196 197 bzzt 199 200 bzzt 202 bzzt bzzt 205 206 bzzt 208 209 bzzt 211 212 bzzt 214 215 bzzt 217 218 bzzt 220 221 bzzt bzzt 224 bzzt 226 227 bzzt 229 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 241 242 bzzt 244 245 bzzt 247 248 bzzt 250 251 bzzt bzzt 254 bzzt 256 257 bzzt 259 260 bzzt 262 bzzt bzzt 265 266 bzzt 268 269 bzzt 271 272 bzzt 274 275 bzzt 277 278 bzzt 280 281 bzzt bzzt 284 bzzt 286 287 bzzt 289 290 bzzt 292 bzzt bzzt 295 296 bzzt 298 299 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 400 401 bzzt bzzt 404 bzzt 406 407 bzzt 409 410 bzzt 412 bzzt bzzt 415 416 bzzt 418 419 bzzt 421 422 bzzt 424 425 bzzt 427 428 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 440 bzzt 442 bzzt bzzt 445 446 bzzt 448 449 bzzt 451 452 bzzt 454 455 bzzt 457 458 bzzt 460 461 bzzt bzzt 464 bzzt 466 467 bzzt 469 470 bzzt 472 bzzt bzzt 475 476 bzzt 478 479 bzzt 481 482 bzzt 484 485 bzzt 487 488 bzzt 490 491 bzzt bzzt 494 bzzt 496 497 bzzt 499 500

6

Cobra - 70

class P
    def main
        for i in 501,print if('3'in'[i]'or i%3<1,'Bzzt',i)

Lotto - 222

Perché amo davvero questa lingua ... per qualche motivo ...

SETLOCAL ENABLEDELAYEDEXPANSION
for /l %%n in (1,1,500) do (
    set a=%%n&set /ai=!a!%%3
    if "!a:~0,1!"=="3" set a=Bzzt
    if "!a:~1,2!"=="3" set a=Bzzt
    if "!a:~2,3!"=="3" set a=Bzzt
    if !i!==0 set a=Bzzt
    echo !a!>>x)

Dovresti essere in grado di rilasciare le virgolette intorno agli operandi nel primo ifperché sai che esiste almeno una cifra. Anche concatenare l'intero blocco all'interno di forwith &potrebbe funzionare per salvare le parentesi.
Joey,

Inoltre, è possibile utilizzare ==anziché EQUe probabilmente rilasciare alcuni spazi qua e là.
Joey,

@Joey Grazie per i suggerimenti!
Οuroso

6

TI-BASIC - 31 (32) (34) (35) (36) (43)

:While X<500
:X+1→X
:If not(fPart(X/3
:"bzzt
:Disp Ans
:End

Total: 25 + 6 lines = 31

Si noti che la maggior parte dei comandi su TI-BASIC sono rappresentati come entità a byte singolo.

Il codice richiede che X sia inizializzato a 0 in anticipo (altrimenti, sono 3 byte extra).

Ho fatto diversi tentativi di radere diversi byte, quindi non sto descrivendo tutto ciò che ho fatto qui, per non ingombrare il post. Sono stati principalmente diretti ad accorciare il ciclo, cosa che ho fatto in questa versione da un ciclo While e accorciando la condizione If con l'aiuto della Ansvariabile.


Correggimi se sbaglio, ma questo non sembra ai bzztnumeri che contengono 3, ad esempio 13.
Thor

@Thor Hai ragione, ma sono all'interno delle regole, in quanto affermano che potrei stampare bzztsolo per i numeri che sono divisibili per 3. L'aggiunta dell'altro modo potrebbe essere possibile, ma avrebbe bisogno di più istruzioni.
Doktoro Reichard,

1
Le regole dicono: se il numero contiene un 3 o è divisibile per 3, non si dice il numero. Invece, dici "Bzzt" , quindi direi che entrambi dovrebbero essere sostituiti.
Thor,

@Thor Ciò che ora mi preoccupa di più è quella piccola minuscola virgola nel mezzo della frase. Il modo in cui l'ho interpretato, entrambi i modi di fare sono ugualmente validi, il che spiega anche la seconda regola: il numero deve soddisfare solo 1 dei requisiti ... (o avere un 3 o essere divisibile per 3)
Doktoro Reichard

1
Hai contato i byte in modo errato perché le lettere minuscole sono token a due byte. Concordo con l'interpretazione di Thor delle regole in quanto è quella che utilizza ogni risposta sopra questa.
lirtosiast,

5

C, 93

Solo per l'inferno ...

main(i){char s[9]="bzzt";while(i<498+sprintf(s+5,"%d",i))puts(s+5*(i++%3&&!strchr(s+5,51)));}

Questo ha un piccolo problema i = 0
tecnico

4
@anatolyg "Devi contare esattamente fino a 500, a partire da 1 o 0 (hai scelto)." - Ho scelto di iniziare
dall'1.

Mi mancava quel pezzettino. Scusate!
Anatolyg,

Salta molto di più se gli passi argomenti, lol. Ma è ben giocato, te lo darò io! Fino all'utilizzo del valore di ritorno di sprintf mentre si tende verso i numeri a tre cifre per controllare while, lol. Così male .... ahah!
DreamWarrior,

5

Julia 64 byte

map(x->x%3==0||contains(string(x),"3")?"Bzzt":string(x),[1:500])

2
[println(a%3==0||3 in digits(a)?"bzzt":a) for a=1:500]è 54 byte. Anche la restituzione di un array non stampa l'intero array, quindi non sono sicuro che contenga come "output". Se restituire un array conta, allora [a%3==0||3 in digits(a)?"bzzt":a for a=1:500]può contare e segnare 45.
gggg

5

cmd.exe - 91

for /l %x in (1,1,500)do @set/a %x%3|find "0">nul&&echo bzzt||echo %x|find/v"3"||echo bzzt

... perché perché usare un file batch quando esiste un one-liner perfettamente semplice ... :-)


5

groovy - 51

500.times{println"$it".find('3')||it%3<1?'bzzt':it}

modifica: l'utilizzo timesdella versione di stampa ora è breve quanto la "visualizzazione". grazie @ will-p


1
+1. Puoi scambiare (1..500).eachper500.times
Will Lp,

4

C, 80

Utilizzo di spazi come separatori anziché interruzioni di riga.

n;main(){for(;n++<500;)printf(n%10^3&&n/10%10^3&&n/100^3&&n%3?"%d ":"bzzt ",n);}

1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt... C'è qualcosa che non va qui.
ossifrage schifoso

Sembra che fossi troppo avido e inciampato in un comportamento indefinito (variabile modificata e letta tra i punti della sequenza). Ora risolto.
Anatolyg,

Ora funzionante :-)
ossifrage schizzinoso

4

Mathematica, 54 personaggi

Sembra troppo semplice. Devono essere possibili soluzioni più brevi.

If[DigitCount[#][[3]] > 0 || #~Mod~3 < 1, Bzzt, #] & /@ Range@500

Non hai bisogno degli apostrofi :)
Dr. belisarius,

@belisarius davvero. Grazie.
Michael Stern,

4

T-SQL 2008 - 80

Non vinceremo o altro ma divertiremo comunque: ottimizzato grazie a @domager:

declare @ int=0t:if(@)like'%3%'or @%3=0print'bzzt'print @;set @+=1if @<501goto t

Un fatto poco noto, @ è un nome valido per una variabile. Sembra strano perché il codice basato su set è la variante più SQL, ma più breve è più corto! Questa versione funziona su qualsiasi database. Modifica: sono stato in grado di rimuovere due semifinali in quanto non erano necessarie. Sono abbastanza sicuro che sia ottimale.

Edit2: non dire mai mai. Qui ora è ancora più grossolano usare goto, ma ci consente di evitare il blocco. Possiamo sostituire mentre, per cominciare, finiamo con il più breve se, t:, vai a salvare 6 caratteri. Riorganizziamo anche l'affermazione riscrivendo il ciclo come uno pseudo do-while, semanticamente equivalente. Edit3: Sì, in qualche modo se ora è più corto. Originale:

select top 501iif(number like'%3%'or number%3=0,'bzzt',str(number))from spt_values where'p'=type

Deve essere eseguito sul database principale. Adoro T-SQL nonostante i suoi modi rumorosi e brutti. Potrebbe esserci un modo per renderlo più semplice, ma sfortunatamente, il iifbuilt-in richiede che entrambe le parti siano d'accordo sui tipi. Le regole di precedenza dei server SQL danno una precedenza maggiore rispetto alle stringhe. Anche il numero è davvero lungo, ma l'aliasing è più caratteri di quanto valga la pena. Potrebbe esserci un modo migliore per convertire il numero in una stringa. Modifica: funziona anche str. 2 personaggi in meno di ltrim


All'inizio ho pensato che il tuo codice fosse lungo 2012,96 byte.
nyuszika7h,

leggermente più lungo in @ 101, ma non fa affidamento su un tavolodeclare @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
domager il

@domager, assolutamente giusto, inoltre possiamo salvare un bel po 'di caratteri impostando la variabile su @. Quindi l'utilizzo di iif () è ancora più breve di una stampa if (...) print, quindi otteniamo un bel po 'usando l' iifespressione. Inoltre possiamo usare il più corto @+=1per salvare un personaggio
Michael B,

Non sapevo che T-SQL fosse supportato +=. Non ho utile testarlo, ma sono abbastanza sicuro che supporti ''+@la conversione di stringhe usando la locale invariante.
Peter Taylor,

+=è stato aggiunto nel 2008. Supporta '' + @, ma non fa quello che vuoi. Come ho già detto, le regole di precedenza vengono lanciate su int per prime, in modo che vengano lanciate su ''int, risultando in zero, quindi ''+@viene @comunque digitato come un int. strfunziona e non è molto più costoso di ogni altra cosa (2 caratteri extra per i genitori). Ho scelto t-sql 2012 qui a causa IIFdell'operatore, che sa che forse il rilascio sql del 2016 si sbarazzerà di un po 'di rumore e inizierà a essere competitivo (improbabile).
Michael B,

4

VBA: 54

for x=0to 500:?iif(x/3=x\3=instr(1,x,3),x,"Bzzt"):next

Apri il tuo programma Office preferito, premi alt + F11 per aprire l'IDE VBA e incolla il codice nel riquadro immediato e premi Invio.

In VBA: è il separatore di riga,? è una scorciatoia per la stampa, iif significa inline if (think x? "Y": "N"), x / 3 fa divisione in virgola mobile e x \ 3 fa divisione in numero intero, instr restituisce la posizione di un carattere in una stringa, oppure 0 altrimenti, true = -1 e false = 0.

Il codice sostanzialmente incrementa x e genera x se x / 3 = x \ 3 = instr (1, x, 3) è vero e "Bzzt" altrimenti. x / 3 = x \ 3 confronta (float) (x / 3) con (int) (x / 3) e restituisce un valore booleano (0 è falso e -1 è vero). instr (1, x, 3) restituisce 0 se "3" non è presente nel numero e un numero intero positivo altrimenti. L'unica volta in cui l'espressione restituisce true è quando (x / 3 = x \ 3) è false (0) e instr (1, x, 3) è 0, o in altre parole, quando x non è divisibile per 3 e non lo è contiene la cifra "3", che è esattamente quello che stiamo cercando.


4

k4 (37) (35)

{$(x;`bzzt)(|/51=$x)|~"."in$x%3}'!501

k4manca un comando modulo integrato e l'utilizzo di qquello richiederebbe un carattere aggiuntivo; questa versione (ab) utilizza il formato di output incorporato per verificare se la stringa del risultato della divisione xper 3 contiene un punto decimale.

MODIFICARE:

{$(x;`bzzt)(|/51=$x)|x=3*_x%3}'!501

Per quanto intelligente possa essere la corrispondenza del punto decimale, posso radere due byte controllando che 3*floor x%3sia fermo x.


Eseguito l'upgrade per abbinare abilmente il punto decimale!
Segna il

Si prega di non aggiornare tutte le risposte a quelle. Ciò spingerà tutte le sfide attive fuori dalla prima pagina. Sarebbe bello se ne facessi solo una o due alla volta. (Anche se non penso nemmeno di cambiare tra h1ed h2è abbastanza importante da giustificare una modifica in primo luogo.)
Martin Ender,

3

bash, 53 52 48 46

seq 500|factor|sed '/3.*:\| 3 */cBzzt
s/:.*//'

Richiede GNU sed (usa l' cestensione).


3

Java, 142 131 grazie al suggerimento di WozzeC

public class a{public static void main(String[]a){for(int i=1;i<501;i++)System.out.println(i%3>0&(""+i).indexOf(51)<0?i:"bzzt");}}

1
Il mio Java è un po 'arrugginito. Ma non sarà più breve con un e operando? i% 3> 0 && ("" + i) .indexOf (51) <0? i: "bzzt". Potrebbe anche essere possibile saltare {} per il forloop.
WozzeC,

sono 122 byte, 9 in meno: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"));}}
Luigi Cortese il

3

R (40) (36)

Questa è sostanzialmente una risposta plannapus un po 'abbreviata, ma non posso ancora commentare

Aggiornamento: -4 caratteri (vedi il commento di plannapus)

a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a

Produzione:

  [1] "1"    "2"    "bzzt" "4"    "5"    "bzzt" "7"    "8"    "bzzt" "10"   "11"   "bzzt" "bzzt" "14"   "bzzt" "16"   "17"   "bzzt" "19"   "20"   "bzzt" "22"   "bzzt" "bzzt" "25"   "26"   "bzzt" "28"   "29"   "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "40"   "41"   "bzzt" "bzzt" "44"   "bzzt" "46"   "47"   "bzzt" "49"   "50"   "bzzt" "52"   "bzzt" "bzzt" "55"   "56"   "bzzt" "58"   "59"   "bzzt" "61"   "62"   "bzzt" "64"   "65"   "bzzt" "67"   "68"   "bzzt" "70"   "71"   "bzzt" "bzzt" "74"   "bzzt" "76"   "77"   "bzzt" "79"   "80"   "bzzt" "82"   "bzzt" "bzzt" "85"   "86"   "bzzt" "88"   "89"   "bzzt" "91"   "92"   "bzzt" "94"   "95"   "bzzt" "97"   "98"   "bzzt" "100"  "101"  "bzzt" "bzzt" "104"  "bzzt" "106"  "107"  "bzzt" "109"  "110"  "bzzt" "112"  "bzzt" "bzzt" "115"  "116"  "bzzt" "118"  "119"  "bzzt" "121"  "122"  "bzzt" "124"  "125"  "bzzt" "127"  "128"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "140"  "bzzt" "142"  "bzzt" "bzzt" "145"  "146"  "bzzt" "148"  "149"  "bzzt" "151"  "152"  "bzzt" "154"  "155"  "bzzt" "157"  "158"  "bzzt" "160"  "161"  "bzzt" "bzzt" "164"  "bzzt" "166"  "167"  "bzzt" "169"  "170"  "bzzt" "172"  "bzzt" "bzzt" "175"  "176"  "bzzt" "178"  "179"  "bzzt" "181"  "182"  "bzzt" "184"  "185"  "bzzt" "187"  "188"  "bzzt" "190"  "191"  "bzzt" "bzzt" "194"  "bzzt" "196"  "197"  "bzzt" "199"  "200"  "bzzt" "202"  "bzzt" "bzzt" "205"  "206"  "bzzt" "208"  "209"  "bzzt" "211"  "212"  "bzzt" "214"  "215"  "bzzt" "217"  "218"  "bzzt" "220"  "221"  "bzzt" "bzzt" "224"  "bzzt" "226"  "227"  "bzzt" "229"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "241"  "242"  "bzzt" "244"  "245"  "bzzt" "247"  "248"  "bzzt" "250"  "251"  "bzzt" "bzzt" "254"  "bzzt" "256"  "257"  "bzzt" "259"  "260"  "bzzt" "262"  "bzzt" "bzzt" "265"  "266"  "bzzt" "268"  "269"  "bzzt" "271"  "272"  "bzzt" "274"  "275"  "bzzt" "277"  "278"  "bzzt" "280"  "281"  "bzzt" "bzzt" "284"  "bzzt" "286"  "287"  "bzzt" "289"  "290"  "bzzt" "292"  "bzzt" "bzzt" "295"  "296"  "bzzt" "298"  "299"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "400"  "401"  "bzzt" "bzzt" "404"  "bzzt" "406"  "407"  "bzzt" "409"  "410"  "bzzt" "412"  "bzzt" "bzzt" "415"  "416"  "bzzt" "418"  "419"  "bzzt" "421"  "422"  "bzzt" "424"  "425"  "bzzt" "427"  "428"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "440"  "bzzt" "442"  "bzzt" "bzzt" "445"  "446"  "bzzt" "448"  "449"  "bzzt" "451"  "452"  "bzzt" "454"  "455"  "bzzt" "457"  "458"  "bzzt" "460"  "461"  "bzzt" "bzzt" "464"  "bzzt" "466"  "467"  "bzzt" "469"  "470"  "bzzt" "472"  "bzzt" "bzzt" "475"  "476"  "bzzt" "478"  "479"  "bzzt" "481"  "482"  "bzzt" "484"  "485"  "bzzt" "487"  "488"  "bzzt" "490"  "491"  "bzzt" "bzzt" "494"  "bzzt" "496"  "497"  "bzzt" "499"  "500"

Dal momento che molte funzioni di funzionamento delle stringhe (come strsplit) generano errori quando vengono alimentate con caratteri non caratteri, suppongo che greplabbia funzionato. Bella presa! +1
plannapus,

2
A proposito da quando l'hai ridotto a un'espressione non è necessario definire bprima di ciò:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus,

3

Fortran - 118 114 111

Un candidato irrimediabilmente improbabile, sebbene originariamente sviluppato per adattarsi alle schede perforate. Utilizzando tutti gli oscuri costrutti del passato, è ancora possibile scrivere un codice breve:

do3 i=1,500
j=i
if(mod(i,3))2,1,2
1 print*,'bzzt'
cycle
2 goto(1)mod(j,10)-2
j=j/10
if(j>0)goto2
3 print*,i
end

Il "goto calcolato" si goto(L1,L2,...,Ln) xdirama verso una delle etichette L se e solo se 1 <= x <= n.

Modifica: gestito per radere 4 byte riorganizzando il ciclo che controlla la cifra 3. Come bonus, il codice ora contiene anche l'istruzione if aritmetica if(x) a,b,c, che si ramifica sempre su una delle tre etichette: a if x <0, b se x == 0 oc se x> 0.

Sfortunatamente, le prime due versioni non hanno prodotto l'output corretto. Il ciclo digit-3 ora funziona correttamente e il codice ora include anche un'istruzione if logica moderna. Altri tre byte sono spariti, perché chi ha bisogno di una enddodichiarazione? L'output può essere verificato qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.