ทำให้ศูนย์จากหมายเลข 'n' แรก


15

ท้าทาย

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

ตัวอย่างเช่นถ้าอินพุตเป็น 3 ดังนั้นมี 2 วิธีในการสร้างผลรวม 0:

 1+2-3=0
-1-2+3=0

โปรดทราบว่าตัวเลขอยู่ในลำดับเริ่มต้นจาก 1 จนถึง n (ซึ่งคือ 3 ในกรณีนี้) เนื่องจากเห็นได้จากตัวอย่างเครื่องหมายของตัวเลขตัวแรกอาจเป็นลบได้ดังนั้นควรระมัดระวัง

ตอนนี้ 3 เรียบง่ายมาก ให้เราเขียนรายการทุกวิธีเมื่อพิจารณาหมายเลข 7

 1+2-3+4-5-6+7=0
 1+2-3-4+5+6-7=0
 1-2+3+4-5+6-7=0
 1-2-3-4-5+6+7=0
-1+2+3+4+5-6-7=0
-1+2-3-4+5-6+7=0
-1-2+3+4-5-6+7=0
-1-2+3-4+5+6-7=0

ดังนั้นที่นี่เรามีวิธีที่เป็นไปได้ทั้งหมด 8 วิธี


อินพุตและเอาต์พุต

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

นอกจากนี้คุณสามารถพิมพ์การส่งออกในรูปแบบใด ๆ ที่คุณชอบ แต่ควรเข้าใจได้ได้ ตัวอย่างเช่นคุณอาจพิมพ์ตามตัวอย่างด้านบน หรือคุณอาจพิมพ์สัญลักษณ์ของตัวเลขตามลำดับ มิฉะนั้นคุณสามารถพิมพ์ '0 และ' ตามลำดับโดยที่ '0' จะแสดงเครื่องหมายลบและ '1' จะแสดงเครื่องหมายบวก (หรือกลับกัน)

ตัวอย่างเช่นคุณสามารถแสดง 1 + 2-3 = 0 โดยใช้:

1+2-3=0
1+2-3
[1,2,-3]
++-
110
001    

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


ตัวอย่าง

7 ->

 1+2-3+4-5-6+7=0
 1+2-3-4+5+6-7=0
 1-2+3+4-5+6-7=0
 1-2-3-4-5+6+7=0
-1+2+3+4+5-6-7=0
-1+2-3-4+5-6+7=0
-1-2+3+4-5-6+7=0
-1-2+3-4+5+6-7=0

4 ->

 1-2-3+4=0
-1+2+3-4=0

2 -> -

8 ->

 1+2+3+4-5-6-7+8=0
 1+2+3-4+5-6+7-8=0
 1+2-3+4+5+6-7-8=0
 1+2-3-4-5-6+7+8=0
 1-2+3-4-5+6-7+8=0
 1-2-3+4+5-6-7+8=0
 1-2-3+4-5+6+7-8=0
-1+2+3-4+5-6-7+8=0
-1+2+3-4-5+6+7-8=0
-1+2-3+4+5-6+7-8=0
-1-2+3+4+5+6-7-8=0
-1-2+3-4-5-6+7+8=0
-1-2-3+4-5+6-7+8=0
-1-2-3-4+5+6+7-8=0

เกณฑ์การให้คะแนน

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ!


โปรดทราบว่านี่ไม่ใช่ dupe ของcodegolf.stackexchange.com/questions/8655/ …เนื่องจากการท้าทายนี้ใช้เพื่อเป็นเพียงอินพุตและใช้ตัวเลขทั้งหมด 1-n ตามลำดับ
Manish Kundu

เราอาจเป็นตัวแทนของ+เป็นNและ-เป็น-Nหรือว่าจะใช้มันมากเกินไป? (เช่น3-> [[-3,-3,3], [3,3,-3]])
Jonathan Allan

@JonathanAllan นั่นไม่ได้กล่าวถึงในรายการรูปแบบเอาต์พุตหรือไม่? หรือว่าฉันตีความคำถามของคุณผิดไป
Manish Kundu

ฉันหมายถึงชอบ0และ1ตัวเลือก แต่ใช้Nและ-N(ดูการแก้ไขของฉันด้านบน)
Jonathan Allan

2
@JanathanAllan ใช่ว่าได้รับอนุญาตอย่างแน่นอน ให้แน่ใจว่าคุณพูดถึงมันในคำตอบ
Manish Kundu

คำตอบ:



5

เยลลี่ขนาด 9 ไบต์

1,-ṗ×RSÐḟ

ลองออนไลน์!

ประสบการณ์

1,-ṗ×RSÐḟ  Main link. Input = n. Assume n=2.
1,-        Literal list [1, -1].
   ṗ       Cartesian power n. Get [[1, 1], [1, -1], [-1, 1], [-1, -1]]
    ×R     Multiply (each list) by Range 1..n.
       Ðḟ  ilter out lists with truthy (nonzero)
      S      Sum.

เยลลี่ขนาด 9 ไบต์

ข้อเสนอแนะของโจนาธานอัลลันออกรายการสัญญาณ

1,-ṗæ.ÐḟR

ลองออนไลน์!


1
วิธีการ (ab?) โดยใช้รูปแบบเอาต์พุตหละหลวมกับ,Nṗæ.ÐḟR?
Jonathan Allan

หรือมิฉะนั้นนี้nเอาท์พุทเอาท์พุทคูณด้วย
user202729

Nและ-Nเอาท์พุทผมแนะนำได้รับอนุญาตเพื่อที่จะช่วยประหยัดหนึ่งไบต์ :) (เพียงแค่ต้องพูดถึงรูปแบบในคำตอบ)
โจนาธานอัลลัน


3

Perl, 37 36 ไบต์

perl -E 'map eval||say,glob join"{+,-}",0..<>' <<< 7

ทำได้ดีมาก คุณสามารถวาง-nและ<<<ถ้าคุณเปลี่ยน$_popด้วย มันไม่ได้ปรับปรุงคะแนนของคุณ แต่มันทำให้การแสดงออกโดยรวมสั้นลง)
Chris



2

Huskขนาด 10 ไบต์

fo¬ΣΠmSe_ḣ

ลองออนไลน์!

คำอธิบาย

ไม่ซับซ้อนเกินไป

fo¬ΣΠmSe_ḣ  Implicit input, say n=4
         ḣ  Range: [1,2,3,4]
     m      Map over the range:
      Se     pair element with
        _    its negation.
            Result: [[1,-1],[2,-2],[3,-3],[4,-4]]
    Π       Cartesian product: [[1,2,3,4],[1,2,3,-4],..,[-1,-2,-3,-4]]
f           Keep those
   Σ        whose sum
 o¬         is falsy (equals 0): [[-1,2,3,-4],[1,-2,-3,4]]


1

Swift , 116 ไบต์

func f(n:Int){var r=[[Int]()]
for i in 1...n{r=r.flatMap{[$0+[i],$0+[-i]]}}
print(r.filter{$0.reduce(0){$0+$1}==0})}

ลองออนไลน์!

คำอธิบาย

func f(n:Int){
  var r=[[Int]()]                         // Initialize r with [[]]
                                          // (list with one empty list)
  for i in 1...n{                         // For i from 1 to n:
    r=r.flatMap{[$0+[i],$0+[-i]]}         //   Replace every list in r with the list
  }                                       //   prepended with i and prepended with -i
  print(r.filter{$0.reduce(0){$0+$1}==0}) // Print all lists in r that sums to 0
}






1

Python 3 + จำนวน 104 104ไบต์

import itertools as I,numpy as P
lambda N:[r for r in I.product(*[[-1,1]]*N)if sum(P.arange(N)*r+r)==0]

เอาต์พุตคือ [-1, 1] ที่สอดคล้องกับเครื่องหมาย


คุณสามารถลบช่องว่างก่อนifสำหรับ -1 ไบต์
ovs

0

JavaScript (ES6), 69 61 ไบต์

บันทึก 8 ไบต์โดยกำจัดkตามที่ @Neil แนะนำ

พิมพ์การแก้ปัญหาทั้งหมดที่มีการแจ้งเตือน ()

f=(n,o='')=>n?f(n-1,o+'+'+n)&f(n-1,o+'-'+n):eval(o)||alert(o)

กรณีทดสอบ

การใช้console.log ()แทนalert ()เพื่อความสะดวกในการใช้งาน


คุณต้องการkไหม บางสิ่งเช่นนี้:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Neil

@ ไม่มีฉันไม่ได้จริงๆ ... ขอบคุณ
Arnauld

0

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

.+
*
_
=_$`
+0`=
-$%"+
(-(_)+|\+(_)+)+
$&=$#2=$#3=
G`(=.+)\1=
=.*

_+
$.&

ลองออนไลน์! คำอธิบาย:

.+
*

แปลงอินพุตเป็น unary

_
=_$`

แปลงหมายเลขเป็นรายการของ=หมายเลขที่มีการแก้ไข

+0`=
-$%"+

แทนที่แต่ละอัน=ด้วยทั้งคู่-และ+ทำซ้ำจำนวนบรรทัดในแต่ละครั้ง

(-(_)+|\+(_)+)+
$&=$#2=$#3=

แยกจำนวนของ_s หลังจาก-s และ+s ผลรวมนี้เป็นจำนวนลบและบวก

G`(=.+)\1=

เก็บเฉพาะบรรทัดเหล่านั้นที่-s และ+s ยกเลิก

=.*

ลบการนับ

_+
$.&

แปลงเป็นทศนิยม


0

Perl 6 , 43 ไบต์

{grep *.sum==0,[X] (1..$_ X*1,-1).rotor(2)}

ลองมัน
ส่งคืนลำดับรายการ

ขยาย:

{  # bare block lambda with implicit parameter 「$_」

  grep              # only return the ones
    *.sum == 0,     # that sum to zero

    [X]             # reduce with cross meta operator

      (
          1 .. $_   # Range from 1 to the input

        X*          # cross multiplied by

          1, -1

      ).rotor(2)    # take 2 at a time (positive and negative)
}

1..$_ X* 1,-1(1, -1, 2, -2)
(…).rotor(2)((1, -1), (2, -2))
[X] …((1, 2), (1, -2), (-1, 2), (-1, -2))


0

J , 35 30 ไบต์

-5 ไบต์ขอบคุณ FrownyFrog!

>:@i.(]#~0=1#.*"1)_1^2#:@i.@^]

ลองออนไลน์!

เดิม:

J , 35 ไบต์

[:(#~0=+/"1)>:@i.*"1(_1^[:#:@i.2^])

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

ฉันคูณลิสต์ 1..n กับรายการที่เป็นไปได้ทั้งหมดของสัมประสิทธิ์ 1 / -1 และหาค่าที่เพิ่มขึ้นเป็นศูนย์

                    (             ) - the list of coefficients
                             i.     - list 0 to 
                               2^]  - 2 to the power of the input
                     _1^[:          - -1 to the power of 
                          #:@       - each binary digit of each number in 0..n-1 to 
                 *"1                - each row multiplied by
            >:@i.                   - list 1..n
  (#~      )                        - copy those rows
     0=+/"1                         - that add up to 0
[:                                  - compose   

ลองออนไลน์!

เป็นอีกทางเลือกหนึ่งที่ฉันลองใช้กริยาอย่างชัดเจนโดยใช้วิธีการของผลิตภัณฑ์คาร์ทีเซียนของ +/-:

J , 37 ไบต์

3 :'(#~0=+/"1)(-y)]\;{(<"1@,.-)1+i.y'

{(<"1@,.-) ค้นหาผลิตภัณฑ์คาร์ทีเซียนตัวอย่างเช่น:

{(<"1@,.-) 1 2 3
┌───────┬────────┐
│1 2 3  │1 2 _3  │
├───────┼────────┤
│1 _2 3 │1 _2 _3 │
└───────┴────────┘

┌───────┬────────┐
│_1 2 3 │_1 2 _3 │
├───────┼────────┤
│_1 _2 3│_1 _2 _3│
└───────┴────────┘

น่าเสียดายที่มันเป็นกล่องผลลัพธ์ดังนั้นฉันใช้เวลาหลายไบต์เพื่อแกะกล่องค่า

ลองออนไลน์!


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