การสร้างผลรวมที่แตกต่าง


10

คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็มเป็นอินพุทและเอาท์พุทหรือคืนค่าจำนวนเต็มสองตัวซึ่งผลรวมเป็นอันแรก

มีอยู่คนหนึ่งต้องการต่อไปคือ: จำนวนไม่สามารถเป็นส่วนหนึ่งของการส่งออกสำหรับสองปัจจัยการผลิตที่แตกต่างกัน

รายละเอียด

  • คุณควรจะสามารถจัดการอินพุตอย่างน้อยช่วง-32768 .. 32767(รวม)
  • หากประเภทข้อมูลของคุณไม่สามารถจัดการกับจำนวนเต็มโดยพลการได้นั่นเป็นสิ่งที่ดี แต่อัลกอริธึมของคุณควรใช้กับทฤษฎีที่มีขนาดใหญ่และเล็กในทางทฤษฎี

ตัวอย่าง

input => outputแต่ละบล็อกแสดงส่วนหนึ่งของการแก้ปัญหาที่ถูกต้องหรือไม่ถูกต้องในรูปแบบของการ

1 => 6 -5
2 => -2 4
15 => 20 -5

Incorrect, as `-5` is used in two outputs.

-5 => -15 10
0 => 0 0
1 => 5 6
2 => -5 7

Incorrect, as `5 + 6` isn't `1`.

-1 => -1 0
0 => 6 -6
2 => 1 1

Can be correct if other outputs doesn't collide.

นี่คือรหัสกอล์ฟเพื่อให้รายการที่สั้นที่สุดชนะ


คุณสามารถ จำกัด ช่วงอินพุตเป็น -32768 .. 32767 ดังนั้นเราไม่ต้องใช้จำนวนเต็ม 17 บิตหรือไม่?
FUZxxl

@FZZxxl ฉันไม่ดีนั่นคือความตั้งใจ แก้ไขแล้ว.
Randomra

เอาต์พุตสามารถเป็นรายการ / array / tuple / set / etc ที่มีจำนวนเต็มสองตัวได้หรือไม่? (ตัวอย่างเช่น f (1) => [2, -1])
monopole

ดูเหมือนจะมีวิธีแก้ปัญหาหลายอย่างที่ต้องพึ่งพาขนาดจำนวนเต็มแบบ จำกัด - ตัวอย่างเช่นโดยการคูณอินพุตด้วยจำนวนบวกขนาดใหญ่และจำนวนลบขนาดใหญ่ ดูเหมือนว่าสำหรับฉันแล้วการแก้ปัญหาดังกล่าวไม่ผ่านข้อกำหนดที่ว่า "อัลกอริทึมของคุณควรใช้กับทฤษฎีจำนวนน้อยและใหญ่ในทางทฤษฎี" ฉันกำลังอ่านคำถามผิดหรือเปล่า?
mathmandan

คำตอบ:


9

Pyth, 8 ไบต์

_J^Q3+QJ

สาธิต. เทียบเท่ากับรหัส Python 2:

Q=input()
J=Q**3
print -J
print Q+J

ดังนั้นผลลัพธ์มีรูปแบบ (-n**3, n+n**3)

เอาต์พุตบางส่วน:

-5 (125, -130)
-4 (64, -68)
-3 (27, -30)
-2 (8, -10)
-1 (1, -2)
 0 (0, 0)
 1 (-1, 2)
 2 (-8, 10)
 3 (-27, 30)
 4 (-64, 68)
 5 (-125, 130)

เหล่านี้มีความแตกต่างเพราะก้อนอยู่ห่างไกลระยะห่างพอที่เพิ่มnจะn**3ไม่เพียงพอที่จะข้ามช่องว่างก้อนถัดไป: n**3 < n+n**3 < (n+1)**3สำหรับในเชิงบวกและเชิงลบแฟ่บnn


คุณไม่ต้องการ,ที่จุดเริ่มต้นอนุญาตให้มีสองบรรทัดได้
Maltysen

@Maltysen ฉันลองลบมันออกไป แต่มีเพียงตัวเลขที่สองเท่านั้นที่พิมพ์ออกมา บางทีการJมอบหมายอาจหยุดพิมพ์ได้?
xnor

โอ้ใช่ถูกต้องขอโทษ
Maltysen

-ใน pyth ไม่ได้เป็นผู้ประกอบการปฏิเสธเอกมัน_ดังนั้น_J^Q3+QJทำงานตามที่คาดไว้
Maltysen

@ Maltysen ที่จริงแล้วใช้ได้ผลฉันแค่ต้องการJไม่ให้อยู่ข้างนอก ขอบคุณสำหรับการกระตุ้นฉันเกี่ยวกับเรื่องนี้
xnor

8

มนุษย์หิมะ 0.1.0 , 101 ตัวอักษร

}vg0aa@@*45,eQ.:?}0AaG0`NdE`;:?}1;bI%10sB%nM2np`*`%.*#NaBna!*+#@~%@0nG\]:.;:;bI~0-NdEnMtSsP" "sP.tSsP

อินพุตบน STDIN เอาต์พุตที่คั่นด้วยช่องว่างบน STDOUT

วิธีนี้ใช้วิธีเดียวกันกับคำตอบของ isaacg

เวอร์ชันที่มีความคิดเห็นพร้อมบรรทัดใหม่สำหรับ "ความสามารถในการอ่าน":

}vg0aa          // get input, take the first char
@@*45,eQ.       // check if it's a 45 (ASCII for -) (we also discard the 0 here)
// this is an if-else
:               // (if)
  ?}0AaG        // remove first char of input (the negative sign)
  0`NdE`        // store a -1 in variable e, set active vars to beg
;
:               // (else)
  ?}1           // store a 1 in variable e, set active vars to beg
;bI             // active variables are now guaranteed to be beg
%10sB           // parse input as number (from-base with base 10)
%nM             // multiply by either 1 or -1, as stored in var e earlier
2np`*`          // raise to the power of 2 (and discard the 2)
%.              // now we have the original number in b, its square in d, and
                //   active vars are bdg
*#NaBna!*+#     // add abs(input number) to the square (without modifying the
                //   input variable, by juggling around permavars)
@~%@0nG\]       // active vars are now abcfh, and we have (0>n) in c (where n is
                //   the input number)
:.;:;bI         // if n is negative, swap d (n^2) and g (n^2+n)
~0-NdEnM        // multiply d by -1 (d is n^2 if n is positive, n^2+n otherwise)
tSsP            // print d
" "sP           // print a space
.tSsP           // print g

ความเห็นเกี่ยวกับโซลูชั่น Snowman แรกใน PPCG: ฉันคิดว่าเป้าหมายการออกแบบของฉันในการทำให้ภาษาของฉันสับสนที่สุดเท่าที่จะทำได้

สิ่งนี้อาจสั้นกว่านี้มาก แต่ฉันเป็นคนงี่เง่าและลืมที่จะใช้จำนวนลบสำหรับสตริง -> การแยกตัวเลข ดังนั้นฉันต้องตรวจสอบด้วยตนเองว่ามี-ตัวอักษรตัวแรกและลบออกถ้าใช่


1
วิธีที่ดีกว่า Brainfuck
ช่วง

1
นกกระจอกเทศรู้สึกอย่างไรกับสิ่งนี้ ;)
Kade

6

Pyth, 15 11 ไบต์

ขอบคุณ 4 ไบต์สำหรับ @Jakube

*RQ,hJ.aQ_J

สาธิต.

แผนที่นี้ดังนี้:

0  -> 0, 0
1  -> 2, -1
-1 -> -2, 1
2  -> 6, -4
-2 -> -6, 4

และต่อไปเกี่ยวข้องกับn^2และn^2 + n, บวกหรือลบเสมอ



2

Pyth - 11 10 ไบต์

เพียงแค่คูณด้วย10e10 และ -10e10 + 1ขอบคุณ @xnor ที่แสดงให้ฉันเห็นว่าฉันสามารถใช้CGกับหมายเลข

*CGQ_*tCGQ

ลองมันออนไลน์ได้ที่นี่


CGคุณสามารถทำให้เป็นจำนวนมากตามความเหมาะสม
xnor

@xnor เพิ่มในรายการเคล็ดลับ
Maltysen

2

O , 17 15 9 ไบต์

ใช้คุณสมบัติใหม่ของ O.

Q3 ^ .Q + p_p

รุ่นเก่ากว่า

[ผม # .Z3 ^ * \ Z3 ^) _ *] o

1
ฉันเริ่มเพลิดเพลินกับคำตอบ O เหล่านี้แม้ว่าฉันจะต้องการมันมากขึ้นถ้าล่ามไม่ได้เขียนใน Java ... ;)
kirbyfan64sos

@ kirbyfan64sos มันไม่เล็กเท่า Pyth แต่สามารถเอาชนะ CJam & GolfScript ได้ในบางกรณี มันสามารถเอาชนะสิ่งที่เกี่ยวข้องกับอาร์เรย์ได้อย่างท้าทายเนื่องจากมีพลังมาก
ช่วง

1

Python 3, 29 27

แก้ไข: ไม่ตรงตามข้อกำหนดในสัญลักษณ์แสดงหัวข้อย่อย "รายละเอียด" ที่ 2

โบนัส: ใช้งานได้ตั้งแต่ -99998 ถึง 99998 รวม


lambda n:[99999*n,-99998*n]

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่ระบุตัวตน * ซึ่งคุณสามารถใช้โดยใส่ในวงเล็บแล้วใส่อาร์กิวเมนต์ในวงเล็บหลังจากนั้นดังนี้:

(lambda n:[99999*n,-99998*n])(arg)

* ขอบคุณ @ vioz- สำหรับการแนะนำสิ่งนี้


ตัวอย่างอินพุต / เอาต์พุต:

>>> (lambda n:[99999*n,-99998*n])(1)
[99999, -99998]
>>> (lambda n:[99999*n,-99998*n])(2)
[199998, -199996]
>>> (lambda n:[99999*n,-99998*n])(0)
[0, 0]
>>> (lambda n:[99999*n,-99998*n])(-1)
[-99999, 99998]
>>> (lambda n:[99999*n,-99998*n])(-2)
[-199998, 199996]
>>> (lambda n:[99999*n,-99998*n])(65536)
[6553534464, -6553468928]

1
โพสต์ดี! เพื่อให้คุณรู้ว่าคุณสามารถลบf=และปล่อยให้มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อซึ่งยังคงเป็นคำตอบที่ถูกต้อง จากนั้นคุณสามารถจะลงนับไบต์ของคุณถึง 27 :)
Kade

1
"... อัลกอริทึมของคุณควรใช้กับทฤษฎีจำนวนน้อยและใหญ่ในทางทฤษฎี" เห็นได้ชัด(lambda n:[99999*n,-99998*n])(99999)และ(lambda n:[99999*n,-99998*n])(-99998)จะชนกันในทางทฤษฎี (และในทางปฏิบัติ)
mathmandan

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

0

Haskell ขนาด 16 ไบต์

ฉันคัดลอกวิธีของ @ xnor อย่างไร้ยางอาย คงไม่มีอะไรดีไปกว่านี้อีกแล้ว

f x=(-x^3,x^3+x)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.