Pembagian dan sisanya


36

Tantangan ini, walaupun mungkin sepele di sebagian besar bahasa "standar", ditujukan kepada bahasa-bahasa yang begitu esoteris, tingkat rendah, dan / atau sulit digunakan yang sangat jarang terlihat di situs ini. Ini seharusnya memberikan masalah yang menarik untuk dipecahkan, jadi ini adalah kesempatan Anda untuk mencoba bahasa aneh yang telah Anda baca!

Tugas

Ambil dua bilangan asli adan bsebagai input, dan hasilkan dua angka lainnya: hasil dari divisi integer a/b, dan sisanya dari pembagian tersebut ( a%b).

Ini adalah : jawaban terpendek (dalam byte), untuk setiap bahasa, menang!

Input output

  • 0 <= a<= 255, 1 <= b<= 255. Setiap input Anda (dan juga keluaran) akan muat dalam satu byte.
  • Anda dapat memilih format apa pun yang Anda suka untuk input dan output, selama kedua angka tersebut dapat dibedakan dengan jelas (mis. Tidak mencetak dua hasil bersamaan tanpa pembatas)

Contohnya

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

Catatan: Builtin yang mengembalikan hasil divisi dan sisanya dilarang . Setidaknya tunjukkan kepada kami bagaimana bahasa Anda menangani penerapan dua fungsi pada argumen yang sama.

Catatan 2: Seperti biasa, penjelasan tentang cara kerja kode Anda sangat disambut baik, meskipun terlihat mudah bagi Anda, itu mungkin tidak cocok untuk orang lain!


Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan ikhtisar pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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


Bisakah saya membalikkan argumen, yaitu alih-alih menyediakan a bpenyediaan b a?
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 Ya, saya tidak yakin apakah membalikkan tidak membuat mereka tidak bisa dibedakan.
Erik the Outgolfer

@EriktheOutgolfer jika Anda tahu bahwa mereka harus dibalik, Anda tidak memiliki masalah dalam membedakannya :)
Leo

Sayangnya, algoritma BF tidak berfungsi jika pembagi itu 1.
mbomb007

Jawaban:


23

BitCycle , 146 79 64 byte

Baru menyadari bahwa seluruh bagian dari kode asli saya tidak diperlukan. Pengurangan besar!

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

Program mengambil input di unary dari baris perintah, dengan pembagi pertama. Ini hasil bagi bagi dan sisanya di unary, dipisahkan oleh a 0. Sebagai contoh, di sini a=11, b=4, a/b=2, a%b=3:

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

Tidak diserang, beraksi

Ini komputasi versi ungolfed saya a=3, b=5dengan animasi dihidupkan (maaf tentang glitchiness):

Divmod berjalan dalam BitCycle

Mencoba penjelasan

Penjelasan ini berlaku untuk versi yang tidak diklik. Sebelum Anda mengatasinya, saya sangat menyarankan Anda membaca halaman Esolangs untuk merasakan bagaimana bahasa bekerja.

Algoritmanya seperti ini:

  • Jalankan loop luar sampai program dihentikan.
    • Jalankan loop dalam di atas bit pembagi, memasangkannya dengan bit dari dividen.
      • Jika semua bit pembagi memiliki bit dividen yang cocok, hasilkan satu bit.
      • Jika tidak semua bit pembagi memiliki bit dividen yang cocok, hasilkan separator 0diikuti oleh bit dividen apa yang ada, kemudian terminasi.

Inti dari kode adalah hubungan di antara para kolektor (huruf besar). Karena ada beberapa kolektor terpisah dengan setiap huruf, mari kita merujuk kepada mereka sebagai A1, A2, B1, B2, dll, penomoran dari atas ke bawah.

  • A1dan A2pegang pembagi dan dividen, masing-masing, pada awal loop utama.
  • Lingkaran dalam terkelupas sedikit demi sedikit dari pembagi dan dividen.
    • Sisanya pembagi, jika ada, selalu masuk ke B1.
    • Jika pembagi dan dividen tidak kosong, satu bit masuk C1dan satu lagi C3. Sisa dari dividen masuk ke dalam B2.
    • Jika hanya pembagi yang tidak kosong, kita telah mencapai akhir dari dividen, dan sudah waktunya untuk mencetak sisanya. Bit dari pembagi masuk ke C2.
    • Jika hanya dividen yang tidak kosong, kami telah mencapai akhir pembagi; saatnya untuk memproses bit dalam C3atau C2untuk output. Sisa dividen masuk ke C4.
  • Jika ada bit di Bkolektor, mereka memutar kontennya kembali ke Akolektor dan melanjutkan di loop dalam.
  • Setelah semua Adan Bpengumpul semuanya kosong, Cpengumpul terbuka dan kami melanjutkan ke tahap pemrosesan:
    • C1dan C4membuang isinya (masing-masing pembagi dan sisa dividen) ke dalam D1dan D3.
    • Jika C2kosong, kami masih mencetak hasil bagi.
      • Isi C3naik ke =saklar kanan atas . 1Bit pertama melewati langsung ke !dan adalah keluaran.
      • Ketika 1bit melewati, itu mengaktifkan saklar untuk menunjuk ke kanan, yang mengirim semua bit berikutnya dari papan.
    • Jika C2tidak kosong, kami sedang mencetak sisanya.
      • Bit pertama C2dinegasikan ke 0dan melewati saklar. The 0melanjutkan dengan !dan output.
      • Ketika 0bit melewati, itu mengaktifkan sakelar untuk menunjuk ke kiri. Sekarang semua bit dari C3pergi ke kiri dari sakelar dan diarahkan ke sekeliling !, mengeluarkan seluruh sisanya.
      • Salinan bit pertama dari C2juga dikirimkan ke D2.
  • Sekarang Dkolektor terbuka.
    • Jika ada sesuatu di dalamnya D2, itu berarti kami baru saja mencetak sisanya. Bit dari D2hits @, yang mengakhiri program.
    • Kalau tidak, isi D1dan D3loop kembali ke masing A1- A2masing, dan loop utama dimulai lagi.

itu luar biasa
Evan Carslake

"Program ini mengambil input unary dari baris perintah": Itu terlihat seperti biner bagi saya?
therealfarfetchd

Aduh. Karena outputnya terlihat seperti biner, saya pikir inputnya juga harus. Lalu saya membaca teks. Sudahlah. : P
therealfarfetchd

15

brainfuck , 43 41 byte

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

Ini menggunakan versi modifikasi dari algoritma modulus destruktif saya di Esolangs .

Program membaca dua byte - d dan n , dalam urutan itu - dari STDIN dan mencetak dua byte - n% d dan n / d , dalam urutan itu - ke STDOUT. Dibutuhkan juru bahasa brainfuck dengan pita ganda tak terbatas atau bundar, seperti yang ada di TIO.

Cobalah online!

Bagaimana itu bekerja

Sebelum program dimulai, semua sel memiliki nilai 0 . Setelah membaca d dari STDIN ( ,), bergerak satu langkah ke kiri ( <) dan membaca n dari STDIN ( ,), rekaman itu terlihat sebagai berikut.

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

Selanjutnya, dengan asumsi bahwa n> 0 , kita memasuki loop while

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

yang mengubah rekaman itu sebagai berikut.

Pertama, >->+<kemajuan ke sel C dan decrements itu, maka uang muka ke sel D dan bertahap, dan akhirnya kembali ke sel C . Apa yang terjadi selanjutnya tergantung pada apakah nilai sel C adalah nol atau tidak.

  • Jika sel C memegang nilai positif, [>](ke kanan sedangkan sel adalah non-nol) akan maju ke sel E .

    >>>>+<<<uang muka kepada sel J untuk kenaikan itu, kemudian kembali ke sel F .

    Karena sel F akan selalu memegang 0 , sementara lingkaran [<+>-]dilewati seluruhnya, dan <<kembali ke sel D .

    Akhirnya, karena baik D atau C terus 0 , [<](ke kiri sementara sel adalah non-nol) akan retrocede ke sel A .

  • Jika sel C menampung 0 , loop [>]dilewati seluruhnya; >>>>+<<<uang muka kepada sel G untuk kenaikan itu, kemudian kembali ke sel D .

    Pada titik ini, D akan menahan d (pada kenyataannya, jumlah nilai dalam C dan D akan selalu menjadi d ), jadi [<+>-](sementara D positif, kenaikan C dan penurunan D ) akan mengatur C ke d dan D ke 0 .

    Akhirnya, <<retrocedes ke sel B , [<](ke kiri sementara sel adalah non-nol) lanjut kiri ke sel A .

Dalam kedua kasus, >-maju ke sel B dan menurunkannya, dan loop dimulai lagi kecuali ini nol.

Setelah k iterasi, rekaman itu terlihat sebagai berikut.

       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

Setelah n iterasi B adalah memusatkan perhatian keluar dan kami keluar dari loop. Nilai yang diinginkan ( n% d dan n / d ) akan disimpan dalam sel D dan G , jadi >>.>>>.cetaklah.


12

Funciton , 224 108 byte

Hitungan byte mengasumsikan pengodean UTF-16 dengan BOM.

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

Cobalah online!

Di atas mendefinisikan fungsi f, yang mengambil dua bilangan bulat dan mengembalikan divisi dan produk mereka (fungsi di Funciton dapat memiliki beberapa output selama jumlah input dan output tidak melebihi 4).

Menggunakan dua nilai input untuk beberapa tujuan sebenarnya cukup sepele: Anda cukup memisahkan konektor dengan pertigaan pada nilai yang akan diduplikasi di sepanjang kedua cabang, yang kemudian dapat kita berikan secara terpisah ke built-in untuk divisi dan modulo.

Sebenarnya butuh waktu dua kali lebih lama bagi saya untuk mengetahui cara menampilkan hasilnya kepada pengguna daripada hanya mengimplementasikan solusi.

Juga, Funciton memiliki divmod built-in,, ÷%dan lucu built-in ÷dan %bahwa penggunaan solusi saya diimplementasikan dalam hal ÷% . Namun, fungsi saya di fatas tidak cukup identik dengan ÷%: Saya harus menukar urutan input dan meskipun sepertinya harus mudah untuk mengubahnya, sejauh ini saya belum dapat melakukannya tanpa menambah jumlah byte .


10

JavaScript (ES6), 17 byte

Terima kasih kepada @Arnauld untuk bermain golf satu byte

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

Menerima input dalam format (x) (y)

Mendapat lantai x / y dengan melakukan bitwise atau
Mendapat sisa x% y
Menempatkan kedua nilai dalam array sehingga keduanya dapat dikembalikan

Cobalah online!


10

APL (Dyalog) , 5 byte

-2 byte terima kasih kepada @ngn

⌊÷,|⍨

Ini adalah puncak (2-kereta) dari garpu (3-kereta), di mana tine kanan atas adalah fungsi turunan (hasil dari operator yang diterapkan pada suatu fungsi):

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

 lantai

÷ divisi

, dikurungkan ke

| sisa divisi
 dengan argumen swapped (modulus APL adalah "mundur")

Cobalah online!


Bagaimana Anda membuat diagram keren itu?
emiflake

2
@ WolfgangTS dengan susah payah. Dyalog APL hadir dengan kemampuan membuat diagram pohon fungsi-fungsi diam-diam. Cobalah online! Saya mulai dengan itu ...
Adm

Aduh, terlihat sangat sulit. Saya tidak punya kesabaran untuk itu saya takut, haha
emiflake

lebih pendek:⌊÷,|⍨
ngn

Sialan, aduh, saya mengerti. Senang melihat Anda masih di sini.
Adám

7

Brachylog , 6 byte

{÷|%}ᶠ

Cobalah online!

Penjelasan

Kami menyalahgunakan metapredicate ᶠ findalluntuk menerapkan dua predikat berbeda ke daftar Input dari dua argumen:

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

7

MATL , 12 10 byte

Qt:ie=&fhq

Input a, kemudian b. Output adalah sisa, lalu hasil bagi.

Cobalah online!

Penjelasan

Ini menghindari modulo dan divisi. Alih-alih itu menggunakan pembentukan ulang array :

  1. Buat array a+1elemen bukan - nol.
  2. Membentuk ulang sebagai deretan 2D bbaris. Ini secara otomatis bantalan dengan nol jika diperlukan.
  3. Indeks baris dan kolom dari entri bukan nol terakhir, minus 1, masing-masing adalah sisanya dan hasil bagi.

Pertimbangkan misalnya 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
Ini adalah contoh pemikiran lateral yang bagus, kerja bagus!
Leo

6

Mathematica, 20 18 byte

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

Penyalahgunaan kecil dari aturan output yang fleksibel: hasilnya diberikan sebagai div[mod], yang akan tetap tidak dievaluasi. Angka-angka individual dapat diekstraksi dengan result[[0]]dan result[[1]].

Dan hei, itu hanya satu byte lebih lama dari built-in yang bernama ridiculously QuotientRemainder .

Mathematica, sebenarnya memiliki cara yang rapi untuk menerapkan beberapa fungsi ke input yang sama, tetapi lebih panjang tiga byte:

Through@*{Quotient,Mod}

1
Anda tahu itu buruk ketika bahasa Anda menciptakan built-in yang hanya menggabungkan built-in ...
Fatalize

1
@Fatalize, benarkah? Saya menemukan divmod built-in cukup berguna, dan Mathematica sejauh ini bukan satu-satunya bahasa yang memilikinya.
Martin Ender

8
@Fatalize, banyak pekerjaan yang sama diperlukan untuk menghitung quotients seperti yang diperlukan untuk menghitung sisanya. Jika kedua hasil akan digunakan, quotRembuiltin yang direkayasa dengan benar dapat menghemat waktu yang signifikan dibandingkan menelepon quotdan remsecara terpisah.
Julian Wolf

6

05AB1E , 5 byte

÷²¹%‚

Cobalah online!

05AB1E memiliki bug, jadi input implisit tidak berfungsi :( Emigna mencatat bahwa input sering kali didorong mundur.


Anda bisa melakukan ÷ ²¹%) selama 5 byte.
Emigna

@ Emigna Saya tidak tahu apakah itu valid. Tunggu, bagaimana cara kerjanya?
Erik the Outgolfer

1
Saya tidak mengerti mengapa itu tidak valid. Ini bekerja karena input implisit didorong ke stack dalam urutan terbalik dari apa yang Anda asumsikan dalam kasus-kasus seperti ini.
Emigna

@ Emigna Saya telah meminta OP apakah saya dapat membalikkan argumen.
Erik the Outgolfer

2
Aku mengambil You may choose any format you like for both input and output, as long as the two numbers are clearly distinguishableberarti bahwa Anda dapat memutuskan bahwa input diambil sebagai divisor, dividend. Anda bisa menentukan "Input diambil sebagai divisor, dividend" dalam jawaban dan mereka akan dapat dibedakan dengan jelas :)
Emigna

6

Ubur-ubur , 14 byte

p
m
,|S
% i
Ei

Cobalah online!

Penjelasan

Ubur-ubur adalah bahasa yang indah ketika menerapkan beberapa fungsi ke input yang sama. Bahasanya adalah 2D dan semua fungsi biner mencari ke selatan untuk satu input dan ke timur untuk yang lain. Jadi dengan mendekati satu nilai dari barat dan dari utara, kita dapat memberinya dua fungsi tanpa harus menduplikatnya dalam kode.

Dua idalam program diganti dengan dua nilai input saat program dimulai. Sekarang %adalah pembagian. Dibutuhkan satu input langsung dari timur, dan ketika pergi ke selatan itu menyentuh Epengalihan yang mencari timur juga. Jadi kedua input diumpankan %sebagai argumen.

| adalah built-in untuk modulo, yang pada dasarnya melakukan hal yang sama, tetapi akhirnya melihat ke selatan untuk keduanya dalam put.

Kami menggabungkan kedua hasil menjadi pasangan dengan ,. Kemudian madalah fungsi lantai (yang kita butuhkan karena %divisi floating-point) dan akhirnya kita mencetak hasilnya p.


6

Cubix , 12 13 byte

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

Yang memetakan ke kubus berikut

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

Coba di sini

Penjelasan dengan langkah-langkah seperti yang dijalankan
,I|I,- dimulai dengan pembagian bilangan bulat superflous, dapatkan bilangan bulat pertama dari input, refleksikan kembali dan dapatkan bilangan bulat berikutnya dari input, lalu bagi lagi
O;- Keluarkan hasil pembagian integer dan letakan
%- lakukan mod. Ini bisa dilakukan nanti, tetapi berakhir di sini
S\o- Tambahkan karakter spasi ke stack, redirect dan output space
W;- Geser ke kiri dan pop ruang dari stack
O|@- Keluarkan mod yang sebelumnya dihitung, melewati reflektor horisontal dan berhenti.


Kalahkan saya dua menit. Jawaban bagus!
Luke

@ Lukas Terima kasih, pikir saya bisa mendapatkan yang lain, tetapi membuktikan sulit dipahami
MickyT

6

Brain-Flak , 56 54 byte

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

Cobalah online!

-2 byte terima kasih kepada Wheat Wizard

Penjelasan

Divisi integer dan modulo paling dikenal saat ini di Brain-Flak sangat mirip (pada kenyataannya divisi integer yang saat ini digunakan hanyalah modifikasi yang saya buat pada feersum modulo ).

Perbandingan divisi modulo dan integer:
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

Dengan mudah, program pembagian integer hanya menggunakan tumpukan ketiga untuk menyimpan data sementara program modulo hanya menggunakan dua tumpukan normal untuk menyimpan data. Jadi hanya dengan menjalankan keduanya pada saat yang sama mereka tidak saling bertabrakan.

Kombinasi divisi modulo dan integer:
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

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

Akhirnya, baik program integer division dan modulo yang digunakan dalam kombinasi ini dirancang untuk menjadi stack clean (tidak meninggalkan sampah di stack / tidak bergantung pada (tidak) adanya nilai pada stack selain input mereka) tetapi itu tidak perlu untuk masalah ini. Dengan demikian kita dapat menyimpan dua byte dengan tidak repot-repot melepaskan nol pada akhir loop utama dan dua byte lainnya dengan tidak mendorong nol pada awal, alih-alih mengandalkan bantalan nol di bagian bawah tumpukan.

Ini memberi kami program terakhir:
({}<>)<>([()]{()<(({})){({}[()])<>}{}>}<><([{}()]{})>)

Untuk penjelasan untuk program pembagian integer lihat jawaban feersum

Penjelasan Divisi Integer Segera Hadir ...


5

Java 8, 18 Bytes

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

Ini adalah ekspresi lambda dari tipe tersebut BiFunction<Integer, Integer, String>.

Saya terkejut ... ini sebenarnya solusi yang cukup ringkas untuk Java. Pergi ekspresi lambda!


5

Brain-Flak , 168 148 110 byte

Saya kira saya harus memeriksa Wiki terlebih dahulu

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

Format:

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

Cobalah 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 byte

35 byte kode, +1 untuk -rbendera.

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

Mengambil input di unary, dipisahkan oleh ruang, dengan angka lebih kecil terlebih dahulu. Keluaran sebagai unary, dengan hasil bagi pertama di 1s dan sisanya kedua di xs. (Jika ini tidak dapat diterima, beri tahu saya dan saya akan mengubahnya ke ruang-terpisah 1seperti input.)

Penjelasan

: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 byte

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

Penjelasan

Input ada di sel A1dan B1. Ini hanya mengembalikan nilai pengembalian fungsi FLOORdan MOD, yang untuk lantai divisi dan sisanya. Nilai-nilai ini dipisahkan oleh koma.


Saya pikir maksud Anda sel A1 dan B1 bukan A1 dan A2
fəˈnɛtɪk

Ya terima kasih. Diperbaiki sekarang
Luke

Hemat 1 byte dengan FLOOR(A1/B1;1) bukannyaQUOTIENT(A1;B1)
Engineer Toast

Karena input selalu berupa FLOOR(A1/B1;1)
Bilangan



4

MINYAK , 134 106 103 102 byte

Mengambil input dari stdin, dua angka dipisahkan oleh baris baru. Menghasilkan hasil dari divisi integer, lalu baris baru, dan sisanya.

Ini adalah salah satu program OIL paling rumit yang pernah saya tulis, karena OIL tidak memiliki builtin untuk pembagian, sisanya, penambahan, substraksi, dan sebagainya. Ini bekerja dengan cara primitif melakukan pembagian: decrementation bersarang berulang.

Saya menyajikan kode dalam format beranotasi, dengan komentar dalam gaya bahasa scripting. Sebelum dieksekusi, komentar harus dihapus.

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)

sunting: Memangkas 3 byte lebih banyak dengan memindahkan "konstanta" ke lokasi satu digit (lebih sedikit byte ke referensi), dan kemudian secara implisit memasukkan 2 lokasi nol (Dengan menggunakan baris kosong sebagai gantinya. Salah satunya bisa saya lakukan sebelum).

sunting: Dan byte lain dengan membuat nol awal tersirat. Kami benar-benar hanya membutuhkan nol literal tunggal.


Kerja bagus! Itulah jawaban yang saya harap tantangan ini akan terima :) Hanya sebuah catatan: Anda dijamin bahwa pembagi akan selalu benar-benar positif, jadi Anda tidak perlu memeriksa pembagian dengan 0;)
Leo

@ Leo Saya dijamin bahwa pembagi akan selalu benar-benar positif di awal . Itu tidak akan berhasil jika saya mengambil pembagian dengan nol bagian, kasus ini dapat terjadi bahkan ketika pembagian "aktual" adalah yang normal. Jika saya ingat benar ini terjadi ketika sisanya adalah nol.
L3viathan

Saya sedang berbicara tentang cek pada baris 4, bukan yang pada baris 12 ... Apakah tidak dijalankan hanya sekali pada awal program?
Leo

@ Leo Selesai, hampir 30 karakter kurang, terima kasih!
L3viathan

4

Retina , 14 byte

Mari kita menyalahgunakan format input / output!

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

Mengambil input sebagai b\na , secara unary, digunakan untuk digit unary, setiap karakter non-digit, non-baris baru. Keluarkan hasil bagi dalam desimal, segera diikuti oleh sisanya di unary, menggunakan karakter yang sama dengan input.

Cobalah online!

(.*) ¶(\1)*cocok dengan angka pertama, lalu baris baru (¶ adalah singkatan Retina untuk \ n), lalu angka pertama lagi sebanyak mungkin. Jumlah pertandingan dari grup kedua akan menjadi hasil dari divisi, dan bagian yang tidak cocok akan menjadi sisanya.

Dengan $#2, kami mengganti semua yang cocok di baris sebelumnya dengan jumlah tangkapan dari kelompok kedua, dan dapatkan hasilnya.


Haha, benar sekali, jelas saya seharusnya tidak menulis program selarut itu.
FryAmTheEggman

4

ArnoldC , 286 283 byte

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

Cobalah online!

Bagaimana itu bekerja

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 output

a/b
a mod b

3

Labirin , 11 byte

?:?:}/!\{%!

Cobalah online!

Penjelasan

?:   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.

IP kemudian menemui jalan buntu, berbalik dan program berakhir karena upaya pembagian dengan nol ketika %dieksekusi lagi.



3

> <> , 27 26 16 + 1 = 17 byte

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

Catatan

  • Input menggunakan -v bendera, lihat TIO untuk contoh.
  • Ini menampilkan sisanya terlebih dahulu, kemudian koma dan terakhir pembagian integer.

Cobalah online!

Penjelasan

Perhatikan bahwa tumpukan dimulai sebagai A, B, di mana Adan Bmewakili input pertama dan kedua, karena -vflag yang digunakan.

: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.

Bagaimana Anda bisa memberikan nilai input hingga 255?
Leo

Cukup gunakan nilai ASCII / Unicode yang lebih tinggi. Dengan begitu, įmenjadi 255.
Luke

Oke, bagus :) Ngomong-ngomong, bukankah akan lebih pendek untuk mengambil angka input dari baris perintah langsung dengan flag -v?
Leo

Ya, tapi saya tidak bisa menggunakannya pada TIO, jadi saya memutuskan dengan solusi ini. Ini akan menghemat 8 byte - 1 (untuk -vbendera).
Luke


3

C, 21 byte

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

Makro yang menggantikan f (a, b) dengan 2 syarat dipisahkan dengan koma. Meskipun Anda sebaiknya meneruskannya ke suatu fungsi atau tidak ada cara untuk memilih 2 terpisah.

Cobalah secara Online


3

Haskell , 21 byte

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

Cobalah online! Contoh penggunaan: 13#2pengembalian (6,1). Ya, ini cukup membosankan, namun sedikit lebih menarik daripada divModbuild-in yang berfungsi sama.

Sementara kita berada di sana, ada juga quot, remdan quotRemyang berperilaku sama pada bilangan asli seperti div, moddan divMod. Namun, untuk input negatif hasil modmemiliki tanda yang sama dengan pembagi, sedangkan hasil remmemiliki tanda yang sama dengan dividen. Atau, seperti yang tercantum dalam dokumentasi Prelude , quotapakah pembagian bilangan bulat terpotong ke nol dan divpembagian bilangan terpotong ke arah tak terhingga negatif.


Bagaimana kalau tidak divataumod built-in?

Tanpa build-in, 36 32 31 byte

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

Cobalah online! Contoh penggunaan: 13#2mengembalikan (1,6), yaitu modhasilnya adalah yang pertama dan divhasil yang kedua. Jika alebih kecil b, maka a mod badalah adan a div bitu 0, begitu (a,0)dikembalikan. Sebaliknya menghitung moddan secara rekursifdiv dari a-bdan b, tambahkan 1ke hasil pembagian dan pertahankan sisanya.

Menambahkan 1 ke hasil divisi dicapai dengan menggunakan <$> , yang biasanya digunakan mapuntuk memetakan fungsi di atas daftar, tetapi bekerja pada tupel juga, namun fungsi tersebut diterapkan pada elemen tupel kedua saja.

Sunting: Disimpan satu byte berkat xnor!


2
Solusi kedua Anda bisa mencukur byte menggunakan <$>pada tuple untuk bertindak pada elemen kedua: a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b.
xnor

3

Prolog SWI, 109 byte

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).

Keluaran:

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

Deskripsi:

Algoritma rekursif sederhana tanpa divisi built-in atau modulo. Ini hanya menghitung "berapa kali cocok angka Kedua dengan yang Pertama?" dan melaporkan hasilnya (disatukan ke D) dengan sisanya (R).

// edit: menghapus spasi yang tidak perlu


Selamat datang di PPCG! Saya belum pernah menggunakan Prolog sebelumnya, tetapi memperhatikan ada ruang :-di sekitar pada baris terakhir tetapi tidak pada yang lain. Apakah mereka diharuskan ada karena suatu alasan? Hal yang sama berlaku untuk E + 1sementara F-Smenyarankan tidak ada ruang yang dibutuhkan.
Laikoni

Laikoni: Kamu benar sekali! Saya baru saja menghapus spasi dan memperbarui jumlah byte akhir.
Jan Drozen


2

MATL, 5 byte

/k&G\

Cobalah di MATL Online!

Penjelasan

        % 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 byte

r.r.@/Inao\%n1(

Mengambil angka dalam urutan terbalik (mis 10 42.). Coba di sini.

Penjelasan

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.