Podział i reszta


36

Wyzwanie to, choć prawdopodobnie trywialne w większości „standardowych” języków, jest skierowane do tych języków, które są tak ezoteryczne, niskiego poziomu i / lub trudne w użyciu, które są bardzo rzadko spotykane na tej stronie. Powinien stanowić ciekawy problem do rozwiązania, więc jest to okazja, aby wypróbować ten dziwny język, o którym czytałeś!

Zadanie

Weź dwie liczby naturalne ai bjako dane wejściowe, i wyślij dwie inne liczby: wynik dzielenia liczb całkowitych a/bi pozostałą część takiego podziału ( a%b).

Oto : najkrótsza odpowiedź (w bajtach), dla każdego języka, wygrywa!

Wejście wyjście

  • 0 <= a<= 255, 1 <= b<= 255. Każde twoje wejście (i wyjście) zmieści się w jednym bajcie.
  • Możesz wybrać dowolny format dla wejścia i wyjścia, o ile dwie liczby są wyraźnie rozróżnialne (np. Brak drukowania dwóch wyników razem bez ogranicznika)

Przykłady

a,b->division,remainder
5,7->0,5
5,1->5,0
18,4->4,2
255,25->10,5

Uwaga: Wbudowane funkcje, które zwracają zarówno wynik podziału, jak i resztę, są zabronione . Przynajmniej pokaż nam, jak twój język radzi sobie z zastosowaniem dwóch funkcji do tych samych argumentów.

Uwaga 2: Jak zawsze wyjaśnienie, jak działa Twój kod, jest bardzo mile widziane, nawet jeśli wygląda na czytelne, może nie być tak dla kogoś innego!


Tabela liderów

Oto fragment kodu w celu wygenerowania przeglądu zwycięzców według języka.

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 poprawisz swój wynik, ty 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 to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnim liczbą w nagłówku:

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

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

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


Czy mogę odwrócić argumenty, tzn. Zamiast a bpodać b azamiast tego?
Erik the Outgolfer

@EriktheOutgolfer:You may choose any format you like for both input and output, as long as the two numbers are clearly distinguishable
Emigna

@Emigna Tak, nie byłem pewien, czy cofanie nie czyni ich jednak nierozróżnialnymi.
Erik the Outgolfer

@EriktheOutgolfer, jeśli wiesz, że trzeba je odwrócić, nie ma problemu z ich rozróżnieniem :)
Leo

Niestety algorytm BF nie działa, jeśli dzielnikiem jest 1.
mbomb007

Odpowiedzi:


23

BitCycle , 146 79 64 bajtów

Właśnie zdałem sobie sprawę, że cała sekcja mojego oryginalnego kodu była niepotrzebna. Ogromna redukcja!

v  <>!
A\B^^=
? D^>^<
 >\v^~ D@
 >/ C/
  > C ^
A/B v
^   <
?  D^

Program pobiera dane jednostkowe z wiersza poleceń, najpierw dzielnikiem. Wyprowadza iloraz i resztę w jedności, oddzielone przez 0. Na przykład, oto a=11, b=4, a/b=2, a%b=3:

C:\>python bitcycle.py divmod.btc 1111 11111111111
110111

Niegolfowany w akcji

Oto moja wersja ungolfed computing a=3, b=5z animacją włączony (przepraszam za glitchiness):

Divmod running in BitCycle

Próba wyjaśnienia

Wyjaśnienie dotyczy wersji bez golfa. Zanim to rozwiążesz , zdecydowanie polecam przeczytanie strony Esolangs, aby przekonać się, jak działa ten język.

Algorytm wygląda następująco:

  • Uruchom zewnętrzną pętlę, aż program zostanie zakończony.
    • Poprowadź wewnętrzną pętlę nad bitami dzielnika, łącząc je z bitami z dywidendy.
      • Jeśli wszystkie bity dzielnika mają pasujące bity dywidendy, wypisz jeden bit.
      • Jeśli nie wszystkie bity dzielnika mają pasujące bity dywidendy, wypisz separator, 0a następnie bity dywidendy, a następnie zakończ.

Sercem kodu są relacje między kolekcjonerami (wielkie litery). Ponieważ istnieje wiele osobne kolektory z każdej litery, niech odnoszą się do nich jako A1, A2, B1, B2, itd., W liczbie od góry do dołu.

  • A1i A2przytrzymaj odpowiednio dzielnik i dywidendę na początku głównej pętli.
  • Wewnętrzna pętla oddziela się po kawałku od dzielnika i dywidendy.
    • Reszta dzielnika, jeśli w ogóle, zawsze wchodzi B1.
    • Jeśli zarówno dzielnik, jak i dywidenda były niepuste, jeden bit wchodzi w C1jeden, a drugi w C3. Reszta dywidendy idzie na B2.
    • Jeśli tylko dzielnik nie był pusty, osiągnęliśmy koniec dywidendy, a nadszedł czas, aby wydrukować resztę. Wchodzi kawałek z dzielnika C2.
    • Gdyby tylko dywidenda nie była pusta, osiągnęliśmy koniec dzielnika; czas przetworzyć bity w C3lub C2na wyjście. Reszta dywidendy idzie na C4.
  • Jeśli w Bkolektorach są jakieś bity , cyklicznie przewijają zawartość doA kolektorów i kontynuują w wewnętrznej pętli.
  • Gdy wszystkie Ai Bkolektory są puste,C kolektory otwierają się i przechodzimy do etapu przetwarzania:
    • C1i C4zrzuć ich zawartość (odpowiednio dzielnik i pozostałą dywidendę) do D1iD3 .
    • Jeśli C2 jest pusty, nadal drukujemy iloraz.
      • Zawartość przycisku C3przejdź do prawego górnego =przełącznika. Pierwszy 1bit przechodzi bezpośrednio do !i jest wysyłany.
      • Kiedy 1bit przechodzi, aktywuje przełącznik w prawo, co powoduje wysłanie wszystkich kolejnych bitów z planszy.
    • Jeśli C2nie jest pusty, drukujemy resztę.
      • Pierwszy bit C2jest negowany do a 0i przechodzi przez przełącznik. 0Idzie dalej !i jest wyprowadzany.
      • Kiedy 0bit przechodzi, aktywuje przełącznik w lewo. Teraz wszystkie fragmenty C3przechodzą w lewo od przełącznika i są przekierowywane do !, generując całą resztę.
      • Kopia pierwszego bitu z C2jest również wysyłana do D2.
  • Teraz Dkolektory są otwarte.
    • Jeśli coś jest w D2środku, oznacza to, że wydrukowaliśmy resztę. Bit z D2trafia w @, co kończy program.
    • W przeciwnym razie zawartość D1i D3pętla wracają odpowiednio do A1i A2, a główna pętla zaczyna się od nowa.

to jest niesamowite
Evan Carslake

„Program pobiera dane wejściowe unarne z wiersza poleceń”: To dla mnie wygląda na binarne?
therealfarfetchd

Ups Ponieważ wyjście wyglądało na binarne, pomyślałem, że wejście też powinno być. Potem czytam tekst. Nieważne. : P
tamalfarfetchd

15

pieprzenie mózgu , 43 41 bajtów

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

Używa zmodyfikowanej wersji mojego algorytmu niszczącego modułu na Esolangs .

Program odczytuje dwa bajty - d i n , w tej kolejności - od standardowego wejścia i drukuje dwa bajty - n% D i n / d , w tym celu - na standardowe. Wymaga tłumacza z podwójnie nieskończoną lub okrągłą taśmą, taką jak ta na TIO.

Wypróbuj online!

Jak to działa

Przed uruchomieniem programu wszystkie komórki mają wartość 0 . Po odczytaniu d ze STDIN ( ,), przesunięciu się o jeden krok w lewo ( <) i odczytaniu n ze STDIN ( ,) taśma wygląda następująco.

       v
A      B      C      D      E      F      G      H      J
0      n      d      0      0      0      0      0      0

Następnie, zakładając, że n> 0 , wchodzimy do pętli while

[>->+<[>]>>>>+<<<[<+>-]<<[<]>-]

który przekształca taśmę w następujący sposób.

Po pierwsze, >->+<pożyczki do komórki C i zmniejsza go, a następnie przejście do komórki D i przyrosty go, a wreszcie wraca do komórek C . To, co stanie się potem, zależy od tego, czy wartość komórki C wynosi zero, czy nie.

  • Jeśli komórka C posiadać dodatnią wartość, [>](idź w prawo, podczas gdy komórka jest niezerowe) awansuje do komórek E .

    >>>>+<<<Postęp do komórek J aby ją zwiększyć, a następnie wraca do komórek F .

    Ponieważ komórka F będzie zawsze trzymać 0 , czas pętla [<+>-]zostanie pominięty całkowicie, i <<wraca do komórki D .

    Wreszcie, ponieważ ani D ani C przytrzymaj 0 , [<](idź w lewo, podczas gdy komórka jest niezerowe) będzie retrocede do komórek A .

  • Jeśli komórka C zawiera 0 , pętla [>]jest całkowicie pomijana; >>>>+<<<Postęp do komórek G , aby ją zwiększyć, a następnie przechodzi z powrotem do komórkowej D .

    W tym momencie D będzie trzymać d (w rzeczywistości suma wartości w C i D będzie zawsze d ), więc [<+>-](gdy D jest dodatnia, przyrost C i spadek D ) ustawią C na d, a D na 0 .

    Wreszcie, <<retrocedes do komórek B , [<](lewo, gdy komórka jest niezerowa) dalej pozostawia się komórki A .

W obu przypadkach >-przesuwa się do komórki B i zmniejsza ją, a pętla rozpoczyna się od nowa, chyba że zostanie wyzerowana.

Po k iteracjach, taśma wygląda następująco.

       v
A      B      C      D      E      F      G      H      J
0      n-k    d-k%d  k%d    0      0      k/d    0      k-k/d

Po n iteracjach B jest zerowane i wyrywamy się z pętli. Żądane wartości ( n% d i n / d ) zostaną zapisane w komórkach D i G , więc >>.>>>.je wydrukuje.


12

Funciton , 224 108 bajtów

Liczba bajtów zakłada kodowanie UTF-16 za pomocą BOM.

 ┌──┬───┐
┌┴╖╓┴╖ ┌┴╖
│%╟║f╟┐│÷╟┘
╘╤╝╙─╜│╘╤╝
 └────┴─┘

Wypróbuj online!

Powyższe definiuje funkcję f, która przyjmuje dwie liczby całkowite i zwraca zarówno ich podział, jak i iloczyn (funkcje w Funciton mogą mieć wiele wyjść, o ile suma wejść i wyjść nie przekracza 4).

Używanie dwóch wartości wejściowych do wielu celów jest w rzeczywistości dość trywialne: po prostu odłączysz złącze za pomocą trójnika o wartości, która zostanie zduplikowana wzdłuż obu gałęzi, które możemy następnie osobno zasilić wbudowane podziały i modulo.

Właściwie zajęło mi dwa razy więcej czasu, aby dowiedzieć się, jak wyświetlić wynik użytkownikowi niż tylko wdrożenie rozwiązania.

Ponadto Funciton ma wbudowany divmod, ÷%i zabawnie wbudowane, ÷a %moje rozwiązania są zaimplementowane pod względem ÷% . Jednak moja fpowyższa funkcja nie jest do końca identyczna ÷%: musiałem zamienić kolejność danych wejściowych i chociaż wydaje się, że zmiana powinna być łatwa, ale jak dotąd nie byłem w stanie tego zrobić bez zwiększenia liczby bajtów .


10

JavaScript (ES6), 17 bajtów

Dzięki @Arnauld za grę w golfa na jednym bajcie

x=>y=>[x/y|0,x%y]

Odbiera dane wejściowe w formacie (x) (y)

Pobiera wartość x / y przez wykonanie bitowe lub
Pobiera resztę o x% y
Umieszcza obie wartości w tablicy, dzięki czemu można je zwrócić

Wypróbuj online!


10

APL (Dyalog) , 5 bajtów

-2 bajty dzięki @ngn

⌊÷,|⍨

To jest na szczycie (2 pociągi) widelca (3 pociągi), gdzie prawy ząb na szczycie jest pochodną funkcją (wynikiem zastosowania operatora do funkcji):

       result 
         ↑┌──────────┐
         ││    ┌────┐│┌──────┐ (derived function)
         │↓        ↓│↓      │╱
       ┌───┐ ┌───┐ ┌───┐ ╔═══╤═══╗
           ÷   ,   |    
       └───┘ └───┘ └───┘ ╚═══╧═══╝
                              
left argument ┴─────────────────┘  (operator)
                └─────────┴ right argument

 piętro

÷ podział

, catenated do

| pozostała część podziału
 z zamienionymi argumentami (moduł APL jest „wstecz”)

Wypróbuj online!


Jak stworzyłeś ten fajny schemat?
emiflake

2
@WolfgangTS starannie. Dyalog APL oferuje możliwość tworzenia podstawowych schematów drzewa funkcji ukrytych. Wypróbuj online! Zacząłem od tego ...
Adám

Ojej, wygląda bardzo trudnie. Obawiam się, że nie mam cierpliwości, haha
emiflake

krótszy:⌊÷,|⍨
ngn

@ng Ouch, masz mnie. Cieszę się, że wciąż tu jesteś.
Adám

7

Brachylog , 6 bajtów

{÷|%}ᶠ

Wypróbuj online!

Wyjaśnienie

Nadużywamy metapredykatu, ᶠ findallaby zastosować dwa różne predykaty do listy danych wejściowych dwóch argumentów:

{   }ᶠ         Findall for the Input [A,B] :
 ÷               Integer division
  |              Or…
   %             Modulo

7

MATL , 12 10 bajtów

Qt:ie=&fhq

Dane wejściowe są azatem b. Wyjście to reszta, a następnie iloraz.

Wypróbuj online!

Wyjaśnienie

Pozwala to uniknąć zarówno modulo, jak i podziału. Zamiast tego używa przekształcania tablic :

  1. Zbuduj tablicę a+1niezerowych elementów.
  2. Przekształć jako tablicę 2D bwierszy. W razie potrzeby automatycznie uzupełnia się zerami.
  3. Indeksy wierszy i kolumn ostatniego niezerowego wpisu, minus 1, są odpowiednio resztą i ilorazem.

Rozważmy na przykład a=7, b=3.

Q    % Input a implicitly. Push a+1
     % STACK: 8
t:   % Duplicate. Range from 1 to that
     % STACK: 8, [1 2 3 4 5 6 7 8]
ie   % Input b. Reshape as a matrix with b rows (in column major order)
     % STACK: 8, [1 4 7;
                  2 5 8]
                  3 6 0]
=    % Compare for equality
     % STACK: [0 0 0;
               0 0 1;
               0 0 0]
&f   % Row and column indices (1-based) of nonzero element
     % STACK: 2, 3
hq   % Concatenate. Subtract 1. Implicitly display
     % STACK: [1 2]

2
To dobry przykład myślenia bocznego, dobra robota!
Leo

6

Mathematica, 20 18 bajtów

⌊#/#2⌋@Mod@##&

Niewielkie nadużywanie elastycznych reguł produkcji: wynik jest podawany jako div[mod], co pozostanie nieocenione. Poszczególne liczby można wyodrębnić za pomocą result[[0]]i result[[1]].

I hej, to tylko jeden bajt dłuższy niż śmiesznie nazwany wbudowany QuotientRemainder.

Mathematica, właściwie ma fajny sposób na zastosowanie wielu funkcji do tego samego wejścia, ale jest o trzy bajty dłużej:

Through@*{Quotient,Mod}

1
Wiesz, że to źle, kiedy Twój język tworzy wbudowane elementy, które po prostu łączą wbudowane elementy…
Fatalize

1
@Fatalize Is it? Uważam, że wbudowane w divmod są dość przydatne, a Mathematica nie jest zdecydowanie jedynym językiem, który ma taki język.
Martin Ender

8
@Fatalize, do obliczenia ilorazów potrzeba tyle samo pracy, ile do obliczenia reszty. Jeśli oba wyniki mają być stosowane, odpowiednio zaprojektowane quotRemwbudowane można zaoszczędzić dużo czasu na wywołanie quoti remoddzielnie.
Julian Wolf

6

05AB1E , 5 bajtów

÷²¹%‚

Wypróbuj online!

05AB1E ma błąd, więc niejawne dane wejściowe nie działają :( Emigna zauważyła, że ​​dane wejściowe są często wypychane do tyłu.


Możesz zrobić ÷ ²¹%) dla 5 bajtów.
Emigna

@Emigna Nie wiem, czy to ważne. Zaraz, jak to zadziałało?
Erik the Outgolfer

1
Nie rozumiem, dlaczego to nie byłoby ważne. Działa, ponieważ niejawne dane wejściowe są wypychane na stos w odwrotnej kolejności, niż w takich przypadkach.
Emigna

@Emigna Poprosiłem OP, czy mogę odwrócić argumenty.
Erik the Outgolfer

2
Rozumiem You may choose any format you like for both input and output, as long as the two numbers are clearly distinguishableprzez to, że możesz zdecydować, że dane wejściowe są traktowane jako divisor, dividend. Możesz po prostu określić w odpowiedzi „Dane wejściowe są traktowane jako divisor, dividend” i będą one wyraźnie widoczne :)
Emigna

6

Meduza , 14 bajtów

p
m
,|S
% i
Ei

Wypróbuj online!

Wyjaśnienie

Meduza to piękny język, jeśli chodzi o stosowanie wielu funkcji do tego samego wejścia. Język jest dwuwymiarowy i wszystkie funkcje binarne wyglądają na południe dla jednego wejścia i na wschód dla drugiego. Zbliżając się do jednej wartości z zachodu i z północy, możemy podać ją do dwóch funkcji bez konieczności kopiowania jej w kodzie.

Dwa is w programie są zastępowane dwoma wartościami wejściowymi podczas uruchamiania programu. Teraz %jest podział. Zajmuje jedno wejście bezpośrednio ze wschodu, a gdy idzie na południe, uderza w to, Ektóre przekierowuje również wyszukiwanie na wschód. Tak więc oba dane wejściowe są podawane %jako argumenty.

| jest wbudowanym modułem, który zasadniczo robi to samo, ale w końcu szuka obu na południe.

Łączymy oba wyniki w parę z ,. Następnie mjest funkcja podłogi (której potrzebujemy, ponieważ %jest to dzielenie zmiennoprzecinkowe) i na koniec wypisujemy wynik za pomocą p.


6

Cubix , 12 13 bajtów

;W@o,I|\S%;O

Który mapuje na następujący sześcian

    ; W
    @ o
, I | \ S % ; O
. . . . . . . .
    . .
    . .

Wypróbuj tutaj

Wyjaśnienie z wykonanymi krokami
,I|I,- zaczyna się od zbędnego podziału liczb całkowitych, pobiera pierwszą liczbę całkowitą z wejścia, odbija się wstecz i pobiera następną liczbę całkowitą z wejścia, a następnie dzieli ponownie
O;- Wyprowadza wynik podziału liczb całkowitych i wstawia go
%- wykonaj modyfikację. Można to zrobić później, ale skończyło się tutaj
S\o- Dodaj znak spacji do stosu, przekieruj w górę i wypuść spację
W;- Przesuń w lewo i wyskakuj spację ze stosu
O|@- Wyjmij obliczony wcześniej mod, przejdź przez poziomy reflektor i zatrzymaj się.


Pokonaj mnie o dwie minuty. Niezła odpowiedź!
Łukasz

@Luke Dzięki, pomyślałem, że mogę dostać jeszcze jedną, ale okazało się, że jest nieuchwytna
MickyT

6

Brain-Flak , 56 54 bajtów

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

Wypróbuj online!

-2 bajty dzięki Wheat Wizard

Wyjaśnienie

Obecnie najbardziej znany podział liczb całkowitych i modulo w Brain-Flak są bardzo podobne (w rzeczywistości obecnie używany podział liczb całkowitych jest tylko modyfikacją, którą wprowadziłem na feersum ).

Porównanie podziału modulo i liczb całkowitych:
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

Dogodnie program podziału liczb całkowitych wykorzystuje tylko trzeci stos do przechowywania danych, podczas gdy program modulo wykorzystuje tylko normalne dwa stosy do przechowywania danych. Zatem po prostu uruchamiając je jednocześnie, nie kolidują ze sobą.

Kombinacja podziału modulo i liczb całkowitych:
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

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

Wreszcie, zarówno programy do dzielenia liczb całkowitych, jak i programy modulo używane w tej kombinacji zostały zaprojektowane tak, aby były czyste w stosach (nie pozostawiają śmieci na stosach / nie zależą od (nie) istnienia wartości na stosach innych niż ich dane wejściowe), ale nie jest to konieczne za ten problem. W ten sposób możemy zaoszczędzić dwa bajty, nie zawracając sobie głowy zerowaniem zera na końcu głównej pętli, a kolejne dwa bajty, nie popychając zera na początku, zamiast tego bazując na zerowym wypełnieniu u dołu stosów.

To daje nam końcowy program:
({}<>)<>([()]{()<(({})){({}[()])<>}{}>}<><([{}()]{})>)

Wyjaśnienie programu podziału liczb całkowitych patrz w odpowiedzi na feersum

Wyjaśnienie dywizji liczb całkowitych już wkrótce ...


5

Java 8, 18 bajtów

(a,b)->a/b+","+a%b

To jest tego typu wyrażenie lambda BiFunction<Integer, Integer, String>.

Dziwi mnie, że jest to dość zwięzłe rozwiązanie dla Javy. Idź wyrażenia lambda!


5

Brain-Flak , 168 148 110 bajtów

Chyba powinienem najpierw sprawdzić Wiki

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

Format:

Input:    Output:
A (18)    remainder (2)
B (4)     division  (4)

Wypróbuj online!

(({})(<           # Copy A
({}(<             # Pick up A
(({})<>)          # Copy B to the other stack
>))               # Put A on top of a 0 on the second stack
                  # At this point the stacks look like this:   A
                                                               0
                                                             B B
                                                               ^

<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>) # Positive division from the wiki
>))                                          # Put down A on top of a 0
                                             # The stack now: A
                                                              0
                                                            Div B
                                                              ^

<>{(({})){({}[()])<>}{}}{}<>([{}()]{}<>)     # Modulo from the wiki


5

sed, 36 bajtów

35 bajtów kodu, +1 dla -rflagi.

:a;s/^(1+)( 1*)\1/\1\2x/;ta;s/.* //

Pobiera dane wejściowe w jednostkowej, oddzielonej spacją, z mniejszą liczbą jako pierwszą. Wyprowadza jako unary, z ilorazem najpierw ws, 1a pozostałą drugą xws. (Jeśli nie jest to dopuszczalne, daj mi znać, a zmienię go na oddzielone spacjami 1s, tak jak dane wejściowe).

Wyjaśnienie

:a;                                  Define label a
   s/            /     /;            Perform this substitution:
     ^(1+)                           Match the first unary number...
          ( 1*)                      ... followed by a space and 0 or more 1s...
               \1                    ... followed by the the first group again
                  \1\2x              Keep the first two parts unchanged; replace the third
                                     with an x
                         ta;         If the substitution succeeded, goto a
                            s/.* //  After the loop is over, remove the first number

5

Excel 2013, 31 30 26 bajtów

=INT(A1/B1)&","&MOD(A1;B1)

Wyjaśnienie

Dane wejściowe są w komórce A1i B1. Zwraca to po prostu zwracane wartości funkcji FLOORi MOD, które dotyczą podziału podłogi i pozostałej części. Te wartości są oddzielone przecinkiem.


Myślę, że masz na myśli komórkę A1 i B1, a nie A1 i A2
fəˈnɛtɪk

Tak, dziękuję. Naprawiono teraz
Łukasz

Zaoszczędź 1 bajt FLOOR(A1/B1;1)zamiastQUOTIENT(A1;B1)
Inżynier Toast

Ponieważ dane wejściowe są zawsze liczbami naturalnymi, myślę, że możesz zastąpić FLOOR(A1/B1;1)je „INT (A1 / B1)”, aby zaoszczędzić 4 kolejne bajty
Wernisch,



4

OLEJ , 134 106 103 102 bajtów

Pobiera dane wejściowe ze standardowego wejścia, dwóch liczb oddzielonych znakiem nowej linii. Zwraca wynik dzielenia liczb całkowitych, następnie nową linię, a następnie resztę.

Jest to jeden z najbardziej skomplikowanych programów OIL, jakie kiedykolwiek napisałem, ponieważ OIL nie ma wbudowanych funkcji dzielenia, reszty, dodawania, odejmowania i tak dalej. Działa z pierwotnym sposobem dzielenia: powtarzaną dekrementacją zagnieżdżoną.

Przedstawiam kod w formacie z adnotacjami, z komentarzami w stylu języków skryptowych. Przed wykonaniem komentarze należy usunąć.

5  # read input into lines 0 and 2

5
2
0  # the zero to compare to (nops)
1  # make a backup of the second input at line 3
2
3
10 # check if the second input is 0. %
4
2
24 # if so, jump to 24 (marked with §)
13 # else, go on
10 # check if the first input is zero &
4

31 # if so, jump to 31 (marked with $)
18 # else, go on
9  # decrement both numbers

9
2
6  # jump to line 8 (marked with %)
8
8  # increment the value in line 1 (initially a zero) §
1
1  # "restore the backup"
3
2
6  # jump to line 13 (marked with &)
13
10 # is the second number zero? $
4
2
42 # if so, jump to 42 (marked with +)
36 # else go on
9  # decrement both the second number and the backup
2
9
3
6  # jump to 31 (marked with $)
31
4  # print the division +
1
11 # a newline
4
3  # and the remainder (from the backup)

edytuj: Ogoliłem jeszcze 3 bajty, przenosząc „stałą” do lokalizacji jednocyfrowej (mniej bajtów do odniesienia), a następnie domyślnie 2 miejsca zero (używając zamiast tego pustej linii. Jeden z nich mógłbym zrobić przed).

edit: I kolejny bajt, domyślnie przyjmując zero początkowe. Naprawdę potrzebujemy tylko jednego dosłownego zera.


Świetna robota! Właśnie taką odpowiedź mam nadzieję, że otrzyma to wyzwanie :) Tylko uwaga: masz gwarancję, że dzielnik będzie zawsze ściśle pozytywny, więc nie musisz sprawdzać podziału przez 0;)
Leo

@Leo Gwarantuję, że dzielnik zawsze będzie początkowo ściśle dodatni . To nie zadziała, jeśli wezmę podział przez część zerową, ten przypadek może się zdarzyć nawet wtedy, gdy „rzeczywisty” podział jest normalny. Jeśli dobrze pamiętam, dzieje się tak, gdy reszta wynosi zero.
L3viathan

Mówię o kontroli w linii 4, a nie tej w linii 12 ... Czy to nie jest wykonywane tylko raz na początku programu?
Leo

@Leo Gotowe, prawie 30 znaków mniej, dzięki!
L3viathan

4

Siatkówka oka , 14 bajtów

Nadużywajmy formatów wejścia / wyjścia!

(.*)¶(\1)*
$#2

Pobiera dane wejściowe jako b\najednoargumentowe, wykorzystując w przypadku jednoznacznej cyfry dowolny pojedynczy niecyfrowy, nieliniowy znak. Wysyła iloraz w postaci dziesiętnej, po której bezpośrednio następuje reszta w jedności, przy użyciu tego samego znaku co wartość wejściowa.

Wypróbuj online!

(.*) ¶(\1)*dopasowuje pierwszą liczbę, następnie nową linię (¶ jest skrótem Retiny dla \ n), a następnie pierwszą liczbę ponownie tyle razy, ile to możliwe. Liczba meczów drugiej grupy będzie wynikiem podziału, a część niepasująca będzie resztą.

Za pomocą $#2zamieniamy wszystko, co pasowało do poprzedniego wiersza, liczbą przechwyceń w drugiej grupie i otrzymujemy nasz wynik.


Haha, całkiem słusznie, najwyraźniej nie powinienem pisać programów późnym wieczorem.
FryAmTheEggman

4

ArnoldC , 286 283 bajtów

HEY CHRISTMAS TREE c
YOU SET US UP 0
HEY CHRISTMAS TREE d
YOU SET US UP 0 
GET TO THE CHOPPER c
HERE IS MY INVITATION a
HE HAD TO SPLIT b
ENOUGH TALK
GET TO THE CHOPPER d
HERE IS MY INVITATION a
I LET HIM GO b
ENOUGH TALK
TALK TO THE HAND c
TALK TO THE HAND d
YOU HAVE BEEN TERMINATED

Wypróbuj online!

Jak to działa

HEY CHRISTMAS TREE c      //DECLARE VARIABLE c = 0
YOU SET US UP 0
HEY CHRISTMAS TREE d      //DECLARE VARIABLE d = 0
YOU SET US UP 0

GET TO THE CHOPPER c      /*
HERE IS MY INVITATION a      SET c = a/b
HE HAD TO SPLIT b         
ENOUGH TALK                */

GET TO THE CHOPPER d      /*
HERE IS MY INVITATION a      SET d = a mod b
I LET HIM GO b
ENOUGH TALK                */

TALK TO THE HAND c        // PRINT c
TALK TO THE HAND d        // PRINT d
YOU HAVE BEEN TERMINATED  //END

Format wyjściowy

a/b
a mod b

3

Labirynt , 11 bajtów

?:?:}/!\{%!

Wypróbuj online!

Wyjaśnienie

?:   Read a and duplicate.
?:   Read b and duplicate.
}    Move a copy of b over to the auxiliary stage.
/    Compute a/b.
!    Print it.
\    Print a linefeed.
{    Get back the other copy of b.
%    Compute a%b.
!    Print it.

Następnie IP uderza w ślepy zaułek, odwraca się i program kończy się z powodu próby podziału przez zero, gdy %jest ponownie wykonywany.



3

> <> , 27 26 16 + 1 = 17 bajtów

:r:{%:n','o-$,n;

Uwaga

  • Wprowadź za pomocą -vflagi, patrz TIO na przykład.
  • Wyprowadza najpierw resztę, potem przecinek, a na końcu dzielenie liczb całkowitych.

Wypróbuj online!

Wyjaśnienie

Zauważ, że stos zaczyna się jako A, B, gdzie Ai Breprezentuje pierwsze i drugie wejście, ze względu na -vzastosowaną flagę.

:r:{%:n','o-$,n; # Explanation
:r:{             # Do some stack modifications to prepare it for
                 #    next part
                 #    (Stack: B, A, A, B)
    %            # Take the modulo of the top two items
                 #    (Stack: B, A, A%B)
     :           # Duplicate it
                 #    (Stack: B, A, A%B, A%B)
      n          # Pop once and output as number
                 #    (Stack: B, A, A%B)
       ','o      # Print separator
                 #    (Stack: B, A, A%B)
           -     # Subtract the modulo from the first input
                 #    (Stack: B, A-A%B)
            $,   # Swap the two inputs so they are back in order
                 #     and divide, so we get an integer
                 #    (Stack: floor(A/B))
              n; # Output that as a number and finish.

Jak podać wartości wejściowe do 255?
Leo

Wystarczy użyć wyższych wartości ASCII / Unicode. W ten sposób įstaje się 255.
Łukasz

Ok, fajnie :) Przy okazji, czy nie byłoby krótsze pobieranie liczb wejściowych z wiersza poleceń bezpośrednio za pomocą flagi -v?
Leo

Tak by było, ale nie mogłem tego uruchomić na TIO, więc zdecydowałem się na to rozwiązanie. Zaoszczędziłoby to 8 bajtów - 1 (na -vflagę).
Łukasz


3

C, 21 bajtów

#define f(a,b)a/b,a%b

Makro, które zastępuje f (a, b) oddzielonymi przecinkami 2-członowymi. Lepiej jednak przekaż to do funkcji, bo inaczej nie da się rozdzielić dwóch.

Wypróbuj online


3

Haskell , 21 bajtów

a#b=(div a b,mod a b)

Wypróbuj online! Przykładowe użycie: 13#2zwraca (6,1). Tak, jest to dość nudne, ale nieco bardziej interesujące niż divModwbudowane, które działa tak samo.

Mimo, że jesteśmy na to, istnieje również quot, remi quotRemktóre zachowują się tak samo jak na liczbach naturalnych div, moda divMod. Jednak w przypadku ujemnych wkładów wynik modma taki sam znak jak dzielnik, podczas gdy wynik remma taki sam znak jak dywidenda. Lub, jak to zostało zapisane w dokumentacji Preludium , quotjest dzieleniem liczb całkowitych obciętym w kierunku zera i divjest dzieleniem liczb całkowitych obciętym w kierunku ujemnej nieskończoności.


Co powiesz na brak divlub modwbudowane?

Bez wbudowanych, 36 32 31 bajtów

a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b

Wypróbuj online! Przykładowe użycie: 13#2zwraca (1,6), to znaczy modwynik jest pierwszy, a divwynik drugi. Jeśli ajest mniejsze b, to a mod bjest ai a div bjest 0, więc (a,0)jest zwracane. Inaczej rekurencyjnie obliczyć modi divod a-bi b, dodać1 do wyniku podziału i zachować resztę.

Dodanie 1 do wyniku podziału jest osiągane przez użycie <$>, które jest powszechnie używane jakomap do mapowania funkcji na listach, ale działa również na krotkach, jednak funkcja jest stosowana tylko do drugiego elementu krotki.

Edycja: Zapisano jeden bajt dzięki xnor!


2
Twoje drugie rozwiązanie może golić bajt użyciu <$>na krotki do działania w jej drugiego elementu: a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b.
xnor

3

SWI Prolog, 109 bajtów

p(A):-print(A).
d(F,S,0,F):-S>F.
d(F,S,D,R):-G is F-S,d(G,S,E,R),D is E+1.
d(F,S):-d(F,S,D,R),p(D),p(-),p(R).

Wydajność:

?- d(255,25).
10-5
true .
?- d(5,7).
0-5
true .

Opis:

Prosty algorytm rekurencyjny bez wbudowanego podziału lub modulo. Po prostu liczy „ile razy zmieści Drugi numer w Pierwszy?” i podaje wynik (zunifikowany do D) z resztą (R).

// edycja: usunięto niepotrzebne spacje


Witamy w PPCG! Nigdy wcześniej nie korzystałem z Prologu, ale zauważyłem, że :-w ostatniej linii są spacje, ale nie na innych. Czy są wymagane z jakiegoś powodu? To samo dotyczy E + 1natomiast F-Ssugerują brak potrzebne pomieszczenia.
Laikoni

Laikoni: Zdecydowanie masz rację! Właśnie usunąłem spacje i zaktualizowałem końcową liczbę bajtów.
Jan Drozen


2

MATL, 5 bajtów

/k&G\

Wypróbuj to w MATL Online!

Wyjaśnienie

        % Implicitly grab the two inputs as numbers
/       % Divide them
k       % Round down the result
&G      % Grab the two inputs again
\       % Compute the remainder

2

Ouroboros , 15 bajtów

r.r.@/Inao\%n1(

Pobiera liczby w odwrotnej kolejności (np 10 42.). Wypróbuj tutaj.

Wyjaśnienie

r.r.             Read a number, duplicate, read a number, duplicate
    @            Rotate a copy of the first number to the top of the stack
     /I          Divide and truncate to integer
       n         Output as number
        ao       Push 10 and output as character (newline)
          \%     Swap the remaining two values and take the mod
            n    Output as number
             1(  Push 1 and swallow that many characters from the end of the program,
                 halting execution
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.