Tantangan
Tantangannya adalah untuk menulis kode yang mengambil bilangan bulat positif 'n' sebagai input dan menampilkan semua cara yang memungkinkan di mana angka dari 1 - n dapat ditulis, dengan tanda positif atau negatif di antaranya, sehingga jumlah mereka adalah sama dengan nol. Harap diingat bahwa Anda hanya dapat menggunakan penambahan atau pengurangan.
Misalnya, jika inputnya adalah 3, maka ada 2 cara untuk membuat penjumlahan 0:
1+2-3=0
-1-2+3=0
Perhatikan bahwa, angkanya berurutan, mulai dari 1 hingga n (yaitu 3 dalam hal ini). Seperti terbukti dari contoh, tanda angka pertama juga bisa negatif, jadi berhati-hatilah.
Sekarang, 3 cukup sederhana. Mari kita buat daftar semua cara ketika kita mempertimbangkan angka 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
Jadi di sini, kita punya total 8 cara yang mungkin.
Masukan dan keluaran
Seperti yang dinyatakan sebelumnya, input akan menjadi bilangan bulat positif . Output Anda harus berisi semua cara yang memungkinkan angka-angka tersebut memberikan jumlah nol. Jika tidak ada cara yang memungkinkan untuk melakukan hal yang sama, Anda dapat menampilkan apa pun yang Anda suka.
Juga, Anda dapat mencetak output dalam format apapun yang Anda suka . Tapi, itu harus bisa dimengerti . Misalnya, Anda dapat mencetaknya seperti pada contoh di atas. Atau, Anda bisa saja mencetak tanda angka secara berurutan. Jika tidak, Anda juga dapat mencetak '0 dan' 1 secara berurutan, di mana '0' akan menampilkan tanda negatif dan '1' akan menampilkan tanda positif (atau sebaliknya).
Misalnya, Anda dapat mewakili 1 + 2-3 = 0 menggunakan:
1+2-3=0
1+2-3
[1,2,-3]
++-
110
001
Namun, saya akan merekomendasikan menggunakan salah satu dari tiga format pertama untuk kesederhanaan. Anda dapat menganggap semua input valid.
Contohnya
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
Mencetak gol
Ini kode-golf , jadi kode terpendek menang!
sumber
+
sebagaiN
dan-
sebagai-N
, atau apakah itu terlalu jauh? (eg3
->[[-3,-3,3], [3,3,-3]]
)0
dan1
tetapi menggunakanN
dan-N
(lihat edit saya di atas)Jawaban:
Haskell , 42 byte
Cobalah online!
sumber
0==
?Jelly , 9 byte
Cobalah online!
Exp
Jelly , 9 byte
Saran Jonathan Allan , berikan daftar tanda.
Cobalah online!
sumber
,Nṗæ.ÐḟR
?n
.N
dan-N
output yang saya menyarankan telah diizinkan, sehingga menghemat satu byte :) (hanya perlu menyebutkan format dalam jawaban)Python 2 , 62 byte
Cobalah online!
Tn. Xcoder menyimpan 4 byte dengan penggunaan argumen berbintang yang bagus.
sumber
*l
bukannyal=[]
Perl,
3736 bytesumber
-n
dan<<<
jika Anda mengganti$_
denganpop
. Sebenarnya tidak meningkatkan skor Anda, tetapi membuat keseluruhan ekspresi lebih pendek;)05AB1E , 11 byte
Cobalah online!
Format output untuk input misalnya
3
adalah:Yaitu
-1-2+3, 1+2-3
,.sumber
Bahasa Wolfram (Mathematica) , 36 byte
Cobalah online!
sumber
Sekam , 10 byte
Cobalah online!
Penjelasan
Tidak terlalu rumit.
sumber
Python 3 , 105 byte
Cobalah online!
sumber
Swift , 116 byte
Cobalah online!
Penjelasan
sumber
Python 2 , 91 byte
Cobalah online!
Mengembalikan daftar daftar yang memuaskan (misalnya, f (3) = [[- 1, -2,3], [1,2, -3]])
sumber
APL (Dyalog) , 38 byte
Cobalah online!
sumber
Pyth , 13 byte
Coba di sini!
sumber
C (gcc) , 171 byte
Cobalah online! Penggunaan
0
untuk2
tanda-tanda negatif dan positif.sumber
Bersih , 79 byte
Cobalah online!
sumber
Python 3 + numpy,
104103 byteOutput [-1, 1] sesuai dengan tanda.
sumber
if
untuk -1 byteJavaScript (ES6),
6961 bytesSaved 8 bytes by getting rid of k, as suggested by @Neil
Prints all solutions with alert().
Test cases
Menggunakan console.log () instead of alert() for user-friendliness.
Tampilkan cuplikan kode
sumber
k
? Sesuatu seperti ini:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Retina , 73 byte
Cobalah online! Penjelasan:
Konversikan input ke unary.
Ubah nomornya menjadi daftar
=
angka -prefixed.Ganti masing-masing
=
secara bergantian dengan keduanya-
dan+
, duplikat jumlah baris setiap kali.Hitung jumlah
_
s setelah-
dan s secara terpisah+
s secara terpisah. Ini menjumlahkan angka negatif dan positif.Pertahankan hanya garis-garis di mana
-
s dan+
s dibatalkan.Hapus jumlah.
Konversikan ke desimal.
sumber
Perl 6 , 43 byte
Cobalah
Mengembalikan urutan daftar
Diperluas:
1..$_ X* 1,-1
⇒(1, -1, 2, -2)
(…).rotor(2)
⇒((1, -1), (2, -2))
[X] …
⇒((1, 2), (1, -2), (-1, 2), (-1, -2))
sumber
J ,
3530 byte-5 byte terima kasih kepada FrownyFrog!
Cobalah online!
Asli:
J , 35 byte
Bagaimana itu bekerja
Saya mengalikan daftar 1..n dengan semua daftar koefisien yang memungkinkan 1 / -1 dan menemukan yang menambahkan hingga nol.
Cobalah online!
Sebagai alternatif saya mencoba kata kerja eksplisit, menggunakan pendekatan produk kartesius dari +/-:
J , 37 byte
{(<"1@,.-)
menemukan produk-produk kartesius misalnya:Sayang sekali bahwa itu kotak hasilnya, jadi saya menghabiskan beberapa byte untuk menghapus nilai-nilai
Cobalah online!
sumber