Zwycięzca: odpowiedź CJam Aditsu ! Aż 25 bajtów! Miły!
Możesz kontynuować przesyłanie odpowiedzi, jednak nie możesz już wygrać. Oryginalny post zachowany dla potomności:
Gra „Bzzt” to gra, w której należy liczyć się do liczby (w tym przypadku 500). Jeśli jednak liczba zawiera 3 lub jest podzielna przez 3, nie podajesz liczby. Zamiast tego mówisz „Bzzt”.
Zasady:
- Nie można na stałe zakodować liczb.
- Liczba musi spełniać przynajmniej 1 z poniższych wymagań
- Podzielny przez 3
- Liczba zawiera 3
- Niektóre typy separatorów są obowiązkowe (12bzzt14 się nie liczy)
- Wynik mierzony jest w bajtach.
- Musisz policzyć dokładnie do 500, zaczynając od 1 lub 0 (wybrałeś).
- Liczby muszą być wyprowadzane, ale nie ma znaczenia jak (np. Standardowe wyjście, zapis do pliku tekstowego itp.).
- 0 może być podzielne przez 3 lub niepodzielne. Możesz wybrać.
- Możesz wypisywać liczby pojedynczo (np. Wyjście 1, następnie 2, następnie bzzt, następnie 4 itd.) Lub wszystkie jednocześnie (np. Wyjście 1 2 bzzt 4 5).
- Musisz zastąpić literę 3 słowem „bzzt”. To nie rozróżnia wielkości liter (bZzt, Bzzt, bzzt są w porządku).
- To wyzwanie dla golfa , więc wygrywa najkrótszy kod.
- Konkurs kończy się 30 czerwca 2014 r. (7 dni od opublikowania).
buzz
czybzzt
mają zastosowanie oba te wymagania? Czy muszę generować,12bzzt4
czybzzt
dla1234
?bzzt
za1234
. Jest to „powszechna” gra polegająca na piciu (tylko my często robimy to zOdpowiedzi:
CJam - 25
Dzięki Howard :)
Wypróbuj na http://cjam.aditsu.net/
Wyjaśnienie:
501{…}fI
jest w zasadziefor(int I=0; I<501; ++I) {…}
3s
konwertuje 3 na ciąg, tzn. „3”I3%
oznaczaI
% 3<
pobiera lewy podciąg -"3".substring(0, I % 3)
- który jest „” dlaI
% 3 == 0, a „3” w przeciwnym razieIs
konwertujeI
na ciąg-
z 2 ciągami robi ustawioną różnicę, w wyniku czego ciąg iffI
% 3 == 0 (pierwszy ciąg był pusty) lubI
ma 3 cyfry,…I"bzzt"?
jest jak… ? I : "bzzt"
; poprzedni ciąg jest traktowany jako wartość logiczna, gdzie „” jest fałszem, a każdy inny ciąg jest prawdziwy,N
dodaje nowy wierszźródło
501{3sI3%<Is-I"bzzt"?N}fI
.Ruby, 43
Całkiem proste.
Edycja: Zapisano jeden bajt, dzięki Howard!
źródło
"#{a}"[?3]||a%3<1
."#{a}"[?3[0,a%3]]
.puts
zp
i zapisywania 3 znaki?p
wypisuje wynik wywołaniainspect
swojego argumentu (w porównaniu do putów , które wywołująto_s
). Zamiast drukowaćBzzt
(czyli jest:Bzzt.to_s
), drukowałby:Bzzt
, co nie odpowiada specyfikacjom wyjściowym.seq i GNU sed -
42333130Działa bezpośrednio w desce rozdzielczej, niektóre inne powłoki mogą wymagać wyłączenia rozszerzania historii, np. Z bash
set +H
:źródło
0~3!
uruchamia się{/3/!b}
i razem te wyrażenia opuszczają linię tak, jakby nie była podzielna przez i nie zawierała 3. Ostatni bit „koryguje” linię do bzzt.kod maszynowy x86 w systemie DOS (plik .com) - 71 bajtów
Drukuje wymagane wyjście na standardowe wyjście ze spacją jako separatorem; można uruchomić bez problemów w DosBox.
Skomentowany montaż:
źródło
Perl - 35
4042źródło
PHP, bez separatora -
62, 61,59,58,52,4947Nie oznacza to, że między nimi powinien znajdować się spacja / znak nowej linii / separator bez:
Z separatorem
68,67,65,64,58 / 55,53 / 5251/50echo
, trochę mnie uratowało.~õ
Tworzy przełamaneJavaScript -
54,5150Ta sama zasada, ale funkcje javascript:
źródło
console.log()
oczywiście, ale to jest krótsze.<?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;
õ
\n
!strpbrk($1,3)
ztrim(3,$i)
uratować 4 bajtyJavaScript
5049-1 bajt dzięki core1024
źródło
&&
operatora logicznego . Na przykład:497 % 3 = 2
=>2 & true = 0
=>bzzt
for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')
- 49: PGolfScript,
3029 znakówNie tak prosta implementacja w GolfScript, można przetestować tutaj .
źródło
Perl, 36
Edycja: Nie jestem mnichem Perla, więc core1024 wydaje się, że udało mu się zagrać w inny bajt w swojej odpowiedzi .
źródło
say
aby zapisać 4 bajty:say$_%3&&!/3/?$_:bzzt for 1..5e2
C # (71)
Może być bezpośrednio wykonany w LinqPad.
źródło
|
) zamiast logicznego-lub.Python (52)
Dzięki, grc!
Stara wersja:
źródło
for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
['3'[:i%3]in`i`]
Haskell:
88828079źródło
==0
z<1
elem'3'$show n
, który jest o wiele krótszy. Albo nie. Nie sprawdziłem.elem
w notacji prefiksu nie zapisuje żadnych znaków, ponieważ przed apostrofem musi być spacja; inaczej dostanieszNot in scope: elem'3'
.<1
Ale dobre oko !JavaScript
666360Dzięki edc65 za sugestię użycia tablicy. Dane wyjściowe będą teraz rozdzielane przecinkami.
Stare wersje
Wersja 1a - 66
Wydrukuj od 1 do 500 w polu alertu zgodnie z regułą. Dane wyjściowe są rozdzielone spacjami.
Wersja 1b - 65
Jeśli uznamy, że 0 nie jest podzielne przez 3, możemy skrócić rozwiązanie do 65 znaków:
Wersja 2 - 63
Dzięki grc za sugestię zmniejszenia długości.
źródło
for(a=i="";i<500;)a+=++i ...
PowerShell, 42
Głównie praca Ventero, z niewielką pomocą dotyczącą składni przeze mnie ;-)
źródło
R, 49 znaków
Wyjaśniono:
Stosowanie:
źródło
Kobra - 70
Partia - 222
Ponieważ naprawdę kocham ten język ... z jakiegoś powodu ...
źródło
if
ponieważ wiesz, że jest co najmniej jedna cyfra. Również łączenie pełnego bloku wewnątrzfor
z&
może działać w celu zapisania nawiasów.==
zamiastEQU
i prawdopodobnie upuścić kilka miejsc tu i tam.TI-BASIC - 31
(32) (34) (35) (36) (43)Zauważ, że większość poleceń w TI-BASIC jest reprezentowana jako jednostki jednobajtowe.
Kod wymaga wcześniejszego zainicjowania X na 0 (w przeciwnym razie są to dodatkowe 3 bajty).
Podjąłem kilka prób ogolenia kilku bajtów, więc nie opisuję wszystkiego, co tutaj zrobiłem, aby nie zagracać postu. Były one głównie ukierunkowane na skrócenie pętli, co zrobiłem w tej wersji za pomocą pętli While i przez skrócenie warunku If za pomocą
Ans
zmiennej.źródło
bzzt
liczby zawierały 3, np. 13.bzzt
tylko dla liczb, które są podzielne przez 3. Dodanie innego sposobu mogłoby być możliwe, ale wymagałoby więcej instrukcji.C, 93
Do diabła z tym ...
źródło
i = 0
Julia 64 bajty
źródło
[println(a%3==0||3 in digits(a)?"bzzt":a) for a=1:500]
ma 54 bajty. Zwrócenie tablicy również nie powoduje wydrukowania całej tablicy, więc nie jestem pewien, czy liczy się ona jako „wynik”. Jeśli zwrócona tablica się liczy,[a%3==0||3 in digits(a)?"bzzt":a for a=1:500]
może liczyć i zdobyć 45.cmd.exe - 91
... bo po co używać pliku wsadowego, gdy istnieje idealnie prosta liniówka ... :-)
źródło
groovy - 51
edycja: użycie
times
wersji drukowanej jest teraz tak krótkie, jak „wyświetlanie”. dzięki @ will-pźródło
(1..500).each
na500.times
C, 80
Używanie spacji jako separatorów zamiast podziałów linii.
źródło
1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt
... Coś tu nie gra.Mathematica, 54 znaki
To wydaje się zbyt proste. Krótsze rozwiązania muszą być możliwe.
źródło
T-SQL 2008 - 80
Nie wygrywa ani nic innego, ale sprawia przyjemność: Poprawiono dzięki @domager:
Mało znany fakt, @ jest prawidłową nazwą zmiennej. To dziwne, ponieważ kod oparty na zestawie jest tym bardziej wariantem SQL, ale krótszy jest krótszy! Ta wersja działa na dowolnej bazie danych. Edycja: mogłem usunąć dwa półwyroby, ponieważ nie były one potrzebne. Jestem prawie pewien, że jest to tak optymalne, jak to możliwe.
Edycja2: Nigdy nie mów nigdy. Tutaj jest teraz jeszcze grubszy przy użyciu goto, ale pozwala nam uniknąć bloku. Możemy zamienić, zaczynając, kończąc na krótszym, jeśli, t:, musisz zapisać 6 znaków. Przekształcamy również instrukcję, przepisując pętlę jako pseudo do-while, semantycznie równoważne. Edycja3: Tak, w jakiś sposób, jeśli jest teraz krótszy. Oryginał:
Musi być uruchomiony w głównej bazie danych. Uwielbiam T-SQL pomimo jego hałaśliwych i brzydkich sposobów. Może być sposób na uproszczenie tego, ale niestety
iif
wbudowane wymaga, aby obie strony uzgodniły typy. Reguły pierwszeństwa serwerów SQL dają int wyższy priorytet niż łańcuchy. Liczba jest również bardzo długa, ale aliasing zawiera więcej znaków, niż jest to warte. Może być lepszy sposób na przekształcenie liczby w ciąg znaków. Edycja: str również działa. 2 mniej znaków niż ltrimźródło
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
@
. Wtedy użycie iif () jest jeszcze krótsze niż wydruk if (...), w przeciwnym razie zyskamy całkiem sporo, używająciif
wyrażenia. Możemy również użyć krótszego,@+=1
aby uratować znak+=
. Nie mam go pod ręką do testowania, ale jestem prawie pewien, że obsługuje''+@
konwersję ciągów przy użyciu niezmiennego ustawienia narodowego.+=
został dodany w 2008 roku. Obsługuje +, ale nie robi tego, co chcesz. Jak powiedziałem, reguły pierwszeństwa rzutują na int, więc rzutuje''
na int, w wyniku czego zero, więc nadal''+@
jest@
wpisywane jakoint
.str
działa i nie jest o wiele droższy niż cokolwiek innego (2 dodatkowe znaki dla parens). Wybrałem tutaj t-sql 2012 ze względu naIIF
operatora, który wie, że być może wydanie z 2016 roku pozbędzie się trochę hałasu i zacznie być konkurencyjny (mało prawdopodobne).VBA: 54
Otwórz swój ulubiony program pakietu Office, naciśnij klawisze Alt + F11, aby otworzyć IDE VBA, wklej kod do bezpośredniego panelu i naciśnij klawisz Enter.
W VBA: czy separator linii jest? jest skrótem do wydruku, iif oznacza inline jeśli (pomyśl x? "Y": "N"), x / 3 wykonuje dzielenie zmiennoprzecinkowe, a x \ 3 wykonuje dzielenie całkowite, instr zwraca pozycję znaku w ciągu lub 0 w przeciwnym razie prawda = -1 i fałsz = 0.
Kod w zasadzie zwiększa x i zwraca x, jeśli x / 3 = x \ 3 = instr (1, x, 3) jest prawdą, a „Bzzt” w przeciwnym razie. x / 3 = x \ 3 porównuje (liczba zmiennoprzecinkowa) (x / 3) do (int) (x / 3) i zwraca wartość logiczną (0 to fałsz, a -1 to prawda). instr (1, x, 3) zwraca 0, jeśli „3” nie jest liczbą, a dodatnią liczbą całkowitą w przeciwnym razie. Wyrażenie zwraca wartość true tylko wtedy, gdy (x / 3 = x \ 3) ma wartość false (0), a instr (1, x, 3) ma wartość 0 lub innymi słowy, gdy x nie jest podzielne przez 3 i nie zawierają cyfrę „3”, która jest dokładnie tym, czego szukamy.
źródło
k4
(37)(35)k4
brakuje mu wbudowanego polecenia modulo, a użycie tegoq
wymagałoby dodatkowej postaci; ta wersja (ab) używa wbudowanego formatu wyjściowego, aby sprawdzić, czy ciąg wyniku dzieleniax
przez 3 zawiera kropkę dziesiętną.EDYTOWAĆ:
Sprytne, ponieważ dopasowanie do kropki dziesiętnej może być, mogę ogolić dwa bajty, sprawdzając, czy
3*floor x%3
jest nadalx
.źródło
h1
ih2
jest na tyle ważna, że uzasadnia edycję.)Grzmotnąć,
53 52 4846Wymaga GNU sed (używa
c
rozszerzenia).źródło
Java,
142131 dzięki sugestii WozzeCźródło
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)Jest to w zasadzie plannapus nieco skrócona, ale nie mogę jeszcze komentować
Aktualizacja: -4 znaki (patrz komentarz plannapusa)
Wynik:
źródło
strsplit
) wyrzuca błąd, gdy jest zasilany znakami niebędącymi znakami, to też założyłemgrepl
. Dobry chwyt! +1b
wcześniej definiować :a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
Fortran -
118 114111Beznadziejnie mało prawdopodobny kandydat, choć pierwotnie opracowany, aby pasował do kart ciosów. Korzystając ze wszystkich niejasnych konstrukcji z przeszłości, nadal można napisać krótki kod:
„Obliczone goto”
goto(L1,L2,...,Ln) x
rozgałęzia się do jednej z etykiet L wtedy i tylko wtedy, gdy 1 <= x <= n.Edycja: Udało się ogolić 4 bajty, przestawiając pętlę sprawdzającą cyfrę 3. Jako bonus, kod zawiera teraz także arytmetyczną instrukcję if
if(x) a,b,c
, która zawsze rozgałęzia się do jednej z trzech etykiet: a jeśli x <0, b jeśli x == 0 lub c jeśli x> 0.Niestety pierwsze dwie wersje nie wygenerowały prawidłowego wyniku. Pętla cyfry 3 działa teraz poprawnie, a kod zawiera teraz także nowoczesną logiczną instrukcję if. Trzy kolejne bajty zniknęły, bo kto potrzebuje
enddo
instrukcji? Dane wyjściowe można zweryfikować tutaj .źródło