ผู้ประกอบการที่รวมผลรวมผลิตภัณฑ์และความแตกต่างระหว่างสองตัวเลข


28

ท้าทาย:

มีจิ๊กซอว์งี่เง่าเวียนอยู่บนเครือข่ายสังคมที่อ่าน:

8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?

ใช้ฟังก์ชั่นหรือผู้ประกอบการที่เมื่อได้รับตัวเลขสองจำนวนเต็มบวกxและyเช่นว่าx > y > 0ถัวเฉลี่ยตอบที่ถูกต้องเป็นจำนวนเต็มซึ่งตัวเลขคำตอบเป็นตัวเลขของx * yตามด้วยตัวเลขของตามด้วยตัวเลขของx + y x - yง่ายมาก.

กฎ:

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

รหัสตัวอย่าง:

Dyalog APL :

รหัสต่อไปนี้จะสร้างผู้ประกอบการ dyadic Xชื่อ

X ← {(⍺-⍵) + ((⍺ + ⍵) × 10 * 1 + ⌊10⍟⍺-⍵) + ⍺×⍵× 10 * (2 + + ⌊10⍟⍺⍵) + ⌊10⍟⍺- ⍵}

คำอธิบาย:

  • ใน APL คุณประเมินจากขวาไปซ้าย

  • ⍺ and ⍵ เป็นตัวถูกดำเนินการทางซ้ายและขวาตามลำดับ

  • ⌊10⍟⍺-⍵อ่าน: floor of log10(⍺-⍵). ก่อนอื่นทำการ substraction แล้วลอการิทึมจากนั้นทำการปูพื้น จากขวาไปซ้าย log10 เสร็จสิ้นเพื่อนับตัวเลขของ⍺-⍵(คุณต้องบวก 1 หลังจากนั้น)

  • ⍺×⍵×10*(...) อ่าน: 10 to the (...)th power, multiplied by ⍵, multiplied by ⍺

  • ดังนั้น⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵ผลิตภัณฑ์คือเลื่อนไปทางซ้ายโดยผลรวมของจำนวนตัวเลขของผลรวมและความแตกต่าง การคูณด้วยกำลัง 10 จะเลื่อนจำนวนเต็มไปทางซ้าย

  • ((⍺+⍵)×10*1+⌊10⍟⍺-⍵) คือผลรวมเลื่อนไปทางซ้ายตามจำนวนตัวเลขของความแตกต่าง

  • (⍺-⍵)คือความแตกต่าง ไม่จำเป็นต้องเปลี่ยนที่นี่

  • X←{...} เป็นวิธีที่คุณกำหนดโอเปอเรเตอร์ใน APL

ตัวอย่าง:

      8 X 2
16106
      5 X 4
2091
      9 X 6
54153

GNU dc:

รหัสต่อไปนี้สร้างแมโครชื่อa:

[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa

คำอธิบาย:

  • sxและsyวางองค์ประกอบจากสแต็กและบันทึกลงในรีจิสเตอร์xและyตามลำดับ

  • lxและlyโหลดองค์ประกอบจากการลงทะเบียนxและyตามลำดับและผลักมันไปยังสแต็ค

  • d ทำซ้ำองค์ประกอบสุดท้ายในสแต็ก

  • ^ คำนวณพลังของตัวเลขสองจำนวน

  • Zดึงตัวเลขและส่งกลับจำนวนหลัก สิ่งนี้ทำได้เนื่องจากdcไม่มีฟังก์ชันลอการิทึม

  • [...]saaเก็บแมโครในการลงทะเบียน laโหลดมัน xเรียกใช้แมโครที่ด้านบนสุดของสแต็ก

ตัวอย่าง:

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153

ฉันถือว่าการแปลงจากจำนวนเต็มเป็นสตริงไม่ถูกต้อง?
Anthony Pham

2
ฉันคิดว่าเรามีสิ่งที่ท้าทายมากเช่นนี้ แต่ไม่รู้ว่าคำใดที่จะพบกับดัก
xnor

2
@AnthonyPham "คุณไม่ได้รับอนุญาตให้ใช้สตริงหรือการต่อข้อมูลประเภทใดก็ได้ในรหัสของคุณ"
ASCII เท่านั้นเท่านั้น

1
เราสามารถนำจำนวนเต็มเป็นคู่ได้หรือไม่?
Conor O'Brien

1
ฉันสามารถสร้างโปรแกรมเต็มรูปแบบแทนฟังก์ชั่นได้หรือไม่?
Erik the Outgolfer

คำตอบ:


10

JavaScript (ES7), 63 61 59 ไบต์

ที่บันทึกไว้ 4 ไบต์ขอบคุณที่นีล

(a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c)

<input id=a type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c))(+a.value,+b.value)">
<input id=b type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-!Math.log10(c)+c))(+a.value,+b.value)">
<p id=c>


10**-~Math.log10(c)บันทึกไม่กี่ไบต์โดยใช้ (แต่ +1 สำหรับการใช้reduceงานแน่นอน)
Neil

"ES7" โอ้ด้วยความรักในการเขียนโค้ด ... พวกเขากำลังทำอีกหนึ่งหรือไม่
Feathercrown

@ Heathcrown ใช่ แต่มันเลวร้ายยิ่งกว่าการได้ยิน "Java 9" หรือไม่? นอกจากนี้ยังมีสิ่งที่มีประโยชน์เช่นasync/ awaitและตัวดำเนินการยกกำลัง**
ASCII- เท่านั้น

@ ASCII- เท่านั้น**มีประโยชน์จริง ๆ ฉันเห็นด้วย ที่ควรจะเป็นใน ES6
Feathercrown


6

Bash, 66

  • บันทึก 2 ไบต์ด้วย @chepner
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

ลองมันออนไลน์


เป็นไปได้ที่จะทำให้สั้นลงเกือบสองเท่าหากคุณวางตัวแปร (s, d และอีกอันหนึ่งสำหรับการคูณที่คุณไม่ได้กำหนด) ไว้ติดกันและประเมินว่าเป็นการแสดงออกทางคณิตศาสตร์
Maxim Mikhaylov

3
@ MaxLawnboy ใช่แม้ว่ามันจะฟังดูคล้ายกับการตัดสายที่ถูกแบนเข้ากับฉัน
Digital Trauma

1
ชื่อตัวระบุภายใน$[...]นั้นขึ้นอยู่กับการขยายพารามิเตอร์โดยไม่ต้องชัดเจน$(เช่นdแทน$d) การบันทึกอักขระสองตัว
chepner

@chepner yep - ขอบคุณ - ฉันพลาดไปแล้ว
Digital Trauma

พบอีกสองคน; ใช้((s=$1+$2,d=$1-$2))เพื่อทำให้ตัวแปรทั้งสองเป็นตัวเอียง
chepner


5

ซ้อนกัน , 36 ไบต์

,@A$(*+-){!A...n!}"!{%y#'10\^x*y+}#\

ลองออนไลน์!

ก่อนหน้านี้: ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^1\,\*sum

ฉันจะพยายามบีบเอาหนึ่งหรือสองไบต์ก่อนเขียนคำอธิบาย ( #'ขนาด = ของและ"เป็น "ทำในแต่ละ" ไม่มีการแนบสตริงที่นี่)

Noncompeting ที่ 26 $(*+-)#!!:{%y#'10\^x*y+}#\ไบต์:



4

GNU dc, 36

กำหนดมาโครmที่รับสมาชิกสองคนแรกของสแต็กนำมาใช้กับแมโคและทิ้งผลลัพธ์ไว้ในสแต็ก (ตามตัวอย่างในคำถาม):

[sadsbla-dZAr^lalb+*+dZAr^lalb**+]sm

ลองมันออนไลน์


3

Perl 6 ,  81 61  58 ไบต์

->\x,\y{($/=($/=x- y)+(x+y)*({10**$++}...*>$/).tail)+x*y*({10**$++}...*>$/).tail}

ลองมัน

->\x,\y{(x*y,x+y,x- y).reduce:{$^a*10**Int(1+log10($^b))+$b}}

ลองมัน

->\x,\y{[[&({$^a*10**Int(1+$^b.log10)+$b})]] x*y,x+y,x- y}

ลองมัน


ไม่รู้ว่าเป็น Perl 6 ฉันรู้สึกประหลาดใจเล็กน้อยที่ค้นพบว่าx-yเป็นตัวระบุที่ถูกต้อง
Neil

3

เยลลี่ , 27 ไบต์

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵*
ạ,+,×Fæ.ç

กำหนดให้การเชื่อมโยง dyadic / ฟังก์ชั่น callable çกับ รับจำนวนเต็มสองตัวเป็นอินพุตและส่งคืนเลขจำนวนเต็ม มันมีโบนัสเพิ่มของความสามารถในการใช้<xy หรือ x> xy โดยใช้ความแตกต่างแน่นอน

ลองออนไลน์!

คำอธิบาย:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create link which computes what order of magnitude
                        to multiply the difference, sum, and product by
ạ,+,×Fæ.ç         -- Main link, applies this using dot product

รายละเอียด:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create dyadic like which does the following:
       l⁵Ḟ‘       -- Create operation which computes number of digits
                       (log base 10 (⁵ is the literal 10), floored, incremented)
           €      -- Apply this to each element in
+,ạ,.1F           -- ... the list [sum,difference,.1]
            R     -- Reverse the list
             +\   -- Add up first n elements to get list.
               ⁵* -- Raise 10 (⁵ is literal 10) to the power of each element

ạ,+,×Fæ.ç         -- Main link, applies above link
ạ,+,×F            -- The list [difference, sum, product]
      æ.          -- Dot product (multiply corresponding elements) with
        ç         -- The above link.

2

PHP, 79 75 ไบต์

สองรุ่น:

[,$a,$b]=$argv;echo(10**strlen($s=$a+$b)*$a*$b+$s)*10**strlen($d=$a-$b)+$d;
[,$a,$b]=$argv;echo(10**strlen($a+$b)*$a*$b+$a+$b)*10**strlen($a-$b)+$a-$b;

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง -rทำงานด้วย

ฉันเดาว่าstrlenมีคุณสมบัติเป็น "ฟังก์ชั่นที่ส่งกลับจำนวนหลัก"
แม้ว่ามันจะใช้ตัวเลขเป็นสตริง แจ้งให้เราทราบหากไม่


'คุณไม่ได้รับอนุญาตให้ใช้สตริงหรือการต่อข้อมูลใด ๆ ในรหัสของคุณ' ดังนั้นฉันคิดว่าไม่strlenถูกต้อง
numbermaniac

@ จำนวนช่างให้ OP ตัดสินใจได้ ข้อ จำกัด ของ Imo คือการบังคับให้โซลูชันสร้างผลลัพธ์หนึ่งผลลัพธ์แทนที่จะพิมพ์ผลลัพธ์สามรายการต่อกัน ทุกสิ่งที่นอกเหนือจากนั้นคือ nitpicking
ติตัส

2

C (gcc) , 70 ไบต์

#define _ for(c=1;a+b>=(c*=10););d=c*d+a-(b=-b);
c,d;f(a,b){d=a*b;_ _}

ลองออนไลน์!

ขึ้นอยู่กับคำตอบของSteadyboxทำให้ทุกอย่างเป็นเรื่องที่น่าสนใจยิ่งขึ้น

(หมายเหตุ: การกำหนดผลลัพธ์ให้dแทนการaทำงานโดยไม่คาดคิดฉันได้ดูรหัสประกอบที่สร้างขึ้นและดูเหมือนว่าจะโอเค)


2

Haskell, 54 ไบต์

a%0=a
a%b=10*a%div b 10+mod b 10
a#b=(a*b)%(a+b)%(a-b)

ปริศนาถูกดำเนินการผ่านทางฟังก์ชั่นมัดเช่น# 8#2 = 16106ฟังก์ชั่นอื่น ๆ%, กำหนด concatenation ฐาน -10 (สมมติว่า RHS มากกว่า 0)



1

PHP, 87 ไบต์

[,$a,$b]=$argv;echo($s=$a-$b)+($t=$a+$b)*10**($l=strlen($s))+$a*$b*10**($l+strlen($t));

และโซลูชันที่ไม่ถูกต้องสำหรับ 37 ไบต์

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;

1

Ruby, 61 ไบต์

->a,b{[a*b,a+b,a-b].reduce{|x,y|z=y;x*=10while(z>z/=10);x+y}}

ซึ่งมีข้อสงสัยอย่างมากเหมือนคำตอบ Javascript นี้แต่ไม่มีการใช้ลอการิทึม



1

R (3.3.1), 104 ไบต์

function(x,y)Reduce(function(p,q)p*10^(floor(log10(q)+1))+q,lapply(c(`*`,`+`,`-`),function(z)z(x,y)),0)

ส่งคืนฟังก์ชั่นที่ไม่ระบุชื่อ

นี่เป็นความพยายามครั้งแรกของฉันในการเล่นกอล์ฟดังนั้นคำติชมใด ๆ ก็ได้รับการชื่นชม


1
ฉันจะบอกว่าพยายามหลีกเลี่ยงการกำหนดฟังก์ชั่นผ่านทางคำว่า 'function' ที่สงวนไว้หากเป็นไปได้มันใช้ไบต์จำนวนมาก เพียงแค่ทำการคำนวณ
user11599

0

REXX, 70 ไบต์

f:arg a b
c=a-b
c=(a+b)*10**length(c)+c
c=a*b*10**length(c)+c
return c

แน่นอนว่าวิถีทางพื้นเมืองนั้นจะสั้นกว่ามาก:

f:arg a b
return a*b||a+b||a-b

0

PowerShell, 88 ไบต์

param($x,$y)$l=2;if(($a=$x+$y)-gt9){$l++};($x*$y)*[math]::Pow(10,$l)+$a*10+$x-$y

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


0

Python 2.7, 109 96 ไบต์

import math
a=lambda n:10**int(math.log10(10*n))
b,c=input()
d=b-c+(b+c)*a(b-c)
print d+b*c*a(d)

แก้ไขหลังจากทำตามกฎการแข่งขัน เครดิตไปที่mbomb007สำหรับนำรหัสลงมาจาก 109 ไบต์ถึง96 ไบต์


1
จากกฎของการท้าทายนี้ -•You're not allowed to use strings or any kind of concatenation anywhere in your code.
AdmBorkBork

คุณสามารถบันทึกไบต์ได้ด้วยการสร้างaแลมบ์ดา a=lambda n:10**int(.... นอกจากนี้คุณยังสามารถทำได้b,c=input()โดยให้สองอินพุตคั่นด้วยเครื่องหมายจุลภาค
mbomb007

@ mbomb007 b, c = input () ให้ TypeError: วัตถุ 'int' ไม่สามารถทำซ้ำได้ ฉันลองแล้ว และฟังก์ชั่นแลมบ์ดาจะไม่บันทึกไบต์เพราะฉันเรียกฟังก์ชั่นสองครั้งในรหัส ลองเช่นกัน :(
Koishore Roy

@ KoishoreRoy ฉันไม่คิดว่าคุณจะได้รับสิ่งที่ฉันหมายถึง 96 ไบต์
mbomb007

0

J , 25 ไบต์

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- กล่องผลลัพธ์ของการดำเนินการแต่ละอย่าง
  2. 10#.inv&.>แปลงผลลัพธ์แต่ละรายการให้เป็นอาร์เรย์ของตัวเลข 10 หลัก ( invคือ^:_1)
  3. [:; Unbox และเข้าร่วมอาร์เรย์
  4. 10#. แปลงอาเรย์ของเลขฐาน 10 เป็นจำนวนเต็ม
  5. X=.Xกำหนดข้างต้นเป็นผู้ประกอบการ

ผล:

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153

คุณไม่จำเป็นต้องX=.
Cyoce

@Cyoce - ตัวอย่างรหัส APL ในการท้าทายกำหนดผู้ประกอบการ ฉันค่อนข้างแน่ใจว่าเราควรจะกำหนดผู้ประกอบการที่นำกลับมาใช้ใหม่ได้สำหรับความท้าทายนี้
Dane

"3. [:; Unbox และเข้าร่วมอาร์เรย์" - "คุณไม่ได้รับอนุญาตให้ใช้สตริงหรือการต่อข้อมูลประเภทใดก็ได้ในรหัสของคุณ"
ngn

@ngn - โปรดขยายความคิดเห็นของคุณ ไม่มีจุดที่ใช้สตริง
Dane

ฉันแค่อยากจะชี้ให้เห็นว่า "เข้าร่วม" ("ลิงก์"?) อาจประกอบด้วย "การต่อเรียงกัน" แม้ว่าฉันจะไม่คุ้นเคยกับ J และฉันไม่แน่ใจว่าจะตีความคำแถลงปัญหาในกรณีนี้ได้อย่างไร . โซลูชันของฉันทำให้เกิดคำถามที่คล้ายกัน - ฉันใช้ stranding (การวางเคียงกันของคำนามใน APL ในรูปแบบเวกเตอร์) ซึ่งอาจเหมือนกับ "ลิงก์" ของ J แต่ไม่มี glyph เพื่อเป็นตัวแทน
ngn

0

Mathematica, 67 ไบต์

c=Ceiling;l=Log10;#-#2+(#+#2)10^(c@l[#-#2]/. 0->1)+10^c@l[2#]10#2#&

Takes x-y, then takes the log10 of x-y, rounds it up, calculates 10 to the power of that and then multiplies it by x+y. But we also need to consider log10(x-y) being 0, so we replace 0 with 1. Then we take the log10 of 2x, rounded up, plus 1, and find 10 to the power of that. Multiply that by xy, and add that on.


0

05AB1E, 23 22 16 bytes

-Dg°¹²+*Dg°¹²**O

Try it online!

We could have saved a few bytes if we'd been allowed to use strings in the program (but not in calculations) by looping over a string containing the operations "-+*", as the code performed for each operation is the same.
Of course, if we'd been allowed to use concatenation we'd saved a lot more.


0

R, 64 bytes

x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)

Usage:

> x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)
1: 8 2
3: 
Read 2 items
[1] 16106
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.