İlk 'n' Sayılardan Sıfır Yap


15

Meydan okuma

Zorluk, giriş olarak pozitif bir 'n' tamsayısı alan ve 1 - n arasındaki sayıların yazılabileceği tüm olası yolları görüntüleyen bir kod yazmaktır. sıfıra eşit. Lütfen yalnızca toplama veya çıkarma kullanabileceğinizi unutmayın.

Örneğin, giriş 3 ise, toplamı 0 yapmanın 2 yolu vardır:

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

Sayıların 1'den n'ye kadar (bu durumda 3'tür) sırayla olduğunu unutmayın. Örnekte görüldüğü gibi, ilk sayının işareti de negatif olabilir, bu yüzden dikkatli olun.

Şimdi, 3 oldukça basitti. 7 sayısını düşündüğümüzde tüm yolları listeleyelim.

 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

Burada toplam 8 olası yolumuz var.


Giriş ve çıkış

Daha önce belirtildiği gibi, girdi pozitif bir tamsayı olacaktır . Çıktınız, sayıların toplamı sıfır olarak vermesi mümkün olan tüm yolları içermelidir. Aynı şeyi yapmanın olası bir yolu yoksa, istediğiniz her şeyi çıktılayabilirsiniz.

Ayrıca, çıktıyı istediğiniz herhangi bir biçimde yazdırabilirsiniz . Ancak, anlaşılabilir olmalıdır . Örneğin, yukarıdaki örnekte olduğu gibi yazdırabilirsiniz. Veya numaraların işaretlerini sırayla yazdırabilirsiniz. Aksi takdirde, '0' ve '1'leri sırayla yazdırabilirsiniz, burada' 0 'negatif işareti ve' 1 'pozitif işareti görüntüler (veya tersi).

Örneğin, aşağıdakileri kullanarak 1 + 2-3 = 0'ı temsil edebilirsiniz:

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

Ancak, basitlik için ilk üç formattan herhangi birini kullanmanızı tavsiye ederim. Tüm girişlerin geçerli olduğunu varsayabilirsiniz.


Örnekler

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

puanlama

Bu , bu yüzden en kısa kod kazanır!


Lütfen bunun bir codegolf.stackexchange.com/questions/8655/… dupe olmadığını unutmayın , çünkü bu zorluğun yalnızca n'yi girdi olarak alması ve tüm 1-n sayılarını sırayla kullanması amaçlanmıştır.
Manish Kundu

Biz temsil edebilir +olarak Nve -sıra -Nveya çok uzağa götürüyor bu? (örneğin 3-> [[-3,-3,3], [3,3,-3]])
Jonathan Allan

@JonathanAllan Çıktı formatları listesinde bu belirtilmiyor mu? Yoksa sorunuzu yanlış mı yorumladım?
Manish Kundu

Demek istediğim 0 ve 1seçenek ama Nve kullanarak -N(yukarıdaki düzenleme bakınız)
Jonathan Allan

2
@JonathanAllan Evet kesinlikle izin verilir. Cevapta bahsettiğinizden emin olun.
Manish Kundu

Yanıtlar:



5

Jöle , 9 bayt

1,-ṗ×RSÐḟ

Çevrimiçi deneyin!

Tecrübe

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.

Jöle , 9 bayt

Jonathan Allan önerisi, işaretlerin bir listesini çıktı.

1,-ṗæ.ÐḟR

Çevrimiçi deneyin!


1
(Ab?) İle lax çıktı biçimini kullanmaya ne dersiniz ,Nṗæ.ÐḟR?
Jonathan Allan

Veya alternatif olarak, bu çıktı çıktılarla çarpılır n.
user202729

NVe -No (sadece yanıtında biçimini bahsetmek gerekir) bir bayt :) kaydeder yüzden önerdi çıktı, izin verilmiş olan
Jonathan Allan


3

Perl, 37 36 bayt

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

Güzel yapılmış. Düşebilir -nve <<<değiştirirseniz$_ ilepop . Aslında puanınızı artırmak değil, ama genel ifade daha kısa yapar;)
Chris



2

Kabuk , 10 bayt

fo¬ΣΠmSe_ḣ

Çevrimiçi deneyin!

açıklama

Çok karmaşık değil.

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 bayt

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

Çevrimiçi deneyin!

açıklama

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 2 , 91 bayt

lambda x:[s for s in[[~j*[1,-1][i>>j&1]for j in range(x)]for i in range(2**x)]if sum(s)==0]

Çevrimiçi deneyin!

Tatmin edici listelerin bir listesini döndürür (örneğin, f (3) = [[- 1, -2,3], [1,2, -3]])




1

C (gcc) , 171 bayt

k,s;f(S,n,j)int*S;{if(j--)S[j]=~0,f(S,n,j),S[j]=1,f(S,n,j);else{for(s=k=0;k<n;k++)s+=S[k]*-~k;if(!s&&puts(""))for(k=0;k<n;)printf("%d",S[k++]+1);}}F(n){int S[n];f(S,n,n);}

Çevrimiçi deneyin! Negatif ve pozitif işaretler için kullanır .02



1

Piton 3 + numpy, 104 103 bayt

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]

Çıktı [-1, 1] işaretine karşılık gelir.


if-1 bayt için önceki alanı kaldırabilirsiniz
ovs

0

JavaScript (ES6), 69 61 bayt

Kurtulmak alarak 8 bayt Kaydedilen k @Neil önerdiği gibi,

Tüm çözümleri alert () ile yazdırır .

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

Test senaryoları

Kullanılması console.log () yerine uyarı () kullanım için.


İhtiyacın var kmı? Böyle bir şey:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Neil

@Neil gerçekten bilmiyorum ... Teşekkürler.
Arnauld

0

Retina , 73 bayt

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

_+
$.&

Çevrimiçi deneyin! Açıklama:

.+
*

Girişi tekli olarak dönüştürün.

_
=_$`

Numarayı şu listeye dönüştürün: =Sayıyı önceden düzeltilmiş sayılar .

+0`=
-$%"+

Her birini =sırayla ikisiyle değiştirin -ve+ her seferinde satır sayısını çoğaltın.

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

Ayrı ayrı sayın _ s'den sonraki -s ve+ s'den . Bu, negatif ve pozitif sayıları toplar.

G`(=.+)\1=

Yalnızca şu satırları saklayın: - s ve +s öğelerinin iptal .

=.*

Sayıları silin.

_+
$.&

Ondalık biçime dönüştür.


0

Perl 6 , 43 bayt

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

Dene
Bir dizi liste döndürür

Expanded:

{  # 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 bayt

FrownyFrog sayesinde -5 bayt!

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

Çevrimiçi deneyin!

Orijinal:

J , 35 bayt

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

Nasıl çalışır

1..n listesini olası tüm 1 / -1 katsayı listeleriyle çarpıyorum ve sıfıra kadar ekleyenleri buluyorum.

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

Çevrimiçi deneyin!

Alternatif olarak, +/- kartezyen ürün yaklaşımını kullanarak açık bir fiil denedim:

J , 37 bayt

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

{(<"1@,.-) örneğin kartezyen ürünleri bulur:

{(<"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│
└───────┴────────┘

Sonucu kutulamak çok kötü, bu yüzden değerleri kaldırmak için bazı baytlar harcadım

Çevrimiçi deneyin!


@FrownyFrog Teşekkür ederim, kodumun sağ tarafından memnun değildim.
Galen Ivanov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.