Biorąc pod uwagę dodatnią liczbę całkowitą jako dane wejściowe, Twoim zadaniem jest wyprowadzenie prawdziwej wartości, jeśli liczba jest podzielna przez dwukrotność sumy jej cyfr, a w przeciwnym razie wartość fałszowania ( OEIS A134516 ). Innymi słowy:
(sum_of_digits)*2 | number
Zamiast wartości prawda / fałsz dla przypadków prawda i fałsz, możesz zamiast tego podać dowolny skończony zestaw wartości dla przypadku prawda / fałsz i uzupełnić je o inne wartości. W prostym przykładzie możesz użyć
0
dla prawdziwej wielkości liter i wszystkich innych liczb dla fałszywej wielkości liter (lub odwrotnie, jeśli chcesz).Obowiązują standardowe reguły wejścia i wyjścia. Obowiązują również domyślne luki.
Dane wejściowe można przyjmować jako liczbę całkowitą lub jako ciąg znaków reprezentujący tę liczbę całkowitą.
To jest golf-golf , stąd wygrywa najkrótszy kod w bajtach!
Jestem nowy w PPCG, więc chciałbym, abyś opublikował wyjaśnienie, jeśli to możliwe.
Przypadki testowe
Wejście - Wyjście - (Przyczyna) 80 - Prawda - (16 podziałów 80) 100 - Prawda - (2 części 100) 60 - Prawda - (12 podziałów 60) 18 - Prawda - (18 podziałów 18) 12 - Prawda - (6 podziałów 12) 4 - Falsy - (8 nie dzieli 4) 8 - Falsy - (16 nie dzieli 8) 16 - Falsy - (14 nie dzieli 16) 21 - Falsy - (6 nie dzieli 21) 78 - Falsy - (30 nie dzieli 78) 110 - Falsy - (4 nie oznacza 110) 111 - Falsy - (6 nie dzieli 111) 390 - Falsy - (24 nie dzieli 390)
Odpowiedzi:
Neim , 3 bajty
Wyjaśnienie:
Wypróbuj online!
Wersja szczegółowa
źródło
JavaScript (ES6),
312927 bajtówPobiera dane wejściowe jako ciąg. Zwraca zero dla prawdy i niezerowe dla fałszu.
Skomentował
Przypadki testowe
Pokaż fragment kodu
źródło
C #, 46 bajtów
Wersja pełna / sformatowana:
źródło
Retina ,
3827 bajtów-11 bajtów i naprawiono błąd w kodzie dzięki @MartinEnder
Wypróbuj online!
Drukuje 1, jeśli dzieli, 0 w przeciwnym razie
Wyjaśnienie (mam nadzieję, że mam rację)
Dołącza całe dane wejściowe oraz nowy wiersz i dane wejściowe ponownie
Konwertuje każde dopasowanie do unarnego (albo cały drugi wiersz, który jest oryginalnym wejściem, albo każda cyfra w pierwszym wierszu)
Sprawdź, czy pierwszy wiersz (suma podwójnej cyfry) jest dzielnikiem drugiego wiersza
źródło
MATL , 7 bajtów
Wyprowadza,
0
jeśli podzielne, dodatnia liczba całkowita w przeciwnym razie. W szczególności, reszta jest dzielona przez dwukrotność sumy jej cyfr.Wypróbuj online!
Wyjaśnienie
źródło
05AB1E ,
54 bajtów-1 bajt dzięki Okx
Wypróbuj online!
Możesz także usunąć ostatnie Ö, aby uzyskać 0 za prawda i coś innego za fałsz, w wyniku czego powstały tylko 3 bajty, ale dla mnie to po prostu nie pasuje do definicji.
Wyjaśnienie
źródło
%_
goÖ
.Kod maszynowy x86-64, 24 bajty
Powyższy kod definiuje funkcję w 64-bitowym kodzie maszynowym x86, który określa, czy wartość wejściowa jest podzielna przez dwukrotność sumy jej cyfr. Funkcja jest zgodna z konwencją wywoływania AMD64 w Systemie V, dzięki czemu można ją wywoływać z praktycznie dowolnego języka, tak jakby była funkcją C.
Pobiera pojedynczy parametr jako dane wejściowe przez
EDI
rejestr, zgodnie z konwencją wywoływania, która jest liczbą całkowitą do przetestowania. (Zakłada się, że jest to dodatnia liczba całkowita, zgodna z regułami wyzwania i jest wymagana do prawidłowego działaniaCDQ
instrukcji, których używamy).EAX
Ponownie zwraca wynik do rejestru zgodnie z konwencją wywoływania. Wynik będzie wynosił 0, jeśli wartość wejściowa była podzielna przez sumę jej cyfr, a w przeciwnym razie niezerowa. (Zasadniczo odwrotna wartość logiczna, dokładnie taka jak w przykładzie podanym w regułach wyzwania).Jego prototypem C będzie:
Oto instrukcje języka asemblera bez oznakowania, opatrzone krótkim objaśnieniem celu każdej instrukcji:
W pierwszym bloku dokonujemy wstępnej inicjalizacji rejestrów:
PUSH
+POP
instrukcje są używane jako powolna, ale krótka droga do inicjalizacjiESI
do 10. Jest to konieczne, ponieważDIV
instrukcja na x86 wymaga operandu rejestru. (Nie ma formy, która dzieli bezpośrednią wartość, powiedzmy, 10).XOR
służy jako krótki i szybki sposób na wyczyszczenieECX
rejestru. Rejestr ten będzie służył jako „akumulator” wewnątrz nadchodzącej pętli.EDI
tworzona jest kopia wartości wejściowej (z ) i zapisywana w niejEAX
, która zostanie przechwycona podczas przechodzenia przez pętlę.Następnie zaczynamy zapętlać i sumować cyfry w wartości wejściowej. Jest to oparte na
DIV
instrukcji x86 , która dzieliEDX:EAX
przez operand i zwraca iloraz do,EAX
a resztę doEDX
. Tutaj podzielimy wartość wejściową przez 10, tak że reszta to cyfra w ostatnim miejscu (którą dodamy do naszego rejestru akumulatorówECX
), a iloraz to pozostałe cyfry.CDQ
Instrukcja jest krótki sposób ustalaniaEDX
0. To rzeczywiście podpisze-rozciąga wartość wEAX
celuEDX:EAX
, który jest coDIV
wykorzystuje jako dywidendy. W rzeczywistości nie potrzebujemy tutaj rozszerzenia znaku, ponieważ wartość wejściowa jest bez znaku, aleCDQ
wynosi 1 bajt, w przeciwieństwieXOR
do kasowaniaEDX
, czyli 2 bajty.DIV
ideEDX:EAX
przezESI
(10).EDX
) jest dodawana do akumulatora (ECX
).EAX
Rejestr (iloraz) jest testowany, aby sprawdzić, czy jest równa 0. Jeśli tak, zrobiliśmy to przez wszystkie cyfry i upadamy wskroś. Jeśli nie, nadal mamy więcej cyfr do podsumowania, więc wracamy na początek pętli.Wreszcie po zakończeniu pętli implementujemy
number % ((sum_of_digits)*2)
:LEA
Instrukcja służy jako krótki sposób pomnożyćECX
przez 2 (lub równoważnie dodaćECX
do siebie) i zapisać wynik w innym rejestrze (w tym przypadkuEAX
).(Moglibyśmy także zrobić
add ecx, ecx
+xchg ecx, eax
; oba mają 3 bajty, aleLEA
instrukcja jest szybsza i bardziej typowa).CDQ
raz, aby przygotować się do podziału. PonieważEAX
będzie dodatni (tj. Niepodpisany), spowoduje to zerowanieEDX
, tak jak poprzednio.EDX:EAX
przez wartość wejściową (w której znajduje się niezaburzona kopiaEDI
). Jest to równoważne modulo, z resztą wEDX
. (Podany jest również ilorazEAX
, ale nie jest nam potrzebny.)XCHG
(wymieniamy) zawartośćEAX
iEDX
. Normalnie zrobiłbyśMOV
tutaj, aleXCHG
ma on tylko 1 bajt (choć wolniej). PonieważEDX
zawiera resztę po dzieleniu, będzie wynosić 0, jeśli w przeciwnym razie wartość będzie podzielna równo lub niezerowa. Kiedy więcRET
urnujemy,EAX
(wynik) wynosi 0, jeśli wartość wejściowa była podzielna przez dwukrotność sumy jej cyfr, lub w przeciwnym razie niezerowa.Mam nadzieję, że to wystarczy do wyjaśnienia.
To nie jest najkrótszy wpis, ale hej, wygląda na to, że bije prawie wszystkie języki inne niż golf! :-)
źródło
Japt ,
74 bajtyPobiera dane wejściowe jako ciąg. Dane wyjściowe
0
dlatrue
lub liczba większa niż0
dlafalse
, które z innych rozwiązań wydają się prawidłowe. Jeśli nie, daj mi znać, a wycofam się.Sprawdź to
Wyjaśnienie
Domniemane wprowadzanie ciągu
U
."390"
Powtórz
U
dwa razy."390390"
Podziel na tablicę pojedynczych znaków.
["3","9","0","3","9","0"]
Zmniejsz przez zsumowanie, automatycznie rzucając każdą postać na liczbę całkowitą w tym procesie.
24
Uzyskaj resztę dzielenia
U
przez wynik, również automatycznie rzutującU
na liczbę całkowitą w tym procesie. Niejawnie wyprowadza wynikową liczbę całkowitą.6 (=false)
źródło
C89,
5553 bajtów(Dzięki Steadybox!
Wymaga pojedynczego wejścia
x
, które jest wartością do przetestowania. Zwraca 0, jeślix
jest równomiernie podzielne przez dwukrotność sumy jego cyfr, lub w przeciwnym razie niezerowe.Wypróbuj online!
Nie golfowany:
Jak widać, wykorzystuje to zasady niejawne int C89. Zmienne globalne
s
it
są domyślnie zadeklarowane jakoint
s. (Są również domyślnie inicjowane na 0, ponieważ są globalne, ale nie możemy z tego skorzystać, jeśli chcemy, aby funkcja była wielokrotna).Podobnie, funkcja
f
przyjmuje pojedynczy parametr,x,
który jest domyślnie anint
i zwraca anint
.Kod wewnątrz funkcji jest dość prosty, chociaż
for
pętla będzie wyglądać okropnie dziwnie, jeśli nie znasz składni. Zasadniczofor
nagłówek pętli w C zawiera trzy części:W sekcji „inicjalizacja” zainicjalizowaliśmy nasze zmienne globalne. Uruchomi się to raz, przed wejściem w pętlę.
W sekcji „Warunek pętli” określiliśmy, w jakim stanie pętla powinna być kontynuowana. To powinno być oczywiste.
W sekcji „przyrost” umieściliśmy w zasadzie dowolny kod, ponieważ będzie on uruchamiany na końcu każdej pętli.
Większym celem pętli jest iterowanie każdej cyfry wartości wejściowej, dodając je do
s
. W końcu, po zakończeniu pętli,s
jest podwojony i pobierany modulo,x
aby sprawdzić, czy jest on równo podzielny. (Lepsze, bardziej szczegółowe wyjaśnienie logiki tutaj można znaleźć w mojej drugiej odpowiedzi , na której ta jest oparta).Wersja czytelna dla człowieka:
źródło
t
zamiastt>0
warunku pętli .Brachylog , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 ,
3432 bajty-2 bajty dzięki @Rod
Wypróbuj online!
źródło
<1
.Mathematica, 26 bajtów
Nie ma pojęcia, dlaczego
∣
ma wyższy priorytet niż mnożenie ...źródło
PHP , 41 bajtów
wypisuje zero, jeśli jest podzielna, dodatnia liczba całkowita w przeciwnym razie.
Wypróbuj online!
źródło
$a=10
$argn
jest dostępny z-F
(w tym przypadku) lub z-R
opcją-F
. Ale to nie znajduje odzwierciedlenia w twoim TIO (czy obsługuje echo ze STDIN?).-F
opcji zamiast-R
php.net/manual/en/features.commandline.options.php Jeśli znalazłeś lepszy sposób na zrobienie tego samego in tio jak w commnd linia daj mi znaćExcel, 63 bajty
Sumowanie cyfr jest długim fragmentem.
źródło
Perl 6 , 19 bajtów
Wypróbuj online!
źródło
Łuska ,
98 bajtówDzięki Leo za oszczędność 1 bajtu.
Wypróbuj online!
Wyjaśnienie
źródło
Haskell ,
383742 bajtówDzięki Zgarb za grę w golfa z 1 bajtu
Wypróbuj online!
Pobiera dane wejściowe jako ciąg; zwraca 0, jeśli w przeciwnym razie jest podzielna, a niezerowa.
źródło
(:[])
może byćpure
.Python 3, 35 bajtów
źródło
=
i po)
inint(c)
. Ponadto, ponieważsum
można wziąć generator za argument, możesz usunąć jego[..]
wnętrze. Jeśli masz dodatkowe pytania, wyślij mi ping.int(c)for c in a
może być równieżmap(int,a)
, aby zaoszczędzić kilka bajtów.lambda a:not a%(sum(map(int,str(a)))*2)
TI-BASIC,
272621 bajtów-5 dzięki @Oki
Utrudnia to fakt, że w TI-BASIC nie ma zwięzłego sposobu sumowania cyfr całkowitych . Powraca
0
doTrue
i inny numer doFalse
.Wyjaśnienie:
źródło
10^-randIntNoRep(1,1+int(log(Ans
robi to samo, coseq(10^(~A-1),A,0,log(Ans
w mniejszej liczbie bajtów, ponieważ kolejność nie ma znaczenia (przy założeniu, że wersja 2.55MP)Braingolf ,
1312 bajtówWypróbuj online!
Wyjście 0 dla prawdy, każda inna liczba dla falsey.
Wyjaśnienie
źródło
Japt , 7 bajtów
Zwraca
1
zatrue
,0
dlafalse
Wypróbuj online!
Wyjaśnienie
źródło
Haskell , 49 bajtów
Stosowanie
Wypróbuj online!
źródło
Java , 66 bajtów
-1 bajt dzięki Olivier
Nie golf i wyjaśnienia:
źródło
int
zamiast,byte
aby zapisać ... bajt.a%i*2
to parsowane,(a%i)*2
ponieważ moduł i mnożenie mają tę samą kolejność.J, 15 bajtów
0 oznacza prawdę, niezerowa oznacza fałsz.
Wyjaśnienie
źródło
@
lub[:
!|~2*1#.,.&.":
dla 13 bajtów.Ohm , 5 bajtów
Wypróbuj online!
źródło
tcl, 45
próbny
źródło
0==
z1>
.Haskell ,
3534 bajtówWypróbuj online!
Zwraca „0” w prawdziwym przypadku, reszta w przeciwnym razie.
Haskell , edycja pointfree autorstwa nich, 34 bajty
Wypróbuj online!
źródło
mod<*>(2*).sum.map(read.pure).show
PHP, 44 bajty
Uruchom tak:
Wyjaśnienie
Iteruje nad cyframi, aby obliczyć sumę, a następnie wysyła modulo jak większość odpowiedzi.
źródło
Java (OpenJDK 8) ,
5553 bajtówWypróbuj online!
0
Zwracana wartość oznacza prawda, wszystko inne oznacza fałsz.Ponieważ mój komentarz w odpowiedzi Okxa nie zafalował, usunąłem go i opublikowałem, ponieważ w tej odpowiedzi grałem jeszcze trochę.
Dalsza gra w golfa dzięki @KrzysztofCichocki i @Laikoni, którzy słusznie pokazali mi, że nie muszę odpowiadać na wartość prawda / fałsz, ale jakąkolwiek wartość, o ile opisuję wynik.
źródło
true
.Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true/false case, and their complement the other values.
.Mini-Flak,
296292 bajtówWypróbuj online!
Link do TIO ma ode mnie więcej komentarzy, więc jest częściowo łatwiejszy do odczytania.
Truthy / Falsey: Prawda (podzielna), jeśli druga liczba jest równa trzeciej, fałsz w przeciwnym razie. Tak więc zarówno zbiór prawdy, jak i fałszu są nieskończone, ale przypuszczam, że należy na to pozwolić. +10 bajtów, jeśli tak nie jest.
Uwaga: Wstawianie / końcowe znaki nowej linii / białe znaki są niedozwolone.
źródło