Twoim wyzwaniem, jeśli zdecydujesz się je zaakceptować, jest stworzenie funkcji lub programu, który wyświetli „tak”, jeśli daną liczbę można podzielić przez 13, i wyśle „nie”, jeśli nie jest.
Zasady:
- Nie wolno nigdzie używać numeru 13.
- Brak wyodrębniających się synonimów dla 13 (tak jak przy użyciu 15 - 2).
- Punkty premiowe będą przyznawane za niestosowanie modułu, dodatkowy bonus za niestosowanie podziału.
Punktacja:
- Twój wynik będzie liczbą bajtów w kodzie ( nie zawiera białych znaków ) pomnożoną przez premię.
- Jeśli nie użyłeś modułu, premia wynosi 0,90; jeśli nie użyłeś podziału, premia wynosi 0,90.
- Jeśli nie używałeś żadnego z nich, bonus wynosi 0,80.
- Im niższy wynik, tym lepiej.
Wejście będzie zawsze liczbą całkowitą większą niż 0 i mniejszą niż 2 ^ 32.
Twój wynik powinien być prostym „tak” lub „nie”.
Wyjaśnienia:
- Użycie jakiejś ronda do generowania liczby 13 do użytku jest dopuszczalne. Proste synonimy arytmetyczne, takie jak (10 + 3) są niedozwolone.
- Funkcja lub program musi dosłownie wypisać „tak” lub „nie”, ponieważ jeśli podaną liczbę można podzielić przez 13.
- Jak zawsze, sprytne rozwiązania są zalecane, ale nie wymagane.
źródło
function f(n){return "yes"}
.Using some roundabout method of generating the number 13 for use is acceptable.
Jak określić, co jest „wystarczające rondo”?Odpowiedzi:
Java (wynik
60,859,2)Wynik: (76 - 2 białe znaki) znaki * 0,8 = 59,2
źródło
println
->print
?ASM - 16 bitów x86 w powłoce poleceń WinXP
wykonywalny - 55 bajtów * 0,8 = 44
źródło - 288 znaków * 0,8 = 230,4
Liczba 13 nawet nie pojawia się w złożonym pliku .com.
Złóż za pomocą A86.
źródło
The input will always be an integer greater than 0 and less than 2^32
. Nie możesz używać 16Python 3.x: 54 * 0,8 = 43,2
Może to być wydzierżawiony ciąg o długości 13, ale oto on:
Działa poprzez budowanie ciągu n spacji (wybór separatora jest arbitralny, ale wybrałem spację z oczywistych powodów) i dzielenie 13-spacji podciągów, dopóki nie zostanie ci ciąg zawierający n% 13 spacji.
źródło
print 'yneos'[any((' ' * input()).split(' '))::2]
' '
z' '*6+' '
do oszczędzania 5 znaków - ale potem odkryłem, że pomieszczenia nie liczy w ogóle ...GolfScript, 32 znaki
Chciałem wypróbować coś innego niż wszyscy, więc moje rozwiązanie oblicza cyfrowy pierwiastek z liczby 14, wielokrotnie konwertując liczbę na bazę 14 i sumując cyfry, aż wynik nie będzie już mniejszy. Jest to w zasadzie to samo, co obliczanie pozostałego modułu 13, z tym wyjątkiem, że wynik będzie w zakresie od 1 do 13 zamiast od 0 do 12.
Ponieważ sprawdzenie, czy cyfrowy pierwiastek jest równy 13, byłoby trudne bez użycia samej liczby 13 (lub jakiegoś kiepskiego obejścia, takiego jak 12 + 1), tak naprawdę zwiększam liczbę wejściową o jeden przed pętlą, a następnie zmniejszam wynik. W ten sposób wynik liczb podzielnych przez 13 będzie wynosił zero, co jest znacznie łatwiejsze do sprawdzenia.
Oto skomentowana wersja programu:
Ten program faktycznie obsłuży wszelkie nieujemne liczby całkowite, ponieważ GolfScript używa arytmetyki bignum. Oczywiście, bardzo duże dane wejściowe mogą pochłaniać nadmierny czas i / lub pamięć.
Kod nie korzysta bezpośrednio z modułów ani dzielenia, chociaż korzysta z podstawowego operatora konwersji GolfScipt, który prawie na pewno dokonuje podziału i odbiera resztę wewnętrznie. Zostawię GigaWatt decyzję, czy kwalifikuje mnie to do premii, czy nie.
źródło
C 68 * 0,8 = 54,4
Po 24 odpowiedziach nikt jeszcze nie wymyślił tego oczywistego algorytmu:
źródło
JavaScript (27,9)
Aktualna wersja (31 znaków * 0,90 bonus = 27,9).
Demo: http://jsfiddle.net/9GQ9m/2/
Edycja 1: Zrezygnuj z drugiej premii, używając modułu, aby znacznie obniżyć wynik i uniknąć
for
pętli. Wyeliminuj~~
i zapisz dwa znaki (dzięki@copy
).Starsza wersja (48 znaków * 0,80 bonus = 38,4)
źródło
~~
zakładanie poprawnego wejścia; inaczejprompt()<<1
też zadziała.BrainFuck
Wynik: 200 * 0,8 = 160
Czyta froms stdin. Prawdopodobnie nie jest to najsprytniejsze rozwiązanie, ale fajnie jest dostać wszystko, co działa w BF. Jest jednak dość kompaktowy.
źródło
Scala (38 * 0,9 = 34,2)
Podobne do
0xD
(hex) lub015
(oct).Wartość ASCII
CR
wynosi 13.źródło
Haskell, 28 * 0,8 = 22,4
źródło
Pyton:
Na przykład
daje
źródło
20
)f=lambda n:pow(8,n,79)-1 and "no" or "yes"
naprawia to, 43 * 0,8 = 34,4C 54,4 == 68 * .8
80 * .8źródło
\r
- pomyślałem, że jest dobre tylko do obsługi systemu Windows. Ale dlaczegoc>0
, kiedyc
to zrobić?>0
nie jest dobrze. Ale zamiast zauważyć, że twoja funkcja ich nie obsługuje, pomyślałem, że==
jest dobry.ECMAScript 6, 25 × 0,9 = 22,5
Tak, to nudny sposób na zdobycie 13 lat.
źródło
APL ((21-1) × 0,8 = 16)
⎕IO
powinien być ustawiony na 0, aby działał poprawnie w Dyalog APL. Aby wygenerować 13, bierzemy podłogę (⌊
) logarytmu naturalnego (⍟
) 9 do potęgi 6 (9*6
). Następnie znajdujemy GCD (∨
) naszych danych wejściowych (⎕
) i 13, a następnie sprawdzamy, czy jest to równe 1. Służy do indeksowania ([...]
) wektora odpowiedzi.Jeśli ktoś chce być pedantyczny, jeśli chodzi o wzmiankę o bajtach w specyfikacji oceniania, wynik dla wersji kodowanej w UTF-8 to
(29 - 1) × 0.8 = 22.4
. :)źródło
C, 88
Sztuczka Fibonacciego.
źródło
Perl - 44 × 0,8 = 35,2
Licząc shebang jako jeden bajt.
Jestem trochę spóźniony do gry, ale pomyślałem, że podzielę się algorytmem, ponieważ żadne inne posty do tej pory go nie używały.
Działa to pod obserwacją, że jeśli n jest podzielne przez 13 , to ⌊ n / 10 ⌋ + n% 10 * 4 jest również podzielne przez 13 . Wartości 13 , 26 i 39 przełączają się na siebie. Wszystkie inne wielokrotności 13 w końcu dotrzeć do jednego z tych wartości w czasie nie dłuższym niż log 10 n iteracji.
W innych bazach
Trzeba przyznać, że
chop
to trochę kłótnia. Przy podstawowej reprezentacji 10 jest to odpowiednikdivmod
. Ale algorytm działa doskonale dobrze w innych bazach, na przykład w bazie 4 lub 8.Pseudokod powyższego algorytmu w stylu Python (podstawa 10):
W bazie 2:
W bazie 4:
W bazie 8:
itd. Każda baza mniejsza niż 13 działa równie dobrze.
źródło
JavaScript: 59 * 0,8 = 47,2 (?)
skrzypce :
Łącznie z poprawą mellamokb (57 * 0,8 = 45,6):
źródło
return n-c?'no':'yes'
na drugi średnik i pomijając go.prompt
wprowadzania ialert
wyprowadzania, co czyni program interaktywnym i oszczędza kilka znaków.Perl: (51-4 spacji) * 0,9 = 42,3
źródło
Perl (19,8)
21 bajtów * .9
Uwaga: Mój pierwszy program w Perlu. Słabo wpisane jest dobre do golfa.
źródło
w C (K&R): 47 * 0,8 = 37,6
EDYCJA 1: OK usunąłem wszystkie zależności od funkcji zewnętrznych, powyższe będzie działać tak długo, jak umieścisz ten wiersz w 13 wierszu pliku! :) Jeśli
__LINE__
można zastąpić słowem say,0xd
można zapisać kolejne 5 znaków (wynik: 33,6)źródło
J - 22,4 = 28 * 0,8
Na podstawie mxmul na mądry cyklicznej metodzie .
Przykłady:
źródło
JavaScript (108 minus 0 dla białych znaków) => 108, x 0,8 (bez modułu, bez podziału) = 86,4
b=b=>{a=z,a=a+"";return+a.slice(0,-1)+4*+a.slice(-1)};z=prompt();for(i=99;i--;)z=b();alert(b()-z?"no":"yes")
Ta metoda wykorzystuje następujący algorytm: 1. Weź ostatnią cyfrę, pomnóż ją przez cztery, dodaj ją do reszty obciętej liczby. 2. Powtórz krok 1 dla 99 iteracji ... 3. Przetestuj go jeszcze raz, wykonując krok 1, jeśli wynikowa liczba jest sama, znalazłeś wielokrotność 13.
Poprzednia aktualizacja, usunięta
var
i odwrócona logika w alercie, aby usunąć więcej znaków przy użyciu warunku odejmowania-fałszywego.Technicznie wynik końcowy jest taki, że w końcu osiągniesz dwucyfrową liczbę, taką jak 13, 26 lub 39, która po przejściu przez krok 1 ponownie da odpowiednio 13, 26 lub 39. Zatem sprawdzenie, czy iteracja 100 jest taka sama, potwierdzi podzielność.
źródło
Cheddar, 20 bajtów (niekonkurencyjny)
Wynik to 20 * 0,9 = 18
Prosta odpowiedź.
źródło
Common Lisp (71 bajtów * 0,8) = 56,8
Prosta rekurencja, naprawdę.
(defun w(x)(if(> x 14)(w(- x 13))(if(> 14 x 12)(print'yes)(print'no))))
Nie golfowany:
źródło
Rubinowy (
5048 * 0,9 = 43,2)Inteligentny sposób użycia
eval
źródło
D 56 znaków .80 bonus = 44,8
mogło to być wyłudzanie przy użyciu 1/13, a podwójne może dokładnie przechowywać dowolną liczbę 32-bitową
edycja: działa to przez pomnożenie przez 1/13 i sprawdzenie części ułamkowej, jeśli jest różna od 0 (dopuszczając błędy zaokrąglania) lub innymi słowy sprawdza część ułamkową i / 13
źródło
Python 2.7
(20-1 biała spacja) * 0,9 (bez podziału) = 17,1
tak / nie zamiast true / false: 31 * 0,9 (bez podziału) = 27,9
korzysta z Pythona
int
do konwersji innych zasad z ciągów znaków na liczby całkowite 10. widać w obu wersjach, że używają innej podstawy (jednakowej długości znaków)edycja: 1 znak zapisz w wersji tak / nie
edit2: ogolono kolejne 2 znaki!
edit3: jeszcze raz dziękuję za komentarze! jeszcze więcej znaków golono za pomocą wbudowanych reprezentacji ósemkowych Pythona (
015
==13
...) zamiast podstawowego tłumaczenia intźródło
print['no','yes'][input()%int('d',14)==0
14-1
lub26/2
. Właśnie skorzystałem z wolności twórczej, aby reprezentować 13Perl, 95 * 0,8 = 76
Podziały linii zostały dodane dla jasności. Prawdopodobnie mogłem skrócić tę odpowiedź, ale uważam, że ta odpowiedź stanowi wyjątkowy sposób podejścia do problemu.
źródło
Python - wynik 27,9
(31 znaków * 0,90) - rezygnuje z premii za krótszy kod.
starsza wersja: (47 znaków * 0,80) - całkowite zdzieranie odpowiedzi Javascript w mellamokb, ale w Pythonie.
starsza wersja: (60 znaków * 0,80)
starsza wersja: (105 znaków * 0,80)
źródło
(1,10,9,12,3,4)
uratowałby 1 znak, ale nie rozwiązałby wartości mniejszej niż 13.W Q:
źródło
Gramatyka liniowa prawa - ∞ punktów
Następnie, w zależności od tego, w jaki sposób go „uruchomisz”, wyświetli „tak” lub „nie”.
Nie jest to poważny wpis, tylko trochę zabawy;)
EDYCJA: Może powinienem trochę wyjaśnić.
Gramatyka jest zbiorem reguł (produkcji), które określają język . Język można traktować jako wszystkie możliwe ciągi utworzone przez alfabet, które odpowiadają regułom jego gramatyki.
Tutaj alfabet jest zbiorem wszystkich cyfr dziesiętnych. Zasady gramatyki mówią, że wszystkie ciągi muszą tworzyć dziesiętne liczby całkowite, które można podzielić przez 13.
Możemy użyć powyższej gramatyki, aby sprawdzić, czy łańcuch należy do naszego języka.
Reguły gramatyki zawierają symbole końcowe (które są elementami w języku), a także symbole nieterminalne, które są zastępowane rekurencyjnie.
Łatwiej jest wyjaśnić, co się dzieje na przykładzie:
Powiedzmy na przykład, że testowany przez nas ciąg to 71955.
Zawsze występuje symbol początkowy (który nie jest końcowy), w przypadku gramatyki powyżej jest to „S”. W tym momencie nie odczytaliśmy żadnych znaków z naszego ciągu:
Teraz czytamy pierwszy symbol w naszym ciągu, który jest „7”, a następnie szukamy reguły w gramatyce, która ma dowolny z nieterminali w naszym bieżącym wzorze po lewej stronie „->” i że ma nasz symbol po prawej stronie „->”. Na szczęście jest jeden (S-> 7G), więc zastępujemy nieterminalne symbole w naszym obecnym wzorze prawą stroną nowej reguły:
Teraz mamy wzorzec nieterminalny „G”, a następnym symbolem do odczytania jest „1”, więc szukamy reguły w naszej gramatyce, która zaczyna się od „G-> 1”. (G-> 1F), więc zastępujemy terminale RHS naszej nowej reguły:
Powtarzaj ten proces:
Następna zasada: F-> 9D
Następna zasada: D-> 5F
Następna zasada: F-> 5S
W tym momencie nie mamy już żadnych symboli w naszym ciągu, ale mamy tam inny symbol nieterminalny. Widzimy z pierwszej reguły gramatyki, że możemy zastąpić „S” pustym ciągiem (ε): S-> ε
W ten sposób otrzymujemy aktualny wzór: 71955ε, co odpowiada 71955.
Przeczytaliśmy wszystkie symbole w naszym ciągu, a wzorzec nie zawiera żadnych symboli nieterminalnych. Co oznacza, że ciąg należy do języka, a zatem 71955 jest w rzeczywistości podzielny przez 13.
Tj. Celem jest mieć wzór = ciąg. Jeśli masz jakieś nieterminalne symbole, po przeczytaniu wszystkich symboli w łańcuchu, łańcuch nie należy do języka. Podobnie, jeśli nadal masz więcej symboli do przeczytania, ale w gramatyce nie ma żadnych reguł, które pozwolą ci iść naprzód, to łańcuch nie należy do języka.
źródło