Test podzielności


39

Zadanie

Biorąc pod uwagę dwie ściśle dodatnie liczby całkowite n i d jako dane wejściowe, określ, czy n jest równomiernie podzielne przez d , tj. Czy istnieje taka liczba całkowita q , że n = qd.

Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i dostarczania danych wyjściowych.

Wynik powinien być wartością prawdomówną lub fałszem ; prawda, jeśli n jest podzielne przez d , a fałsz w przeciwnym razie.

Twój kod musi obsługiwać tylko liczby całkowite, które może reprezentować w sposób natywny, o ile działa dla wszystkich liczb całkowitych ze znakiem 8-bitowych. Jednak Twój algorytm musi działać dla dowolnie dużych liczb całkowitych.

Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.

To jest , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .

Przypadki testowe

 n,  d    output

 1,  1    truthy
 2,  1    truthy
 6,  3    truthy
17, 17    truthy
22,  2    truthy
 1,  2    falsy
 2,  3    falsy
 2,  4    falsy
 3,  9    falsy
15, 16    falsy

Tabela liderów

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

## Perl, 43 + 3 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Ta rozmowa została przeniesiona do czatu .
Dennis

Odpowiedzi:



29

Brain-Flak , 72 70 64 62 58 46 bajtów

{({}[()]{(<()>)}{}<({}[()]<({}())>)>)}{}{{}}{}

Bierze dywidendę i dzielnik (w tej kolejności) jako dane wejściowe i drukuje dzielnik (prawda) lub nic. Ponieważ każdy stos ma niejawną, nieskończoną liczbę zer, puste dane wyjściowe należy uznać za fałsz.

Rozwiązanie to, choć nie wymaga czyszczenia stosu, wykorzystuje tylko jeden stos.

Wypróbuj online!

Dzięki @WheatWizard za grę w golfa z 2 bajtów!

Jak to działa

                INPUT: a (dividend), b (divisor)
                INITIAL STACK: n = a, d = b, r = 0
                               An infinite amount of zeroes follows.

{               While n is non-zero:
  (
    {}              Pop n from the stack.
    [()]            Yield -1.
    {               While the top of the stack (initially, d) is non-zero:
      (<()>)          Push 0.
    }
    {}              Pop 0. This will remove d from the stack if d = 0, leaving r
                    on top. We can think of this as performing the assignment
                    (d, r) = (r, d) if d = 0.
    <
      (
        {}              Pop d.
        [()]            Yield -1.
        <
          (
            {}              Pop r.
            ()              Yield 1.
          )               Push r + 1.
        >               Yield 0.
      )               Push d + (-1) + 0 = d - 1.
    >               Yield 0.
  )               Push n + (-1) + 0 + 0 + 0 = n - 1.
}               Each iteration decrements n, swaps d and r if d = 0, decrements d,
                and increments r.
                FINAL VALUES: n = 0
                              d = b - r
                              r = a % b if a % b > 0 else b
{}              Pop n.
{               While the top of the stack is non-zero:
  {}              Pop it.
}               This pops d and r if d > 0 (and, thus, a % b > 0) or noting at all.
{}              Pop d or a 0, leaving r if r = b and, thus, a % b = 0.

Obliczanie modułu, 42 bajty

Powyższy pełny program można zmodyfikować w trywialny sposób, aby zamiast tego obliczyć moduł.

{({}[()]<({}[()]<({}())>)>{(<()>)}{})}{}{}

Tak jak poprzednio, ta metoda nie jest czyszczona przy stosach, ale używa tylko jednego stosu. Moduł 0 pozostawi stos pusty, co z grubsza odpowiada pozostawieniu 0 ; każdy stos zawiera nieskończone zera.

Wypróbuj online!

Jak to działa

Porównaj dwie pętle testera podzielności i kalkulatora modułu.

{({}[()]{(<()>)}{}<({}[()]<({}())>)>)}
{({}[()]<({}[()]<({}())>)>{(<()>)}{})}

Jedyną różnicą jest to położenie {(<()>)}{}, które swapy d i r , gdy d = 0 . Aby obliczyć moduł, wykonujemy tę zamianę po zmniejszeniu d i zwiększeniu r .

Ta zmiana nie wpływa na wynik, jeśli % b> 0 , ale jeśli % b = 0 , pozostawia (n, d, r) = (0, b, 0) - zamiast (n, d, r) = (0, 0, b) - na stosie.

W ten sposób, w celu uzyskania modułu, mamy tylko pop n i d z {}{}.

Obliczanie modułu czyszczenia stosu, 64 bajty

42-bajtowy algorytm modułu nie jest czyszczony na stosie, więc nie można go używać tak jak we wszystkich programach. Następująca wersja wyrzuca dywidendę i dzielnik (w tej kolejności) z aktywnego stosu i wypycha moduł w zamian. Nie ma innych skutków ubocznych.

({}(<()>)){({}[()]<(({}()[({})])){{}(<({}({}))>)}{}>)}({}{}<{}>)

To rozwiązanie jest w dużej mierze oparte na poprzednim 72-bajtowym rekordzie @ WheatWizard, ale oszczędza 6 bajtów, nigdy nie zmieniając stosów.

Wypróbuj online!

Jak to działa

             INPUT: a (dividend), b (divisor)
             INITIAL STACK: n = a, b

(
  {}         Pop and yield n = a.
  (<()>)       Push d = 0.
)              Push n + 0 = n.
             STACK: n, d = 0, b
{(           While n in non-zero:
  {}           Pop and yield n.
  [()]         Yield -1.
  <
   ((
     {}         Pop and yield d.
     ()         Yield 1.
     [({})]     Pop b, push it back on the stack, and yield -b.
   ))         Push d + 1 + -b = d + 1 - b twice.
   {          While/if d + 1 - b is non-zero, i.e., if d < b - 1
     {}         Pop d + 1 - b (second copy).
     (<(
       {}         Pop d + 1 - b (first copy).
       ({})       Pop b and push it back on the stack.
     )>)        Push d + 1 - b + b = d + 1, then 0.
   }          If the loop wasn't skipped entirely, pushing 0 breaks out.
              If d < b - 1, it essentially performs the assignment d = d + 1.
              However, if d = b - 1, we get d = d + 1 - b = b - 1 + 1 - b = 0.
              In all cases, we wind up with d = (d + 1) % b.
   {}         Pop 0.
  >         Yield 0.
)}        Push n + -1 + 0 = n - 1. Break if n - 1 = 0.
          STACK: n = 0, d = a % b, b
(
  {}        Pop and yield n = 0.
  {}        Pop and d = a % b.
  <{}>      Pop b, but yield 0.
)         Push 0 + a % b + 0 = a % b.

20

kod maszynowy x86_32, 8 bajtów

08048550 <div7>:
 8048550:   99                      cdq   
 8048551:   f7 f9                   idiv   %ecx
 8048553:   85 d2                   test   %edx,%edx
 8048555:   0f 94 c0                sete   %al

To jest moja pierwsza odpowiedź na golfa, więc mam nadzieję, że przestrzegam wszystkich zasad.

Najpierw wywołuje cdq, aby wyczyścić rejestr edx, a następnie wykonuje podpisany podział na rejestrze ecx, który przechowuje resztę w edx. Testowa linia edx, edx ustawi flagę zerową, jeśli edx wynosi zero, a sete ustawia 0 na fałsz, jeśli edx nie był równy zero, i ustawia 1 na true, jeśli edx miał wartość 0.

Jest to tylko fragment kodu, który przyczynia się do liczenia bajtów, ale do testowania oto kod C, który napisałem z zestawem wbudowanym, ponieważ w ten sposób łatwiej jest obsługiwać operacje we / wy.


2
Witamy w PPCG, fajna pierwsza odpowiedź!
Leaky Nun

Czy to musi być pełny program? Sformatowałem swoją odpowiedź na podstawie tej odpowiedzi . I dziękuję! Mam nadzieję, że będę lepszy w asemblerze / kodzie maszynowym, aby uzyskać więcej kodów golfowych!
davey,

1
Wejścia i wyjścia w określonych rejestrach w zestawie są domyślnie dozwolone: wejście , wyjście . Jest to całkowicie akceptowalne zgłoszenie. Witamy w PPCG!
Mego

Fantastyczny! Dziękuję Ci!
davey,

17

Sześciokąt, 15, 13, 12 10 bajtów

Ulubiony język oparty na sześciokącie! :RE

TL; DR działa przy użyciu magicznych, niesformatowanych rozwiązań zmniejszających liczbę bajtów:

?{?..>1'%<.@!'/
?{?!1\.'%<@.>
?{?\!1@'%\!(
?{?!1\@'%<

Zaoszczędzono 2 bajty dzięki kreacji układu @ MartinEnder.

@FryAmTheEggman oszczędził 1 bajt, wykorzystując narożniki w bardziej kreatywny sposób

Zarówno @MartinEnder, jak i @FryAmTheEggman opracowały 10-bajtowe rozwiązanie, które nie drukuje niczego dla fałszywych wartości.

Moje rozwiązanie (15):

Niesformatowany:

?{?..>1'%<.@!'/

Sformatowany:

  ? { ?
 . . > 1
' % < . @
 ! ' / .
  . . .

@Martin Ender's Solution (13):

Niesformatowany:

?{?!1\.'%<@.>

Sformatowany:

  ? { ?
 ! 1 \ .
' % < @ .
 > . . .
  . . .

Wyjaśnienie:

Najpierw otrzymujemy dane wejściowe i bierzemy moduł.

  ? { ?
 . . . .
' % . . .
 . . . .
  . . .

Następnie sprawdza, czy moduł wynosi 0, czy nie. Jeśli tak, IP obraca się o 60 stopni w lewo, odbija się od lustra, ustawia komórkę na 1 i drukuje.

Następnie adres IP przechodzi do czwartego rzędu. Kiedy osiągnie >, skręca w prawo (ponieważ wartość komórki wynosi teraz 1). Przechodzi i wraca w prawym dolnym rogu pod nagłówkiem NW. Adres IP uderza w <, przechodzi wzdłuż górnego rzędu i wraca w prawym rogu, aby trafić @, zatrzymując program.

  . . .
 ! 1 \ .
. . < @ .
 > . . .
  . . .

Jeśli moduł okaże się dodatni, IP skręca o 60 stopni w prawo. Po wyjściu z prawego dolnego rogu, kontynuuje na lewym dolnym brzegu ze względu na zasady owijania Sześciokąta. 'Jest wykorzystywany, aby IP przejdź do celi z 0 w nim. Następnie IP przemieszcza się wzdłuż czwartego rzędu, owija się do drugiego, uderza w druk i zostaje odbity na <. Reszta ścieżki do @tego samego jest taka sama.

  . . .
 ! . \ .
' . < @ .
 > . . .
  . . .

To poważna magia.

@ FryAmTheEggman's Solution (12):

Niesformatowany:

?{?\!1@'%\!(

Sformatowany:

  ? { ?
 \ ! 1 @
' % \ ! (
 . . . .
  . . .

Wyjaśnienie:

Podobnie jak inne rozwiązania, pobiera dane wejściowe i przyjmuje moduł.

  ? { ?
 . . . .
' % . . .
 . . . .
  . . .

Następnie adres IP jest odchylany w dolnym rogu. Jeśli moduł jest dodatni, idzie na lewą górną krawędź. Nie ?ma już danych wejściowych, więc ustawia komórkę na 0. !Następnie wypisuje 0 i @kończy działanie programu.

  ? . .
 \ ! . @
. . \ . .
 . . . .
  . . .

Sprawa jest znacznie trudniejsza, gdy moduł wynosi 0. Po pierwsze, zmniejsza się, następnie resetuje do 0, następnie ustawia na 1, a następnie drukuje. Następnie wartość 1 jest zmniejszana do 0. Następnie program działa tak jak na początku, dopóki nie spróbuje 0%0. To sprawia, że ​​rzuca cichy błąd i kończy pracę.

  ? { ?
 . . 1 .
' % \ ! (
 . . . .
  . . .

Naprawdę chciałbym cichej błędu podstęp, ale prostszy sposób będzie zastąpić (w /taki sposób, że przechodzi przez IP po raz pierwszy, ale pobiera odzwierciedlone w @drugim.

Rozwiązanie oparte na współpracy (10):

Niesformatowany:

?{?!1\@'%<

Sformatowany:

  ? { ?
 ! 1 \ @
' % < . .
 . . . .
  . . .

Ten program zaczyna się tak samo, jak wszystkie inne programy, uzyskując dane wejściowe i modyfikując je.

Jeśli wejście ma wartość 0, adres IP skręca w lewo, gdy uderza <. Zostaje odchylony na 1!@, co drukuje 1 i kończy pracę.

  . . .
 ! 1 \ @
. . < . .
 . . . .
  . . .

Jeśli sygnał wejściowy jest dodatni, adres IP skręca w prawo po trafieniu <. Wychodzi przez narożnik i biegnie wzdłuż prawej górnej krawędzi, uderzając w @ bez drukowania.

  . . ?
 . . . @
. . < . .
 . . . .
  . . .

6
Myślę, że powinieneś sformatować swoją odpowiedź inaczej. Posiadanie czterech odpowiedzi w jednym bloku kodu sprawia, że ​​liczba bajtów jest nieprawidłowa.
mbomb007

17

Płat mózgowy 102, 98, 96 bajtów

(({}<>))<>{({}[()])<>(({}[()])){{}(<({}[({})])>)}{}({}({}))<>}{}<>([{}]{}){<>(([()])())}({}{}())

Eww. Obrzydliwy. Mogę opublikować wyjaśnienie, ale sam ledwo je rozumiem. Ten język boli mój mózg.

Wypróbuj online!

Podziękowania dla użytkownika github @Wheatwizard za wymyślenie przykładu modułu. Prawdopodobnie sam tego nie wymyśliłem!

Krótsza odpowiedź jest tutaj .

Prawdopodobnie nieprawidłowe wyjaśnienie:

(({}<>))                    #Push this element onto the other stack
<>                          #Move back to stack one.
{                           #While the top element is non-zero:
 ({}[()])                   #  Decrement the number on top
 <>                         #  Move to the other stack
 (({}[()]))                 #  Push the top element minus one twice
 {                          #  While the top element is non-zero:
  {}                        #    Pop the top element
  (<          >)            #    Push a zero
        ({})                #    Push the second from top element
       [    ]               #    Evalue this second from top element as negative
    ({}      )              #    And push that negative plus the top element
 }
 {}                         #  Pop the top element
 ({}({}))                   #  Push the top element plus the second from the top, AND push the second from top
 <>                         #  Switch stacks
}

{}                          #Pop the stack
<>                          #Switch to the other stack
([{}]{})                    #And push the top element minus the second element.

Reszta jest dość prosta.

{              }            #While the top element is non-zero:
 <>                         #Move to the other stack
   (([()])  )               #Push a negative one
          ()                #AND push the previously pushed value + 1 (e.g. 0)

                 (      )   #Push:
                  {}{}      #The top two elements added together
                      ()    #Plus one

The rest is pretty straightforward.Tak, wydaje się, że tak.
Erik the Outgolfer,

24 bajty, jeśli liczysz każdą instrukcję ataku mózgu jako bajt.
noɥʇʎԀʎzɐɹƆ

12

JavaScript (ES6) 17 12 11 bajtów

a=>b=>a%b<1
  • EDYCJA: Usunięto 5 bajtów, ponieważ spodziewane jest „a> 0”.
  • EDYCJA 2: Usunięto 1 bajt dzięki Downgoat .

Użyj curry, aby zapisać jeden bajt: a => b =>
Downgoat

Jak to zrobić? Kiedy próbuję d=a=>b=>a%b<1śledzić d(32,2)w konsoli JS ... Po prostu otrzymuję odpowiedźfunction b=>a%b<1
WallyWest

@WallyWest używa curry, więc wpisujesz d(32)(2). Ponieważ d(32)daje function b=>a%b<1, musisz wywołać tę funkcję ze swoją bwartością
Cyoce

9

Vim, 11 naciśnięć klawiszy

C<C-r>=<C-r>"<C-Left>%<C-Right><1<cr>

Nieźle jak na język, który obsługuje tylko ciągi znaków. :RE


Co ma <C-Left>zrobić? Nie można go przetestować, ponieważ przełącza okna na komputerze Mac> _>
Downgoat

1
@Downgoat używasz Ctrl lub Command? Tak czy inaczej, jest to odpowiednik „b”, z tym wyjątkiem, że działa również w trybie wstawiania.
DJMcMayhem

Mówiąc pedantycznie, jest to odpowiednik Bzamiast b(a Ctrl+ Rightto odpowiednik W) - różnica polega na znakach innych niż słowa, ale w tym przypadku robi dokładnie to samo :) vimdoc.sourceforge.net/htmldoc/motion. html # <C-Left >
Christian Rondeau

9

Mathematica - 17 13 3 bajtów

Dzięki @MartinEnder za oszczędność tony bajtów!


Co to za postać?
Cyoce,

@Cyoce Nie znam jego kodu Unicode (w tej chwili na telefonie), ale jest to krótki operator Divisible[].
Yytsi

@Cyoce Myślę, że to symbol potoku, znany również jako shift + ukośnik odwrotny.
Pavel

@Pavel, jeśli byłby to symbol potoku, nie byłyby to trzy bajty.
Cyoce,


8

Siatkówka, 12 bajtów

^(1+)\1* \1$

Pobiera wejście rozdzielone spacją jako jednoargumentowe, na przykład 111111111111 1111sprawdza, czy 12, jeśli dzieli się przez 4 . Drukuje 1 (prawda) lub 0 (fałsz).

Wypróbuj online!

FryAmTheEggman zapisał dwa bajty. Ups, przepisałem moją odpowiedź, aby uporządkować argumenty we właściwej kolejności. (Potem Fry pobił mnie do tego w komentarzach. Jestem powolny w wyrażeniach regularnych!)


Aby naprawić zamówienie, jeśli stanie się to konieczne, myślę, że ^(1+)\1* \1$zadziała.
FryAmTheEggman

Wydaje mi się, że z nową specyfikacją kolejna kolejność wprowadzania jest znowu w porządku.
Martin Ender

8

Partia, 20 bajtów

@cmd/cset/a!(%1%%%2)

Wyniki 1w przypadku sukcesu, 0niepowodzenia.


8

C #, 27 13 12 bajtów

a=>b=>a%b<1;

Dzięki TuukkaX za wskazanie anonimowych lambd są dopuszczalne. Dzięki Davidowi Conradowi za nakłonienie mnie do curry, którego nawet nie zdawałem sobie sprawy, było czymś.

Krótko i słodko, ponieważ mamy do czynienia tylko z liczbami całkowitymi, których możemy użyć, <1a nie ==0uratować cały bajt.


Nie jestem pewien, ale myślę, że można po prostu użyć lambda: (a,b)=>a%b<1;. +1.
Yytsi

@TuukkaX, dzięki, nie byłem pewien, po prostu wydaje się tak oszukiwany.
JustinM - Przywróć Monikę

Wersja JS tego curry używała curry, aby zmniejszyć go o jeden bajt, i to też powinno działać dla C #: a=>b=>a%b<1;(uwaga: wtedy musisz to nazwać f(a)(b)raczej niż f(a,b))
David Conrad

1
@DavidConrad oo to fajnie, dziękuję.
JustinM - Przywróć Monikę

7

pieprzenie mózgu, 53 bajty

Pobiera dane wejściowe jako bajty, dane wyjściowe są wartością bajtów 0x00lub 0x01. Jest to algorytm DivMod, po którym następuje logiczna negacja .

,>,<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>,>[<+>,]+<[>-<-]>.

Wypróbuj online - ma kilka dodatkowych+pod koniec, dzięki czemu możesz zobaczyć dane wyjściowe w ASCII.


Czy możesz usunąć część „div”, aby zaoszczędzić bajty?
Leaky Nun

1
@LeakyNun Jest to najkrótszy znany algorytm, który daje moduł. Usunięcie jego części faktycznie wydłuża ją, ponieważ potrzebujesz więcej komórek tymczasowych. Nie można znaleźć modułu bez podziału.
mbomb007

Rozumiem dzięki.
Leaky Nun

@LeakyNun Wystarczy spojrzeć na długość algorytmu Division .
mbomb007

Prawdopodobnie są one krótsze, ale jeśli tak, nikt ich nie znalazł ani nie opublikował.
mbomb007

7

Brain-Flak , 88 86 bajtów

(<({}<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}<>(({}<{}>)){{}{}(<(())>)}{}

To jest gęstsza wersja oryginalnego algorytmu testu podzielności Brain-Flaka napisanego przez Dr Green Eggs i Iron Man DJMcMayhem i mnie.

Oto krótkie (ish) wyjaśnienie, jak to działa:

  ({}<>)        #Move the top of the stack to the other stack #Start Mod
(<      >)      #Push zero
<>              #Switch stacks
{               #While the top of the stack is not zero
 ({}[()])       #Subtract one from the top of the stack
 <>             #Switch stacks
   {}()         #Pop the top, add one and ...
       [({})]   #Subtract the second element on the stack
 ((          )) #Push twice
 {              #If the top is not zero
  {}            #Pop the duplicate
    ({}({}))    #Add the second element to the first
  (<        >)  #Push zero
 }              #End if
 {}             #Pop the zero
 <>             #Switch back
}               #End While
<>              #Switch to the other stack
 ({}<{}>)       #Remove the second value on the stack         #End Mod
(        )      #Duplicate the result of modulation
{               #If the top is not zero
 {}{}           #Pop the top two elements
 (<(())>)       #Push a one and a zero
}               #End if
{}              #Pop the zero

Wypróbuj online!


Link do tłumacza online?
Leaky Nun

Dobra robota! Witamy również na stronie! Mam nadzieję, że dobrze się tutaj bawisz. (Z pewnością mam)
DJMcMayhem

Ładna pierwsza odpowiedź, witamy w PPCG!
Leaky Nun


6

C, 60 bajtów

#include <stdio.h>
main(){int a,b;scanf("%d %d",&a,&b);a%b==0;}

1
Dlaczego -1? Wyjaśnij mi
Ronronner,

3
Możliwe, że nikt nie zlekceważył. To krótka odpowiedź, więc została automatycznie oflagowana jako niskiej jakości, a potem ją edytowałeś. Z jakiegoś powodu powoduje to automatyczne głosowanie w dół . Przepraszam za to. +1ode mnie. Ponadto zezwalamy na funkcje, dzięki czemu można łatwo to skrócić int f(a,b){return !(a%b);}lub nawet skrócić.
DJMcMayhem

3
Nie, chodzi mi o to, że nie musi to być pełny program. Zamiast tego możesz przesłać tylko funkcję. int f(a,b){return!(a%b);}ma 25 bajtów, a jeśli użyjesz odpowiedniego kompilatora, możesz nawet zrobić f(a,b){return!(a%b);}21 bajtów.
DJMcMayhem

3
Jeszcze krótsze przesłanie funkcji: #define f(a,b)!(a%b)( link ideone )
Mego

2
Musisz zdefiniować funkcję lub program, a nie tylko fragment kodu.
Leaky Nun


5

R, 22 20 bajtów

a=scan();!a[1]%%a[2]

Jak zwykle odczytuje dwie liczby z wejścia zakończonego pustą linią.

Aktualizacja: dzięki Jarko Dubbeldamowi za zgolenie 2 bajtów (pomimo faktu, że jego edycja została odrzucona, była bardzo pomocna!).


5

Java 8, 11 bajtów

a->b->a%b<1

Co do cholery, istnieją wersje JS i C #, dlaczego też nie wersja Java?

Stosowanie:

import java.util.function.Function;

public class Program {
    public static void main(String[] args) {
        System.out.printf("%d, %d %b%n", 9, 3, divides(9, 3, a->b->a%b<1));
        System.out.printf("%d, %d %b%n", 3, 9, divides(3, 9, a->b->a%b<1));
    }

    public static boolean divides(int a, int b,
            Function<Integer, Function<Integer, Boolean>> f) {
        return f.apply(a).apply(b);
    }
}

a->b->a%b<1To powoduje błąd składniowy, prawda?
dorukayhan chce odzyskać Monikę

2
Nie, to jest ważna Java 8.
David Conrad,

Czasami nawet Java wygląda jak Perl ...
Mega Man

Tak, dodałbym, że to tylko Java 8;).
Magic Octopus Urn

tak więc w Javie 8 musimy liczyć tylko bajty wyrażenia lambda, a nie całą klasę i funkcję - podstawa!
Sikorski

4

Python, 16 bajtów

lambda D,d:D%d<1

1
Zauważ, że to nie zadziałałoby, gdyby dozwolone były ujemne liczby całkowite. Na szczęście dane wejściowe są ściśle pozytywne.
TLW

Zrobiłem to lambda a,b:1.*a/b==a/b, ale byłem pod wrażeniem. To bardzo skomplikowany fragment kodu ...
Erik the Outgolfer


4

CJam, 6 4 bajtów

Zaoszczędzono 2 bajty dzięki Dennisowi

q~%!

Wypróbuj online

q    e# Take in the input
 ~   e# Dump the individual values to the stack
  %  e# Modulus
   ! e# Boolean NOT



3

Fortran 95, 78 bajtów

function f(i,j)result(k)
integer::i,j,k
k=merge(1,0,MOD(i,j)<1)
end function f

3

MarioLANG, 121 109 107 bajtów

Zaoszczędzono 14 bajtów dzięki Martinowi Enderowi

;>(-)-)+(([!)
)"=========#[
; +(![-)< )<!+
  ==#==="  "#:
>!< >(+ !![(<
=#"="===##=:"
  !      <
  #======"

Wypróbuj online!

Wyjaśnienie

Algorytm polega po prostu na odejmowaniu dod, naby sprawdzić, czy można to zrobić liczbę całkowitą razy i nie pozostawiać żadnych.

;
)
;

>
=
 
 

Najpierw gromadzone są dane wejściowe. njest w pierwszej komórce, dw drugiej.

 >(-)-)+(([!
 "=========#
          )<
           "
 !
 #"="===##=
  
  

Jest to zasadniczo główna pętla. Zmniejsza pierwszą i drugą komórkę i zwiększa trzecią.

           [!)
           =#[
             !+
             #:
            (<
            :"
 
 

To jest końcowy wynik. Jeśli po zwiększeniu / zmniejszeniu pierwsza komórka ma wartość 0, to wyeliminowaliśmy n. Jeśli po tym, druga komórka ( d) jest 0, to dposzła nrównomiernie. Zwiększamy i drukujemy ( 1). W przeciwnym razie przejdź z powrotem do pierwszej komórki (która jest 0) i wydrukuj ją.

 
 
  +(![-)<  
  ==#==="  
 !< >(+ !![
 #"="===##=
  !      <
  #======"

Ta pętla ma miejsce, jeśli druga komórka jest 0po inkrementacji i dekrementacji. Kopiuje trzecią komórkę do drugiej komórki. Część na dole ma obejść pętlę, jeśli komórka nie jest 0.


3

Tcl, 34 bajty

ge stdin a
ge stdin b
exp $a%$b<1

Moja pierwsza / * udana * / próba w codegolf! Ten kod musi być wykonany w powłoce Tcl, w przeciwnym razie nie będzie działał.

Jeden bajt dzięki @Lynn.

Cztery bajty dzięki @Lynn i @LeakyNun (teraz rozumiem, co miał na myśli)!


Czy możesz to pominąć ?1:0?
Leaky Nun

@LeakyNun to operacja trójskładnikowa. masz na myśli po prostu zwrócić coś, gdy jest to podzielne?

Co by $a%$b==0powrócił?
Leaky Nun

1
To znaczy, czy twoja trzecia linia może być po prostu exp $a%$b==0?
Leaky Nun

1
A exp $a%$b<1może?
Lynn,

3

PHP, 23 22 bajtów

<?=$argv[1]%$argv[2]<1

wypisuje 1 dla true, pusty łańcuch (= nic) dla false

zadzwonić z CLI z na djako argumenty


10 bajtów dla starożytnego PHP: <?=$n%$d<1


Jeśli nie przeszkadza PHP4.1: <?=!($A%$B). Wartości mogą być przekazywane jako część $_SESSION, $_COOKIE, $_POST, $_GETlub (jeśli się nie mylę) powyżej $_ENV.
Ismael Miguel

@ Ismael Miguel: Właściwie nie, ale mam dość publikowania starożytnych wersji PHP i dodawania for PHP<5.4 with register_globals=On. Ale dodam to w celach informacyjnych.
Tytus

W rzeczywistości nie możesz powiedzieć „ for PHP<5.4 with register_globals=On”, ponieważ musisz policzyć bajty php.inipliku zawierającego register_globals=On. Jednak PHP4.1 jest szczególnym przypadkiem. Jest to ostatnia wersja, w której register_globals=Onjest wartością domyślną, a większość funkcji jest dostępna od wersji PHP 4.1. Ta wersja umożliwia także korzystanie z innych funkcji, takich jak ostrzeżenia eregi splitbez nich.
Ismael Miguel

3

J, 3 bajty

0=|

Stosowanie:

2 (0=|) 10 

Powróci 1. I jest równoważne pseudokodowi10 MOD 2 EQ 0

Zauważ, że jest to bardzo podobne do odpowiedzi APL , ponieważ J jest mocno zainspirowany APL


Ładna pierwsza odpowiedź, witamy w PPCG!
Leaky Nun

@LeakyNun Dzięki, zawsze się rozglądałem, miło w końcu odpowiedzieć.
emiflake

3

PowerShell v2 +, 20 bajtów

!($args-join'%'|iex)

Pobiera dane wejściowe jako dwa argumenty wiersza poleceń $args, -joinłączy je razem w ciąg znaków %jako separator, potoki do iex(skrót Invoke-Expressioni podobne do eval). Wynik jest albo 0niezerowy, więc bierzemy wartość logiczną nie !tego wyniku, co oznacza albo $TRUEalbo $FALSE(niezerowe liczby całkowite w PowerShell są prawdziwe). To, że wartość logiczna jest pozostawiona w potoku, a dane wyjściowe są niejawne.

Alternatywne wersje, również po 20 bajtów

param($a,$b)!($a%$b)
!($args[0]%$args[1])

Ta sama koncepcja, tylko nieco inne sposoby strukturyzacji danych wejściowych. Dziękujemy @DarthTwon za ich dostarczenie.

Przykłady

PS C:\Tools\Scripts\golfing> .\divisibility-test.ps1 24 12
True

PS C:\Tools\Scripts\golfing> .\divisibility-test.ps1 24 13
False

PS C:\Tools\Scripts\golfing> .\divisibility-test.ps1 12 24
False

W obu pozostałych metodach próbowałem param($a,$b)!($a%$b)!($args[0]%$args[1])
zagrać w

@DarthTwon Rzeczywiście. W przypadku niewielkiej liczby operacji zwykle występują różnice co najwyżej o jeden lub dwa bajty w różnych sposobach przyjmowania argumentów wejściowych.
AdmBorkBork

Miałem nadzieję wymyślić coś krótszego: P, ale tak, zawsze istnieje wiele sposobów na skórowanie kota, szczególnie w PS.
ThePoShWolf

3

Haskell, 13 11 bajtów

((1>).).mod

To definiuje nową funkcję (!) :: Integral n => n -> n -> Bool. Od mod n mzwraca tylko dodatnie liczby jeśli ni msą pozytywne, możemy zapisać bajt stosując 1>zamiast 0==.

Stosowanie:

ghci> let n!d=1>mod n d
ghci> 100 ! 2
True
ghci> 100 ! 3
False

Można pójść pointfree i zaoszczędzić 2 bajty: ((1>).).mod.
nimi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.