กองและส่วนที่เหลือ


36

ความท้าทายนี้แม้ว่าอาจเป็นเรื่องเล็กน้อยในภาษา "มาตรฐาน" ส่วนใหญ่จะถูกส่งไปยังภาษาเหล่านั้นซึ่งมีความลึกลับระดับต่ำและ / หรือใช้งานยากซึ่งไม่ค่อยพบเห็นในเว็บไซต์นี้ มันควรจะเป็นปัญหาที่น่าสนใจในการแก้ไขดังนั้นนี่เป็นโอกาสของคุณที่จะลองใช้ภาษาแปลก ๆ ที่คุณได้อ่าน!

งาน

ใช้ตัวเลขธรรมชาติสองตัวaและbเป็นข้อมูลเข้าและส่งออกอีกสองตัวเลข: ผลลัพธ์ของการหารจำนวนเต็มa/bและส่วนที่เหลือของการหารนั้น ( a%b)

นี่คือ : คำตอบที่สั้นที่สุด (เป็นไบต์) สำหรับแต่ละภาษาชนะ!

Input / Output

  • 0 <= a<= 255, 1 <= b<= 255 แต่ละอินพุตของคุณ (และเอาต์พุตด้วย) จะพอดีกับไบต์เดียว
  • คุณสามารถเลือกรูปแบบใดก็ได้สำหรับทั้งอินพุทและเอาท์พุทตราบใดที่ตัวเลขทั้งสองนั้นสามารถแยกแยะได้อย่างชัดเจน (เช่นไม่มีการพิมพ์ผลลัพธ์สองรายการพร้อมกันโดยไม่มีตัวคั่น)

ตัวอย่าง

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

หมายเหตุ: builtins ที่ส่งกลับทั้งผลของการแบ่งและส่วนที่เหลือจะถูกต้องห้าม อย่างน้อยก็แสดงให้เราเห็นว่าภาษาของคุณเกี่ยวข้องกับการใช้สองฟังก์ชั่นกับข้อโต้แย้งเดียวกัน

หมายเหตุ 2:เช่นเคยคำอธิบายว่าโค้ดของคุณทำงานอย่างไรได้รับการต้อนรับอย่างมากแม้ว่ามันจะดูเหมือนว่าคุณสามารถอ่านได้ แต่มันอาจไม่เหมาะกับคนอื่น!


ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

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


ฉันสามารถย้อนกลับข้อโต้แย้งคือแทนที่จะให้a bการจัดเตรียม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 ใช่ฉันไม่แน่ใจว่าการย้อนกลับไม่ได้ทำให้พวกเขาแยกไม่ออกแม้ว่า
Erik the Outgolfer

@EriktheOutgolfer ถ้าคุณรู้ว่าพวกเขาจะต้องย้อนกลับไปคุณจะมีปัญหาในการแยกความแตกต่างพวกเขา :)
สิงห์

แต่น่าเสียดายที่อัลกอริทึม BF 1ไม่ทำงานถ้าหารเป็น
mbomb007

คำตอบ:


23

BitCycle , 146 79 64 ไบต์

เพิ่งรู้ว่าทั้งรหัสเดิมของฉันนั้นไม่มีความจำเป็น ลดลงอย่างมาก!

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

โปรแกรมรับอินพุตพร้อมกันจากบรรทัดรับคำสั่งโดยใช้ตัวหารก่อน 0มันออกความฉลาดและส่วนที่เหลือในเอกคั่นด้วย ยกตัวอย่างเช่นที่นี่a=11, b=4, a/b=2, a%b=3:

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

ดำเนินการ Ungolfed

นี่คือ ungolfed คอมพิวเตอร์รุ่นของฉันa=3, b=5ที่มีภาพเคลื่อนไหวเปิด (ขออภัยเกี่ยวกับ glitchiness) ที่:

Divmod ทำงานใน BitCycle

พยายามอธิบาย

คำอธิบายนี้ใช้กับเวอร์ชันที่ไม่ได้แต่งแต้ม ก่อนที่คุณจะจัดการมันฉันขอแนะนำให้คุณอ่านหน้า Esolangsเพื่อให้เข้าใจว่าภาษาทำงานอย่างไร

อัลกอริทึมเป็นดังนี้:

  • เรียกใช้ลูปด้านนอกจนกระทั่งโปรแกรมสิ้นสุดลง
    • ใช้วงด้านในเหนือบิตของตัวหารจับคู่กับบิตจากเงินปันผล
      • หากบิตทั้งหมดของตัวหารมีบิตการจับคู่เงินปันผลให้ส่งออกบิตเดียว
      • ถ้าไม่ใช่ตัวหารทั้งหมดที่มีการจับคู่บิตการปันผลเอาท์พุทตัวแยก0ตามด้วยบิตการปันผลที่มีอยู่จากนั้นก็ยุติ

หัวใจของรหัสคือความสัมพันธ์ระหว่างนักสะสม (ตัวอักษรตัวพิมพ์ใหญ่) เนื่องจากมีหลายสะสมแยกต่างหากพร้อมกับตัวอักษรแต่ละตัวขอหมายถึงพวกเขาเป็นA1, A2, B1, B2ฯลฯ นับจากบนลงล่าง

  • A1และA2ถือตัวหารและเงินปันผลตามลำดับที่จุดเริ่มต้นของวงหลัก
  • วงด้านในหลุดออกทีละบิตจากตัวหารและตัวกระจาย
    • ส่วนที่เหลือของตัวหารถ้ามีจะเข้าสู่B1เสมอ
    • หากทั้งตัวหารและเงินปันผลนั้นไม่ว่างก็จะมีบิตC1หนึ่งอันและหนึ่งC3อัน B2ส่วนที่เหลือของเงินปันผลที่จะเข้าสู่
    • หากตัวหารเท่านั้นที่ไม่ได้รับการยกเว้นเราจะถึงเวลาสิ้นสุดการจ่ายเงินปันผลและถึงเวลาที่จะพิมพ์ส่วนที่เหลือ C2บิตจากตัวหารที่จะเข้าสู่
    • ถ้าเพียงเงินปันผลไม่ได้รับการยกเว้นเราได้มาถึงจุดสิ้นสุดของตัวหาร ได้เวลาประมวลผลบิตในC3หรือC2สำหรับเอาต์พุต C4ส่วนที่เหลือของเงินปันผลที่จะเข้าสู่
  • หากมีบิตใด ๆ ในตัวBสะสมพวกเขาจะวนเนื้อหากลับไปที่ตัวAสะสมและดำเนินการต่อในวงด้านใน
  • เมื่อนักสะสมAและBว่างเปล่าCนักสะสมก็จะเปิดขึ้นและเราจะไปยังขั้นตอนการประมวลผล:
    • C1และC4ถ่ายโอนข้อมูลเนื้อหาของพวกเขา (ตัวหารและเงินปันผลที่เหลือตามลำดับ) ลงและD1D3
    • หากC2ว่างเปล่าเรายังคงพิมพ์ความฉลาดทาง
      • เนื้อหาของC3ขึ้นไปที่=สวิตช์ด้านบนขวา 1บิตแรกส่งตรงถึง!และเป็นเอาต์พุต
      • เมื่อ1บิตผ่านไปมันจะเปิดใช้งานสวิตช์เพื่อชี้ไปทางขวาซึ่งจะส่งบิตถัดไปทั้งหมดออกจากบอร์ด
    • หากC2ไม่ว่างเปล่าเราจะพิมพ์ส่วนที่เหลือ
      • บิตแรกของC2จะถูกทำให้ไร้ผลกับ a 0และส่งผ่านสวิตช์ 0ไป!และเอาท์พุท
      • เมื่อ0บิตผ่านมันจะเปิดใช้งานสวิตช์เพื่อชี้ไปทางซ้าย ตอนนี้บิตทั้งหมดจากC3ไปทางซ้ายจากสวิตช์และถูกเปลี่ยนเส้นทางไปยัง!ส่วนที่เหลือเอาท์พุททั้งหมด
      • สำเนาบิตแรกจากนี้ยังส่งเข้ามาC2D2
  • ตอนนี้Dนักสะสมก็เปิด
    • หากมีอะไรในD2นั่นหมายความว่าเราเพิ่งพิมพ์ส่วนที่เหลือ บิตจากการD2เข้าชม@ซึ่งจะยุติโปรแกรม
    • มิฉะนั้นเนื้อหาของD1และD3วนกลับเข้าไปในA1และA2ตามลำดับและลูปหลักจะเริ่มต้นใหม่

มันยอดเยี่ยมมาก
Evan Carslake

"โปรแกรมรับอินพุตในเอกภาพจากบรรทัดคำสั่ง": ดูเหมือนว่าไบนารีกับฉัน
กำหนด

อ๊ะ เนื่องจากเอาต์พุตดูเหมือนไบนารีฉันจึงควรอินพุตด้วย จากนั้นฉันก็อ่านข้อความ ไม่เป็นไร. : P
therealfarfetchd

15

brainfuck , 43 41 ไบต์

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

นี้ใช้เวอร์ชั่นล่าสุดของฉันอัลกอริทึมโมดูลัสทำลายใน Esolangs

โปรแกรมอ่านสองไบต์ - dและnตามลำดับ - จาก STDIN และพิมพ์สองไบต์ - n% dและn / dตามลำดับ - ไปยัง STDOUT มันต้องใช้ล่ามสมองด้วยเทปไม่ จำกัด หรือเป็นวงกลมเช่นบน TIO

ลองออนไลน์!

มันทำงานอย่างไร

ก่อนที่โปรแกรมจะเริ่มต้นทุกเซลล์ค้างค่า0 หลังจากอ่านdจาก STDIN ( ,) ให้เลื่อนไปทางซ้ายหนึ่งก้าว ( <) และอ่านnจาก STDIN ( ,) เทปจะมีลักษณะดังนี้

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

ต่อไปสมมติว่าn> 0เราเข้าไปในขณะที่ลูป

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

ซึ่งเปลี่ยนเทปดังต่อไปนี้

ครั้งแรกที่>->+<ความก้าวหน้าไปยังโทรศัพท์มือCและ decrements มันแล้วก้าวหน้าไปยังโทรศัพท์มือDและเพิ่มทีละมันและในที่สุดก็จะกลับไปยังเซลล์C สิ่งที่เกิดขึ้นต่อไปขึ้นอยู่กับว่าค่าของเซลล์Cเป็นศูนย์หรือไม่

  • ถ้าเซลล์Cถือเป็นค่าบวก[>](ไปทางขวาในขณะที่มือถือเป็นที่ไม่ใช่ศูนย์) จะเลื่อนไปยังเซลล์E

    >>>>+<<<ก้าวหน้าไปยังเซลล์Jเพื่อเพิ่มมันแล้วไปกลับไปยังโทรศัพท์มือF

    เนื่องจากเซลล์Fมักจะถือ0ในขณะที่วง[<+>-]จะข้ามทั้งหมดและ<<กลับไปถือD

    สุดท้ายตั้งแต่ค่าDมิได้Cถือ0 , [<](ไปทางซ้ายในขณะที่มือถือเป็นที่ไม่ใช่ศูนย์) จะ retrocede ไปยังเซลล์

  • ถ้าเซลล์Cถือ0ห่วง[>]จะถูกข้ามทั้งหมด; >>>>+<<<ก้าวหน้าไปยังเซลล์Gเพื่อเพิ่มมันแล้วไปกลับไปยังเซลล์D

    ณ จุดนี้Dจะถือd (ในความเป็นจริงผลรวมของค่าในส่วนCและDจะเป็นd ) ดังนั้น[<+>-](ในขณะที่Dเป็นบวกเพิ่มCและพร่องD ) จะตั้งCไปDและDเพื่อ0

    สุดท้าย<<retrocedes ไปยังเซลล์B , [<](ไปทางซ้ายในขณะที่มือถือเป็นที่ไม่ใช่ศูนย์) ที่เหลือต่อไปยังเซลล์

ในทั้งสองกรณี>-ก้าวหน้าไปที่เซลล์Bและลดค่าลงและวนรอบจะเริ่มต้นใหม่ยกเว้นกรณีนี้เป็นศูนย์

หลังจากทำซ้ำkแล้วเทปจะมีลักษณะดังต่อไปนี้

       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

หลังจากnซ้ำBจะพุ่งออกมาและเราจะแบ่งออกจากวง ค่าที่ต้องการ ( n% dและn / d ) จะถูกเก็บไว้ในเซลล์DและGดังนั้นจึง>>.>>>.พิมพ์ออกมา


12

Funciton , 224 108 ไบต์

จำนวนไบต์สันนิษฐานว่าเข้ารหัส UTF-16 ด้วย BOM

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

ลองออนไลน์!

ข้างต้นกำหนดฟังก์ชั่นfซึ่งใช้เวลาสองจำนวนเต็มและส่งกลับทั้งการแบ่งและผลิตภัณฑ์ของพวกเขา (ฟังก์ชั่นใน Funciton สามารถมีหลายเอาท์พุทตราบใดที่ผลรวมของอินพุตและเอาต์พุตไม่เกิน 4)

การใช้ค่าอินพุตสองค่าสำหรับวัตถุประสงค์หลายอย่างนั้นเป็นเรื่องเล็กน้อย: คุณเพียงแค่แยกตัวเชื่อมต่อด้วย T-junction ที่ค่าจะถูกทำซ้ำตามทั้งสองสาขาซึ่งเราสามารถป้อนแยกต่างหากกับ built-ins สำหรับการหารและโมดูโล

ที่จริงแล้วฉันใช้เวลาสองเท่าในการหาวิธีแสดงผลลัพธ์ให้กับผู้ใช้มากกว่าเพียงแค่ใช้โซลูชัน

นอกจากนี้ Funciton มีในตัว divmod, ÷%และสนุกสนานในการสร้างอิน÷และ%ที่ใช้วิธีการแก้ปัญหาของฉันจะดำเนินการในแง่ของ ÷%อย่างไรก็ตามฟังก์ชั่นของฉันfด้านบนนั้นไม่เหมือนกันมาก÷% : ฉันต้องสลับลำดับของอินพุตและแม้ว่ามันจะดูเหมือนว่ามันควรจะง่ายต่อการเปลี่ยนแปลงสิ่งนั้นจนถึงตอนนี้ฉันยังไม่สามารถทำได้โดยไม่เพิ่มจำนวนไบต์ .


10

JavaScript (ES6), 17 ไบต์

ขอบคุณ @Arnauld สำหรับการตีหนึ่งไบต์

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

รับอินพุตในรูปแบบ (x) (y)

รับค่าพื้นของ x / y โดยการดำเนินการ bitwise หรือ
รับค่าที่เหลือโดย x% y
ทำให้ค่าทั้งสองในอาร์เรย์เพื่อให้พวกเขาทั้งสองสามารถกลับมา

ลองออนไลน์!


10

APL (Dyalog) 5 ไบต์

-2 ไบต์ต้องขอบคุณ @ngn

⌊÷,|⍨

นี่คือ atop (2-train) ของ fork (3-train) โดยที่ฟันซี่ด้านขวาของ atop เป็นฟังก์ชั่นที่ได้รับ (ผลลัพธ์ของโอเปอเรเตอร์ที่นำไปใช้กับฟังก์ชั่น):

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

 ชั้นของ

÷ แผนก

, catenated ไปที่

| ส่วนที่เหลือ
 ด้วยอาร์กิวเมนต์ที่สลับกัน (APL โมดูลัสคือ "ย้อนกลับ")

ลองออนไลน์!


คุณทำไดอะแกรมเจ๋ง ๆ ได้อย่างไร?
emiflake

2
@ WolfgangTS อย่างระมัดระวัง Dyalog APL มาพร้อมกับความสามารถในการทำแผนผังแผนผังของฟังก์ชันโดยปริยาย ลองออนไลน์! ฉันเริ่มต้นด้วย ...
2560

อุ๊ยดูยากมาก ฉันไม่มีความอดทนในสิ่งที่ฉันกลัวฮ่าฮ่า
emiflake

สั้นกว่า:⌊÷,|⍨
ngn

@ngn Ouch คุณได้รับฉัน มีความสุขที่ได้เห็นว่าคุณยังอยู่ที่นี่
อดัม

7

Brachylogขนาด 6 ไบต์

{÷|%}ᶠ

ลองออนไลน์!

คำอธิบาย

เราใช้ metapredicate ᶠ findallเพื่อใช้เพรดิเคตที่แตกต่างกันสองรายการในรายการอินพุตของสองอาร์กิวเมนต์:

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

7

MATL , 12 10 ไบต์

Qt:ie=&fhq

การป้อนข้อมูลเป็นแล้วa bเอาต์พุตเป็นส่วนที่เหลือจากนั้นหารด้วย

ลองออนไลน์!

คำอธิบาย

วิธีนี้หลีกเลี่ยงทั้งโมดูโลและการหาร แต่จะใช้การปรับเปลี่ยนอาร์เรย์ :

  1. สร้างอาร์เรย์ของa+1องค์ประกอบที่ไม่ใช่ศูนย์
  2. ก่อร่างใหม่เป็นอาร์เรย์ของbแถว2 มิติ แผ่นนี้โดยอัตโนมัติด้วยศูนย์ถ้าจำเป็น
  3. ดัชนีแถวและคอลัมน์ของรายการที่ไม่ใช่ศูนย์ล่าสุดลบ1เป็นลำดับที่เหลือและหาร

พิจารณาตัวอย่างเช่น,a=7b=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
นี่เป็นตัวอย่างที่ดีของการคิดด้านข้างทำงานดีมาก!
Leo

6

Mathematica, 20 18 ไบต์

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

การใช้กฎเอาท์พุทที่มีความยืดหยุ่นเล็กน้อยในทางที่ผิด: ผลลัพธ์จะได้รับเป็นdiv[mod]ซึ่งจะไม่มีการประเมินค่า ตัวเลขแต่ละคนจะถูกสกัดด้วยและresult[[0]]result[[1]]

และเฮ้มันเป็นเพียงหนึ่งไบต์นานกว่าชื่อขันในQuotientRemainderตัว

Mathematica มีวิธีที่เป็นระเบียบในการนำฟังก์ชั่นหลาย ๆ อย่างมาใช้กับอินพุตเดียวกัน แต่มันยาวกว่าสามไบต์:

Through@*{Quotient,Mod}

1
คุณจะรู้ว่ามันไม่ดีเมื่อภาษาของคุณสร้างบิวด์อินที่รวมบิวด์อินไว้ได้ง่าย
Fatalize

1
@ ทำให้มันเป็นอย่างไร ฉันพบว่า divmod บิวด์อินค่อนข้างมีประโยชน์และ Mathematica นั้นไม่ใช่ภาษาเดียวที่มี
Martin Ender

8
@ สรุปผลงานที่เหมือนกันจำนวนมากจำเป็นต้องคำนวณผลรวมตามที่จำเป็นในการคำนวณเศษเหลือ หากต้องใช้ผลลัพธ์ทั้งคู่บิวด์อินที่ได้รับการออกแบบมาอย่างเหมาะสมquotRemจะสามารถประหยัดเวลาได้อย่างมากสำหรับการโทรquotและremแยกจากกัน
Julian Wolf

6

05AB1E , 5 ไบต์

÷²¹%‚

ลองออนไลน์!

05AB1E มีข้อผิดพลาดดังนั้นอินพุตโดยนัยไม่ทำงาน :( Emignaตั้งข้อสังเกตว่าอินพุตมักถูกส่งกลับ


คุณสามารถทำ÷²¹%) เป็นเวลา 5 ไบต์
Emigna

@Emigna ฉันไม่ทราบว่ามันถูกต้องแม้ว่า เดี๋ยวก่อนมันทำงานยังไง?
Erik the Outgolfer

1
ฉันไม่เห็นสาเหตุที่ไม่ถูกต้อง ใช้งานได้เนื่องจากอินพุตโดยนัยถูกส่งไปยังสแต็กในลำดับย้อนกลับของสิ่งที่คุณสมมติในกรณีเช่นนี้
Emigna

@Emigna ฉันได้ถาม OP ว่าฉันสามารถย้อนกลับข้อโต้แย้ง
Erik the Outgolfer

2
ฉันใช้เวลาที่จะหมายความว่าคุณจะสามารถตัดสินใจได้ว่าปัจจัยการผลิตถูกนำมาเป็นYou may choose any format you like for both input and output, as long as the two numbers are clearly distinguishable divisor, dividendคุณสามารถระบุ "อินพุตถูกใช้เป็นdivisor, dividend" ในคำตอบและพวกเขาจะแยกแยะได้ชัดเจน :)
Emigna

6

แมงกะพรุนขนาด 14 ไบต์

p
m
,|S
% i
Ei

ลองออนไลน์!

คำอธิบาย

แมงกะพรุนเป็นภาษาที่สวยงามเมื่อพูดถึงการใช้หลายฟังก์ชั่นกับอินพุตเดียวกัน ภาษาคือ 2D และฟังก์ชั่นไบนารีทั้งหมดมองไปทางทิศใต้สำหรับอินพุตหนึ่งและตะวันออกอีกอันหนึ่ง ดังนั้นโดยการเข้าใกล้ค่าหนึ่งจากตะวันตกและจากทางเหนือเราสามารถป้อนมันเป็นสองฟังก์ชันโดยไม่ต้องทำซ้ำในรหัส

สองis ในโปรแกรมจะถูกแทนที่ด้วยค่าอินพุตสองค่าเมื่อโปรแกรมเริ่มทำงาน ตอนนี้%คือการแบ่ง ใช้เวลาหนึ่งอินพุตโดยตรงจากทางทิศตะวันออกและเมื่อไปทางทิศใต้ก็กระทบกับสิ่งEที่เปลี่ยนเส้นทางที่ค้นหาทางทิศตะวันออกเช่นกัน ดังนั้นอินพุตทั้งสองจึงถูกป้อนเข้า%เป็นอาร์กิวเมนต์

| เป็นแบบในตัวสำหรับโมดูโลซึ่งโดยทั่วไปแล้วก็ทำสิ่งเดียวกัน แต่จบลงด้วยการมองไปทางทิศใต้เพื่อดูทั้งสองอย่าง

เราเชื่อมผลลัพธ์ทั้งคู่เข้าด้วย,กัน จากนั้นmเป็นหน้าที่ชั้น (ซึ่งเราต้องเพราะ%ส่วนลอยจุด) pและในที่สุดเราพิมพ์ผลกับ


6

Cubix , 12 13ไบต์

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

แมปใดลงบนคิวบ์ต่อไปนี้

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

ลองที่นี่

คำอธิบายด้วยขั้นตอนที่ดำเนินการ
,I|I,- เริ่มต้นด้วยการหารจำนวนเต็ม superflous ได้รับจำนวนเต็มแรกจากการป้อนข้อมูลสะท้อนกลับและได้รับจำนวนเต็มถัดไปจากการป้อนข้อมูลจากนั้นหารอีกครั้ง
O;- เอาท์พุทผลลัพธ์ของการหารจำนวนเต็มและ pop
%-do mod สิ่งนี้สามารถทำได้ในภายหลัง แต่จบลงที่นี่
S\o- เพิ่มอักขระช่องว่างให้กับสแต็กเปลี่ยนเส้นทางและพื้นที่เอาต์พุต
W;- เลื่อนซ้ายและป๊อปพื้นที่จากสแต็ค
O|@- ส่งออก mod ที่คำนวณมาก่อนหน้านี้ผ่านตัวสะท้อนแนวนอนและหยุด


เอาชนะฉันสองนาที คำตอบที่ดี!
ลุค

@ ลุคขอบคุณคิดว่าฉันจะได้อีกหนึ่งออก แต่พิสูจน์ยาก
MickyT

6

Brain-Flak , 56 54 ไบต์

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

ลองออนไลน์!

-2 ไบต์ด้วยตัวช่วยสร้างข้าวสาลี

คำอธิบาย

ปัจจุบันเป็นที่รู้จักกันดีที่สุดแบ่งจำนวนเต็มและโมดูโลใน Brain-Flak จะคล้ายกันมาก (ในความเป็นจริงที่ใช้ในปัจจุบันส่วนจำนวนเต็มเป็นเพียงการปรับเปลี่ยนที่ผมทำในfeersum 's โมดูโล)

การเปรียบเทียบโมดูโลและการหารจำนวนเต็ม:
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

สะดวกยิ่งขึ้นโปรแกรมการแบ่งจำนวนเต็มใช้เฉพาะกองที่สามสำหรับจัดเก็บข้อมูลในขณะที่โปรแกรมโมดูโลใช้เพียงสองกองปกติสำหรับจัดเก็บข้อมูล ดังนั้นเพียงแค่เรียกใช้พวกเขาทั้งสองในเวลาเดียวกันพวกเขาจะไม่ชนกัน

การรวมกันของโมดูโลและการหารจำนวนเต็ม:
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

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

ในที่สุดทั้งโปรแกรมการแบ่งจำนวนเต็มและโปรแกรมโมดูโลที่ใช้ในการรวมกันนี้ได้รับการออกแบบให้มีความสะอาด (ไม่ทิ้งขยะบนสแต็ค / ไม่ขึ้นอยู่กับการมีอยู่ (ไม่ใช่) ของค่าในสแต็กอื่นนอกเหนือจากอินพุต) สำหรับปัญหานี้ ดังนั้นเราสามารถบันทึกสองไบต์ได้โดยไม่รบกวนการเติมศูนย์ในตอนท้ายของลูปหลักและอีกสองไบต์โดยไม่กดศูนย์ในตอนเริ่มต้นแทนที่จะอาศัยการเติมเต็มศูนย์ที่ด้านล่างของสแต็ก

สิ่งนี้ทำให้เรามีโปรแกรมสุดท้าย:
({}<>)<>([()]{()<(({})){({}[()])<>}{}>}<><([{}()]{})>)

สำหรับคำอธิบายสำหรับโปรแกรมการหารจำนวนเต็มดูคำตอบของ feersum

คำอธิบายส่วนจำนวนเต็มเร็ว ๆ นี้ ...


5

Java 8, 18 Bytes

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

BiFunction<Integer, Integer, String>นี่คือการแสดงออกแลมบ์ดาประเภท

ฉันแปลกใจ ... นี่เป็นวิธีแก้ปัญหาที่ค่อนข้างรัดกุมสำหรับ Java แสดงออกแลมบ์ดา!


5

Brain-Flak , 168 148 110 ไบต์

ฉันเดาว่าฉันควรจะตรวจสอบWikiก่อน

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

รูปแบบ:

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

ลองออนไลน์!

(({})(<           # 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 ไบต์

รหัส 35 ไบต์ +1 สำหรับ-rธง

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

รับอินพุตเป็น unary คั่นด้วยช่องว่างด้วยจำนวนที่น้อยกว่าก่อน เอาท์พุทเป็นเอกที่มีความฉลาดเป็นครั้งแรกใน1s และครั้งที่สองที่เหลือในxs (หากนี่ไม่เป็นที่ยอมรับโปรดแจ้งให้เราทราบและฉันจะเปลี่ยนเป็นช่องว่างคั่น1เหมือนอินพุต)

คำอธิบาย

: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 ไบต์

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

คำอธิบาย

การป้อนข้อมูลที่อยู่ในเซลล์และA1 B1นี่เป็นการคืนค่าส่งคืนของFLOORและMODฟังก์ชันซึ่งใช้สำหรับการแบ่งส่วนและส่วนที่เหลือ ค่าเหล่านี้คั่นด้วยเครื่องหมายจุลภาค


ฉันคิดว่าคุณหมายถึงเซลล์ A1 และ B1 ไม่ใช่ A1 และ A2
fəˈnɛtɪk

ใช่ขอบคุณ. แก้ไขแล้ว
ลุค

บันทึก 1 ไบต์ด้วยFLOOR(A1/B1;1)แทนQUOTIENT(A1;B1)
Engineer Toast

เนื่องจากอินพุตเป็นจำนวนธรรมชาติเสมอฉันคิดว่าคุณสามารถแทนที่FLOOR(A1/B1;1)ด้วย `INT (A1 / B1) 'เพื่อประหยัด 4 ไบต์เพิ่มเติม
Wernisch



4

OIL , 134 106 103 102 ไบต์

รับอินพุตจาก stdin ตัวเลขสองตัวแยกจากกันโดยขึ้นบรรทัดใหม่ ส่งออกผลลัพธ์ของการหารจำนวนเต็มจากนั้นขึ้นบรรทัดใหม่แล้วตามด้วยส่วนที่เหลือ

นี่เป็นหนึ่งในโปรแกรม OIL ที่ซับซ้อนที่สุดเท่าที่ฉันเคยเขียนมาเนื่องจาก OIL ขาด builtins สำหรับการแบ่งแยกส่วนที่เหลือการบวกการลบและอื่น ๆ มันทำงานร่วมกับวิธีการดั้งเดิมของการแบ่ง: ซ้ำซ้อนลดลงซ้อนกัน

ฉันแสดงรหัสในรูปแบบที่มีคำอธิบายประกอบพร้อมความคิดเห็นในรูปแบบของภาษาสคริปต์ ก่อนที่จะดำเนินการความคิดเห็นจะต้องถูกลบออก

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)

แก้ไข: ลบออกอีก 3 ไบต์โดยการย้าย "ค่าคงที่" ไปยังตำแหน่งหนึ่งหลัก (ไบต์น้อยกว่าเพื่ออ้างอิง) จากนั้นตั้งศูนย์ 0 ตำแหน่ง (โดยใช้บรรทัดว่างแทนหนึ่งในนั้นฉันสามารถทำได้ ก่อน).

แก้ไข: และอีกหนึ่งไบต์โดยกำหนดค่าเริ่มต้นเป็นศูนย์ เราต้องการเพียงศูนย์อักษรเดียว


การทำงานที่ดี! นั่นเป็นคำตอบที่ฉันคาดหวังว่าความท้าทายนี้จะได้รับ :) แค่ทราบ: คุณรับประกันได้ว่าตัวหารจะเป็นบวกอย่างเคร่งครัดเสมอดังนั้นคุณไม่จำเป็นต้องตรวจสอบการหารด้วย 0;)
Leo

@Leo ฉันรับประกันได้ว่าตัวหารจะเป็นบวกในตอนเริ่มต้นเสมอ มันจะไม่ทำงานถ้าฉันแยกส่วนออกจากศูนย์ส่วนกรณีนี้สามารถเกิดขึ้นได้แม้ว่าการแบ่ง "จริง" เป็นปกติ หากฉันจำอย่างถูกต้องสิ่งนี้จะเกิดขึ้นเมื่อส่วนที่เหลือเป็นศูนย์
L3viathan

ฉันกำลังพูดถึงการตรวจสอบที่บรรทัดที่ 4 ไม่ใช่ที่บรรทัดที่ 12 ... มันไม่ทำงานเพียงครั้งเดียวเมื่อเริ่มต้นโปรแกรมหรือไม่
Leo

@ เลโอเสร็จแล้วเกือบ 30 ตัวอักษรน้อยลงขอบคุณ!
L3viathan

4

เรติน่า 14 ไบต์

มาทำผิดวิธีรูปแบบอินพุต / เอาต์พุต!

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

รับอินพุตเป็นb\naunary โดยใช้สำหรับตัวอักษรแบบเอกอักษรทุกตัวที่ไม่ใช่ตัวเลขและไม่ใช่บรรทัดใหม่ ส่งออกผลหารในทศนิยมตามด้วยส่วนที่เหลือเป็น unary ทันทีโดยใช้อักขระเดียวกันกับอินพุต

ลองออนไลน์!

(.*) ¶(\1)*จับคู่หมายเลขแรกจากนั้นบรรทัดใหม่ (¶คือการจดชวเลขของ Retina สำหรับ \ n) จากนั้นหมายเลขแรกอีกครั้งหลาย ๆ ครั้งที่เป็นไปได้ จำนวนการแข่งขันของกลุ่มที่สองจะเป็นผลลัพธ์ของการหารและส่วนที่ไม่ตรงกันจะเป็นส่วนที่เหลือ

ด้วย$#2เราแทนที่ทุกสิ่งที่จับคู่ในบรรทัดก่อนหน้าด้วยจำนวนการดักจับของกลุ่มที่สองและรับผลลัพธ์ของเรา


ฮ่าฮ่าค่อนข้างถูกต้องฉันไม่ควรเขียนรายการที่ล่าช้าในตอนเย็น
FryAmTheEggman

4

ArnoldC , 286 283 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

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

รูปแบบผลลัพธ์

a/b
a mod b

3

เขาวงกต 11 ไบต์

?:?:}/!\{%!

ลองออนไลน์!

คำอธิบาย

?:   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 จะเข้าสู่จุดสิ้นสุดและหมุนไปรอบ ๆ และโปรแกรมจะหยุดทำงานเนื่องจากการหารที่พยายามเป็นศูนย์เมื่อ%ถูกดำเนินการอีกครั้ง



3

> <> , 27 26 16 + 1 = 17 ไบต์

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

บันทึก

  • อินพุตโดยใช้-vแฟล็กดู TIO สำหรับตัวอย่าง
  • สิ่งนี้จะส่งออกส่วนที่เหลือก่อนจากนั้นเครื่องหมายจุลภาคและสุดท้ายหารจำนวนเต็ม

ลองออนไลน์!

คำอธิบาย

โปรดทราบว่าสแต็กเริ่มต้นเป็นA, Bที่AและBแสดงถึงอินพุตแรกและที่สองเนื่องจากการ-vใช้ธง

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

คุณสามารถระบุค่าอินพุตได้สูงสุด 255 ได้อย่างไร
Leo

เพียงใช้ค่า ASCII / Unicode ที่สูงขึ้น ด้วยวิธีนี้įกลายเป็น 255
ลุค

ตกลงเป็นคนดี :) ยังไงก็ตามมันจะสั้นกว่าหรือไม่ที่จะรับหมายเลขอินพุตจากบรรทัดคำสั่งโดยตรงด้วยแฟล็ก -v?
Leo

เป็นไปได้ แต่ฉันไม่สามารถทำงานกับ TIO ได้ดังนั้นฉันจึงตัดสินใจใช้โซลูชันนี้ มันจะประหยัด 8 ไบต์ - 1 (สำหรับ-vธง)
ลูกา


3

C, 21 ไบต์

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

แมโครที่แทนที่ f (a, b) โดยคั่นด้วยเครื่องหมายจุลภาค 2 คำ แม้ว่าคุณจะดีกว่าที่จะส่งผ่านไปยังฟังก์ชั่นมิฉะนั้นก็ไม่มีทางที่จะเลือกทั้งสองออกจากกัน

ลองใช้ออนไลน์


3

Haskell , 21 ไบต์

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

ลองออนไลน์! ตัวอย่างการใช้งาน: ผลตอบแทน13#2 (6,1)ใช่มันค่อนข้างน่าเบื่อ แต่ก็น่าสนใจกว่าdivModbuild-in ที่ทำงานเหมือนกันเล็กน้อย

ในขณะที่เราอยู่ที่นั้นยังมีquot, remและquotRemที่มีลักษณะการทำงานเดียวกันกับตัวเลขธรรมชาติdiv, และmod divModอย่างไรก็ตามสำหรับปัจจัยลบนั้นผลของการmodมีสัญญาณเช่นเดียวกับตัวหารในขณะที่ผลของการremมีสัญญาณเช่นเดียวกับเงินปันผล หรือเป็นที่ใส่ในเอกสารโหมโรง , quotเป็นส่วนจำนวนเต็มตัดทอนไปยังศูนย์และdivเป็นจำนวนเต็มส่วนถูกตัดทอนไปทางอินฟินิตี้เชิงลบ


วิธีการเกี่ยวกับไม่มีdivหรือmodสร้างอิน?

ไม่มีบิลด์อิน, 36 32 31 ไบต์

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

ลองออนไลน์! ตัวอย่างการใช้งาน: 13#2คืนค่า(1,6)นั่นคือmodผลลัพธ์เป็นครั้งแรกและdivผลลัพธ์เป็นวินาที หากaมีขนาดเล็กbแล้ว a mod bเป็นaและa div bเป็น0จึง(a,0)ถูกส่งกลับ มิฉะนั้นซ้ำคำนวณmodและdivของa-bและbเพิ่ม1ผลการแบ่งและเก็บส่วนที่เหลือ

การเพิ่ม 1 ไปยังผลลัพธ์การหารทำได้โดยการใช้<$>ซึ่งโดยทั่วไปจะใช้mapเพื่อแมปฟังก์ชันเหนือรายการ แต่ทำงานบน tuples ด้วยเช่นกันอย่างไรก็ตามฟังก์ชันนี้ใช้กับองค์ประกอบ tuple ตัวที่สองเท่านั้น

แก้ไข: บันทึกหนึ่งไบต์ต้องขอบคุณ xnor!


2
วิธีการแก้ปัญหาที่สองของคุณสามารถโกนไบต์ใช้ในขอบเขตของการทำหน้าที่ในองค์ประกอบที่สอง:<$> a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b
xnor

3

SWI Prolog ขนาด 109 ไบต์

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

เอาท์พุท:

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

รายละเอียด:

อัลกอริทึมแบบเรียกซ้ำง่าย ๆ โดยไม่ต้องมีตัวหารหรือโมดูโล มันนับง่ายๆว่า "จำนวนที่พอดีกับตัวเลขที่สองในจำนวนแรกมีกี่ครั้ง" และรายงานผลลัพธ์ (รวมเป็น D) ด้วยส่วนที่เหลือ (R)

// edit: ลบช่องว่างที่ไม่จำเป็นออก


ยินดีต้อนรับสู่ PPCG! ฉันไม่เคยใช้ Prolog มาก่อน แต่สังเกตว่ามีช่องว่าง:-ในบรรทัดสุดท้าย แต่ไม่ใช่ที่อื่น ๆ พวกเขาจำเป็นต้องมีด้วยเหตุผลบางอย่าง? ในขณะเดียวกันE + 1ก็F-Sแนะนำว่าไม่จำเป็นต้องมีช่องว่าง
Laikoni

Laikoni: ถูกต้องแน่นอน! ฉันเพิ่งลบช่องว่างและนับไบต์สุดท้ายที่อัปเดตแล้ว
Jan Drozen


2

MATL, 5 ไบต์

/k&G\

ลองใช้ที่MATL Online!

คำอธิบาย

        % 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 ไบต์

r.r.@/Inao\%n1(

ใช้ตัวเลขในลำดับย้อนกลับ (เช่น10 42) ลองที่นี่

คำอธิบาย

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.