Çekip gitmek! No-1 Burada!


16

Bazı sayılarla oynuyordum ve elbette OEIS'te olan bir dizi buldum. Öyle A005823 : kimin üçlü genişleme hiçbir 1'leri içeren Numaraları . Gider:

a (2n) = 3 * a (n) +2

a (2n + 1) = 3 * a (n + 1)

a (1) = 0

a = 0,2,6,8,18,20,24,26,54 ....

Ben yazdım CJam programını ilk üreten n , ikili indeksi dönüştürme 2 yıllardan ile 1'ler değiştirilmesi ve üçlü ondalık dan dönüştürerek bu sayıların.

Ayrıca, herhangi bir çift sayının, dizideki iki sayının (bazen kendisiyle birlikte sayı) toplanmasıyla elde edilebileceğini fark ettim.

Meydan okuma:

Giriş olarak negatif olmayan herhangi bir çift sayı verildiğinde, bu sayıya karşılık gelen iki sayının indekslerini çıktılayın. (Bazen birden fazla çiftin mümkün olduğunu unutmayın.)

Kurallar:

  • 0- veya 1-endeksleme kullanıp kullanmadığınızı belirtin.
  • Bir dize olarak çıktı alıyorsanız, iki endeks arasına bir sınırlayıcı koyun.
  • Karmaşık bir sayı olarak çıkmanıza izin verilir.
  • Arzu ederseniz, geçerli her çifti verebilirsiniz.
  • Code Golf: en kısa cevap kazanır

Test Durumları

0 indeksleme kullanıyorum. Burada her giriş için olası her çıkışı listeliyorum, ancak sadece bir çıkış vermeniz gerekiyor.

0:       [0 0]
 2:       [1 0]
 4:       [1 1]
 6:       [2 0]
 8:       [2 1] [3 0]
 10:      [3 1]
 12:      [2 2]
 14:      [3 2]
 16:      [3]
 18:      [4 0]
 30:      [6 2]
 32:      [6 3] [7 2]
 46:      [7 5]
 50:      [7 6]
 120:     [10 10]
 338:     [19 18]
 428:     [30 23] [31 22]
 712:     [33 27] [35 25] [41 19] [43 17] [49 11] [51 9] [57 3] [59 1]
 1016:    [38 37] [39 36]
Test durumu yardımı için @Luis Mendo'ya teşekkürler.

İlgili: Cantor seti içinde mi?


İki değerin karmaşık bir sayısını çıkarabilir miyiz? Her biri bir değer veren iki işlev sağlayabilir miyiz?
xnor

2
Tüm olası değerleri verebilir miyiz, yoksa bu zorluğun ötesine mi gidiyor?
cole

@cole Evet, sorun değil.
geokavel

Bay Sloane , sayı dizilerini gerçekten seviyor gibi görünüyor . "Bunun için bir dizi var" (TM)
Pharap

1
Bazı girdiler için birkaç çözüm olduğundan, tüm çözümleri test senaryolarına dahil etmek güzel olurdu. Bu program , her test senaryosu için tüm çözüm çiftlerini, meydan okuma metniyle aynı formatta gösterir (0 tabanlı, her çift giderek artan şekilde sıralanır)
Luis Mendo

Yanıtlar:


10

Kabuk , 21 14 13 bayt

-7 bayt, @ Neil'in JS cevabı sayesinde

-1 bayt betaveros'un Parradoc cevabından ilham aldı

0 endeksleme kullanır

mḋTmMo±>ḋ2B3½

Çevrimiçi deneyin!

açıklama

            ½    Half the input
          B3     Convert to Base 3
   m             Map over the list
    Mo±>ḋ2       Function such that: 0 -> [0,0], 1 -> [0,1], 2 -> [1,1]
        ḋ2       Binary 2, [1,0]
    M            For each in that list
     o±>         check if the argument is greater than it
  T              Transpose
mḋ               Convert each from binary

Önceki 21 bayt Çözümü

İlk kez bir kullanım gördüm ».

mḋT»o%2+ȯ?´eḋε%3`-0B3

Çevrimiçi deneyin!

Daha uzun, ben taşımakla uğraşırken


8

JavaScript (ES6), 75 71 bayt

f=
n=>[1,0].map(i=>parseInt((n/2).toString(3).replace(/./g,c=>+c+i>>1),2))
<input type=number min=0 step=2 oninput=o.textContent=this.value%2?``:f(this.value)><pre id=o>

Açıklama: A005823'ün girdisini ve öğelerini 2'ye bölmek sorunu değiştirmez, ancak üçlü gösterimler artık yalnızca 0 ve 1'leri kullandığından çözümü dikkate almaz ve bu nedenle dikkate alınması gereken bir taşıma yoktur. Ayrıca, öğeden dizinine dönüştürürken bir adım kaydeder (her öğenin üçlü dizininin iki katıdır). Örnekler:

                 A005823
                  halved
            n in  values A005823
   n n/2  base 3  base 3 indices
   0   0       0   0   0   0   0  
   2   1       1   1   0   1   0
   4   2       2   1   1   1   1
   6   3      10  10   0   2   0
   8   4      11  11   0   3   0
  10   5      12  11   1   3   1
  12   6      20  10  10   2   2
  14   7      21  11  10   3   2
  16   8      22  11  11   3   3
  18   9     100 100   0   4   0
  30  15     120 110  10   6   2
  32  16     121 111  10   7   2
  46  23     212 111 101   7   5
  50  25     221 111 110   7   6

6

Jöle , 26, 22 , 21 bayt

ḶBḤḅ3
ÇŒcS=¥Ðf⁸ḢiЀÇT

Çevrimiçi deneyin!

@JonathanAllan sayesinde bir bayt kurtarıldı!

Açıklama:

                # Helper link: A005823 to *N* terms
Ḷ               # Lowered range(N)
 B              # Converted to binary
  Ḥ             # Double each digit
   ḅ3           # Converted from base 3 to decimal
                # Main link
Ç               # Last link
 Œc             # All combinations of 2 items (with replacement)
      Ðf        # Remove every combination where this isn't true:
   S=¥          #   The sum of the two items is equal to N
        ⁸Ḣ      # Take the first combination left
          i     # Index of
           Ѐ   # Each element of the combination
             Ç  # In the sequence
              T # Return the truthy indices

1
@JonathanAllan Oh, bilmek güzel Œc. Ve evet, Dennis sorunu S=¥bana anlattı .
DJMcMayhem

Bu arada sıfıra sıfır kenar işleme eklemeniz gerekiyor gibi görünüyor :(
Jonathan Allan

Görünüşe göre bu 1 tabanlı; belki de cevapta belirtmeye değer
Luis Mendo


3

Python 2 , 51 bayt

f=lambda n:[n and(n/2%3>r)+2*f(n/3)[r]for r in 0,1]

Çevrimiçi deneyin!

Görev şu şekilde yapılabilir:

  1. Girişi yarıya indir
  2. Üçlü listeye dönüştür
  3. Bunu iki yönlü listeye ayırın.
  4. Bu listeleri ikili dosyadan dönüştürün

Bölme işlemini 0->0,1->1,2->1bir liste ve 0->0,1->0,2->1diğeri için dönüştürerek (3) 'te yapabiliriz . Yani, kontrol ederek değer 0 veya 1 eşiğinin üzerindedir.

İki değer, ilgili özyinelemeli işlevlerle bulunabilir:

p=lambda n:n and(n/2%3>0)+2*p(n/3)
q=lambda n:n and(n/2%3>1)+2*q(n/3)

İşlev f, bunların ikisini liste kavramada birleştirir. Bu, üstel dallanma nedeniyle verimsiz hale getirir.

Karmaşık sayılar çıkartılabiliyorsa, 10 bayt tasarruf edebiliriz:

f=lambda n:n and(n%6>1)+n%6/4*1j+2*f(n/3)

Sanırım karmaşık sayılar tamam.
geokavel

3

J, 35 32 bayt

($#:I.@,)@(=[:+/~3#.+:@#:@i.@>:)

Çevrimiçi deneyin!

0 indeksli ve girdi tekli olarak verilir. Değerine İade bütün olası toplamları (o davranır a bve b afarklı olası toplamları gibi).

Boole matrisinden indekslere dönüştürmek çok fazla kod alır ...

Soldaki çatalı da çıkarmak istiyorum, bu yüzden çok fazla parantez ve @-at kullanmak zorunda değilim , ancak bunu yapmak için iyi bir yol bulamıyorum (alternatif yaklaşımım bayt kaydetmiyor ).

açıklama

Açıklamak ve çözmek için, ana fonksiyonun aşağıdaki bileşenlerini göz önünde bulundurun

valid_nums      =. = [: +/~ 3 #. +:@#:@i.@>:
indices_of_ones =. $ #: I.@,

valid_nums , endekslerin toplanan dizi değerlerinin indeksleri olduğu bir boole matrisi verir. Bu endekslerde bir tane varsa, bu iki sayının giriş değerine toplandığı anlamına gelir.

indices_of_ones , keyfi bir sıralı boole matrisindeki koordinatların verilmesi için kullanılan bir J deyimdir

Ana işlev oldukça basit

indices_of_ones@valid_nums

valid_nums

= [: +/~ 3 #. +:@#:@i.@>:  Input is n
                 #:@i.@>:  Binary numbers in range [0,n]
              +:           Doubled
         3 #.              Interpreted as ternary
     +/~                   Addition table with self (sum all possible pairs)
=                          Equate to n

indices_of_ones

$ #: I.@,
        ,  Ravel matrix into a single list
     I.    Find the indices of ones in that list
  #:       Convert to the base given by
$          The shape of the matrix

,-ravel bu durumda her satırı bir sonrakine birleştirerek çalışır.

   i.3 3
0 1 2
3 4 5
6 7 8
   , i.3 3
0 1 2 3 4 5 6 7 8

Eğer bu bir boolean matris olsaydı, zayıf okuyucuyu karıştırmaya yardımcı olmak için olabildiğince çok önermeli ifade kullanarak, bu matrisin şeklinin tabanındaki sayılar olarak raveled matrisin indeksleri yorumlanarak bulunabilir. .


1
yedekli çıkışlarınız iyi.
geokavel

3

MATL , 22 21 19 17 bayt

tQ:qBEI_ZA&+=R&fh

Çıktı 1 tabanlıdır. Program tüm çözüm çiftlerini üretir. Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

t      % Implicit input: n. Duplicate
Q:q    % Range [0 1 ... n]
B      % Convert to binary. Gives a matrix where each row corresponds to a number
E      % Multiply each entry by 2
I_ZA   % Convert each row from ternary to a number
&+     % Matrix of all pair-wise additions
=      % Does each entry equal n?
R      % Upper triangular matrix
&f     % Push row and column indices of nonzero entries
h      % Concatenate horizontally. Implicit didsplay

OP, yorumlarda tüm çözümlerin üretilmesinin iyi olduğunu söyledi
H.PWiz

@ H.PWiz Teşekkürler! Bunu görmemiştim
Luis Mendo


2

Pyth , 29 bayt

Bu, tüm olası endeks çiftlerini döndürür.

fqQ+@Kmi:.Bd\1\23QhT@KeT.cUQ2

Burada deneyin.

Pyth , 30 bayt

hfqQ+@Kmi:.Bd\1\23QhT@KeT.cUQ2

Burada deneyin.

Bu, dizin çiftlerini olarak döndürür [LowerIndex, HigherIndex].


Bu nasıl çalışıyor?

hfqQ+@Kmi:.Bd\1\23QhT@KeT.cUQ2   Full Program. Q means input throughout the whole explanation.

       m          Q               Map over the range [0, Q) with a variable d.
          .Bd                     Convert to binary.
         :   \1\2                 Replace 1 with 2.
        i        3                Convert it from base 3 to integer.
      K                           Assign the mapped range to a variable K.
                         .cUQ2    All possible two-element combinations of the range [0...Q).
    +@             hT@KeT         Sum of the integers on positions in K of the two-element
                                  combination.
 fqQ                              Filter those that equal the input.
h                                 Optional: Head. Take the first element.
                                  Print the result, implicitly. 

2

Paradoc (v0.2.10), 11 bayt (CP-1252)

½3B2>_B™2Bv

Çevrimiçi deneyin!

Algoritmik olarak, tıpkı Neil'in ES6 cevabı gibi . Daha düşük bir düzeyde, H.PWiz'in Husk cevabına da çarpıcı bir şekilde benzer . Üç aşırı yüklemeyi de kullanmak zorunda olduğum için eğlendim B.

Yığında bir tamsayı alır, yığında iki tamsayının bir listesini bırakır.

Açıklama:

½           .. Halve input
 3B         .. Convert to ternary
   2        .. 2, which will get implicitly coerced to [0,1]
    >_      .. Greater than, as a block
      B     .. "Bimap": take the block and map it over the Cartesian
            .. product of the last two lists to get a matrix
       ™    .. Transpose
        2Bv .. Convert each row from binary

1

Python 3 , 122120 bayt

Bay Xcoder sayesinde -2 bayt!

0 endeksli

def f(a):r=range(a);s=[int(bin(x)[2:].replace(*'12'),3)for x in r];return[(i,j)for i in r for j in r if s[i]+s[j]==a][0]

Ungolfed:

def f(a):
    r=range(a)
    s=[int(bin(x)[2:].replace(*'12'),3)for x in r]
    return[(i,j)for i in r for j in r if s[i]+s[j]==a][0]

Çevrimiçi deneyin!


1
Sakıncası yoktur umarım. Bir TiO bağlantısı ekledim.
Bay Xcoder

1

Mathematica, 94 bayt

(w=#;Position[s,#]&/@#&@@(k=Select)[Tuples[s=k[Range@w,DigitCount[#,3,1]==0&],{2}],Tr@#==w&])& 


1 endeksli


1

JavaScript, 120 101 bayt

n=>[(A=[...Array(n+1)].map(Z=(a,b=a)=>b&&3*Z(b/2|0)+b%2*2))[F='findIndex'](a=>z=~A[F](b=>a+b==n)),~z]

Çevrimiçi deneyin!

0 endeksli.
Bir endeksin mümkün olan en küçük olduğu endeks çiftini döndürür (örneğin, 428geri döndüğünde 22,31).


1

Brain Flak , 220 166 bayt

Wiki'deki modulo işlevine bakarak -54 bayt, bazı yapısal değişikliklere izin verir

({()<({}[()()])>}{}){({}(<>))<>(()()())({()<(({})){({}[()])<>}{}>}{}<><([{}()]{})>[()])}([]){{}<>(({}){})<>(({}){}{()<({}[()]){<>({}())<>(<{}>)}>}{})([][()])}({}{}<>)

Çevrimiçi deneyin!

0 endeksli.

açıklama

Diğer birçok çözüm gibi, bu da üçlü açılımı hesaplar n/2ve bunu iki ikili sayıya dönüştürür.

Adım 1: Girişi 2'ye bölün

({()<({}[()()])>}{})

 {              }     until number becomes zero:
     ({}[()()])       subtract two
( ()<          > {})  push number of iterations

2.Adım: Üçlü genişlemeyi hesaplayın

{({}(<>))<>(()()())({()<(({})){({}[()])<>}{}>}{}<><([{}()]{})>[()])}

 ({}(<>))<>         {   (({})){({}[()])<>}{} }{}<> ([{}()]{})         modulo (from wiki)
           (()()())                                                   use 3 as base
                     ()<                    >                         evaluate as 1 every time the 3 rolls over
                   (                              <          >[()])   push number of rollovers (function is now division with remainder)
{                                                                  }  repeat until quotient is zero, leaving all remainders on stack

3. Adım: Çözüme dönüştürün

([]){{}<>(({}){})<>(({}){}{()<({}[()]){<>({}())<>(<{}>)}>}{})([][()])}({}{}<>)

([]){{}                                                      ([][()])}           repeat while stack height > 1:
                                                                                 (loop happens once when initial stack height is 1, but that's fine)
       <>(({}){})                                                                double smaller output number
                 <>(({}){}                                  )                    double larger output number
                          {                              }{}                     if digit in ternary expansion is nonzero:
                           ()<                          >                        add 1 to larger output number
                              ({}[()]){                }                         if digit is 2:
                                       <>({}())<>(<{}>)                          add 1 to smaller output number

0

JavaScript (ES6), 70 72 bayt

n=>[6,4].map(x=>parseInt((n/2).toString(3).replace(/./g,d=>x>>d&1),2)) // thanks @Neil
n=>[0,1].map(x=>parseInt((n/2).toString(3).replace(/1|2/g,d=>~-d||x),2))

(Cevabını görmemiş olsam bile 0 endeksli ve görünüşe göre @Neil ile hemen hemen aynı çözüm)

İşlemin tersini kullanarak bir sayıdan indeksi geri almaya başladım: baz 3 ile stringify, her 2ile değiştirin1 tabanı 2 ile parse.

İki sayı elde etmek için ve hatta her biri için, girişin sadece yarısı - ancak şimdi 1basamaklar da oluşabilir. Bu nedenle , değiştirme ve ayrıştırma adımından önce ikisinin toplamını değiştirmeyen 0bir sayıdaki a 2ve diğer sayıdaki bir ile değiştiririz. İşte ben geldi (iki yedek, 1-> 0-veya-2 ve 2-> 1bir adımda):

n=>["001","011"].map(x=>parseInt((n/2).toString(3).replace(/./g,d=>x[d]),2))

Elbette iki değiştirme haritası (dizeler) yalnızca bir dizinde farklılık gösterir, bu nedenle dizi değişmezini yalnızca değiştirerek 1ve 2ile kısaltabilmeliyiz d == 2 ? 1 : x. Veya d-1 || x. Nerede -1iki tekli operatörler olarak aynısını yapar - ama bir korkunç bakmak :-)

Dizi değişmezinden ve etraftaki parantezlerden kaçınmaya n/2çalışarak

n=>Array.from(parseInt,(h=n/2,i)=>parseInt(h.toString(3).replace(/1|2/g,d=>~-d||i),2))

ama sonuç vermedi.


Ben de ["001","011"]sürümü ile başladım (iyi benim değişken isimlerim farklıydı)
Neil

Bence .replace(/./g,d=>d>>1|x)2 byte tasarruf sağlıyor.
Neil

@Neil Ne yazık ki bu işe yaramaz d="0"ve x=1- basamak kalmalıdır0
Bergi

Evet, sadece birkaç test vakasını denedikten sonra çalıştım. (Ve o zamandan beri başka bir varyant buldum, ama bu benim cevabımda olacak, korkarım.)
Neil

1
Oh çok güzel, ve önceki versiyonunu yenmek için zeki olduğumu sanıyordum ...
Neil

0

Pyth, 22 bayt

J.m}1jb3hQxLJhfqsTQ^J2

Çevrimiçi deneyin: Gösteri

Açıklama:

J.m}1jb3hQxLJhfqsTQ^J2
        hQ                input + 1 
 .m                       find all values of [0, 1, 2, ..., input], where
     jb3                     value converted to base 3
   }1                        check if it contains the digit 1
                          this boolean ^ is false
J                         store this list in variable J

                   ^J2    every pair of J
              f           filter for pairs with
                sT           sum of pair
               q             equal
                  Q          the input
             h            take the first of these pairs
          xLJ             and find the corresponding indices of J
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.