ไปให้พ้น! ไม่มีของ 1 ที่นี่!


16

ฉันกำลังเล่นกับตัวเลขและพบลำดับที่แน่นอนอยู่ใน OEIS มันเป็นA005823 : เบอร์ที่มีการขยายตัว ternary ไม่มี 1 มันไป:

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 ....

ฉันเขียนโปรแกรม CJamที่สร้างn ตัวแรกของตัวเลขเหล่านี้โดยแปลงดัชนีเป็นไบนารีแทนที่ 1 ด้วย 2 และเปลี่ยนจาก ternary เป็นทศนิยม

ฉันยังสังเกตเห็นว่าจำนวนคู่ใด ๆ สามารถรับได้โดยการหาผลรวมของตัวเลขสองตัวในลำดับ

ความท้าทาย:

ให้ตัวเลขใด ๆ ที่ไม่เป็นลบเป็นอินพุทเอาท์พุทดัชนีของตัวเลขสองตัวในลำดับที่รวมกับมัน (โปรดทราบว่าบางครั้งอาจมีหลายคู่)

กฎระเบียบ:

  • ระบุว่าคุณใช้ดัชนี 0- หรือ 1 หรือไม่
  • หากคุณกำลังแสดงผลเป็นสตริงให้คั่นตัวคั่นระหว่างสองดัชนี
  • คุณได้รับอนุญาตให้ส่งออกเป็นจำนวนเชิงซ้อน
  • หากคุณต้องการคุณสามารถส่งออกทุกคู่ที่ถูกต้อง
  • Code Golf: คำตอบที่สั้นที่สุดชนะ

กรณีทดสอบ

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

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 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]
ขอบคุณ @Luis Mendo สำหรับความช่วยเหลือกรณีทดสอบ

ที่เกี่ยวข้อง: มันอยู่ในชุดคันทอร์หรือไม่?


เราสามารถส่งออกจำนวนเชิงซ้อนของค่าทั้งสองได้หรือไม่ เราขอสองฟังก์ชั่นหนึ่งอันให้แต่ละค่าได้ไหม
xnor

2
เราจะให้คุณค่าที่เป็นไปได้ทั้งหมดหรือว่าจะเกินความท้าทายหรือไม่
โคล

@ โคลใช่แล้วไม่เป็นไร
geokavel

ดูเหมือนว่านายสโลน ชอบลำดับหมายเลขของเขาจริงๆ "มีลำดับสำหรับสิ่งนั้น" (TM)
Pharap

1
เนื่องจากมีวิธีแก้ปัญหาหลายประการสำหรับอินพุตบางตัวมันจะเป็นการดีที่จะรวมโซลูชันทั้งหมดในกรณีทดสอบ โปรแกรมนี้แสดงคู่วิธีแก้ปัญหาทั้งหมดสำหรับแต่ละกรณีทดสอบในรูปแบบเดียวกันกับข้อความท้าทาย (ตามแบบ 0 แต่ละคู่เรียงลำดับมากขึ้น)
Luis Mendo

คำตอบ:


10

Husk , 21 14 13 ไบต์

-7 ไบต์ขอบคุณคำตอบ JSของ @ Neil

-1 ไบต์แรงบันดาลใจจากคำตอบ Parradocของbetaveros

ใช้การจัดทำดัชนี 0

mḋTmMo±>ḋ2B3½

ลองออนไลน์!

คำอธิบาย

            ½    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

โซลูชัน 21 ไบต์ก่อนหน้า

»ครั้งแรกที่ผมได้เห็นการใช้งานสำหรับ

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

ลองออนไลน์!

อีกต่อไปในขณะที่ฉันจัดการกับอุ้ม


8

JavaScript (ES6), 75 71 ไบต์

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>

คำอธิบาย: การหารอินพุตและองค์ประกอบของ A005823 คูณ 2 ไม่ได้แก้ไขปัญหา แต่มันทำให้การแก้ปัญหาง่ายขึ้นเนื่องจากการเป็นตัวแทนที่ประกอบไปด้วยสามตอนนี้ใช้ 0s และ 1s เท่านั้นดังนั้นจึงไม่มีการพิจารณา นอกจากนี้ยังบันทึกขั้นตอนเมื่อแปลงจากองค์ประกอบเป็นดัชนี (องค์ประกอบที่สามของแต่ละองค์ประกอบเป็นสองเท่าของดัชนีไบนารี) ตัวอย่าง:

                 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

เยลลี่ , 26, 22 , 21 ไบต์

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

ลองออนไลน์!

บันทึกหนึ่งไบต์ขอบคุณ @JonathanAllan!

คำอธิบาย:

                # 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 Œcโอ้ดีที่จะรู้เกี่ยวกับ และใช่เดนนิสอธิบายปัญหากับS=¥ฉัน
DJMcMayhem

ดูเหมือนว่าคุณจำเป็นต้องเพิ่มการจัดการกรณีขอบสำหรับศูนย์โดยวิธี :(
Jonathan Allan

ดูเหมือนว่านี่จะเป็นแบบ 1 ฐาน บางทีมันอาจจะคุ้มค่าที่ระบุไว้ในคำตอบ
Luis Mendo


3

Python 2 , 51 ไบต์

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

ลองออนไลน์!

งานสามารถทำได้ดังนี้:

  1. ลดการป้อนข้อมูลลงครึ่งหนึ่ง
  2. แปลงเป็นรายการประกอบไปด้วย
  3. แยกมันออกเป็นสองรายการไบนารี่
  4. แปลงรายการเหล่านั้นจากไบนารี

เราสามารถทำการแยกใน (3) โดยการแปลง0->0,1->1,2->1สำหรับหนึ่งรายการและ0->0,1->0,2->1อื่น ๆ นั่นคือโดยการตรวจสอบค่าที่สูงกว่าเกณฑ์ที่ 0 หรือ 1

ทั้งสองค่าสามารถพบได้โดยฟังก์ชั่นวนซ้ำ:

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)

ฟังก์ชั่น fรวมสองสิ่งนี้เข้าด้วยกันในรายการความเข้าใจ สิ่งนี้ทำให้ไม่มีประสิทธิภาพเนื่องจากการแยกย่อยแบบเอกซ์โปเนนเชียล

หากจำนวนเชิงซ้อนสามารถส่งออกได้เราสามารถบันทึก 10 ไบต์ด้วย:

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

ฉันเดาว่าตัวเลขที่ซับซ้อนก็โอเค
geokavel

3

J, 35 32 ไบต์

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

ลองออนไลน์!

0-indexed และ input จะได้รับ monadically ส่งคืนการสรุปที่เป็นไปได้ทั้งหมดให้เป็นค่า (จะถือว่าa bและการb aสรุปที่เป็นไปได้ที่แตกต่างกัน)

การแปลงจากเมทริกบูลีนเป็นดัชนีใช้รหัสจำนวนมาก ...

ฉันต้องการลบทางแยกด้านซ้ายด้วยดังนั้นฉันไม่ต้องใช้วงเล็บและ@-ats หลายอัน แต่ฉันไม่สามารถหาวิธีที่ดีในการทำเช่นนั้น (วิธีสำรองของฉันไม่ได้ช่วยประหยัดไบต์ใด ๆ )

คำอธิบาย

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

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

valid_numsให้ผลเป็นเมทริกบูลีนที่ดัชนีเป็นดัชนีของค่าลำดับผลรวม หากมีหนึ่งที่ดัชนีเหล่านั้นก็หมายความว่าตัวเลขทั้งสองรวมกับค่าอินพุต

indices_of_onesเป็น J idiom สำหรับกำหนดพิกัดของวัตถุในเมทริกบูลีนยศแบบสุ่ม

ฟังก์ชั่นหลักค่อนข้างเรียบง่าย

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

,- ทำงานได้ดีในกรณีนี้โดยการเข้าร่วมแต่ละแถวต่อไป

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

เราจะเห็นได้ว่าถ้านี่คือเมทริกบูลีนพิกัดของวัตถุนั้นสามารถหาได้โดยการตีความดัชนีของเมทริกซ์ raveled เป็นตัวเลขในฐานของรูปร่างของเมทริกซ์นั้นโดยใช้วลีบุพบทที่มากที่สุดเท่าที่จะเป็นไปได้ .


1
เอาต์พุตที่ซ้ำซ้อนของคุณนั้นโอเค
geokavel

3

MATL , 22 21 19 17 ไบต์

tQ:qBEI_ZA&+=R&fh

ผลลัพธ์เป็นแบบ 1 โปรแกรมสร้างคู่โซลูชันทั้งหมด ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมดตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

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 กล่าวว่าการผลิตโซลูชั่นทั้งหมดก็โอเคในความคิดเห็น
H.PWiz

@ H.PWiz ขอบคุณ! ฉันไม่เห็นเลย
หลุยส์เมนโด


2

Pyth , 29 ไบต์

สิ่งนี้ส่งคืนคู่ดัชนีที่เป็นไปได้ทั้งหมด

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

ลองที่นี่

Pyth , 30 ไบต์

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

ลองที่นี่

[LowerIndex, HigherIndex]นี้จะส่งกลับคู่ของดัชนีเป็น


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

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 ไบต์ (CP-1252)

½3B2>_B™2Bv

ลองออนไลน์!

อัลกอริทึมมันเป็นอย่างมากเช่นเดียวกับนีลตอบ ES6 ในระดับที่ต่ำกว่ายังยอดเยี่ยมคล้ายกับH.PWiz คำตอบของแกลบ ฉันขบขันที่เราต้องใช้การรับน้ำหนักเกินทั้งสามBอย่าง

รับจำนวนเต็มบนสแต็กออกจากรายการจำนวนเต็มสองตัวบนสแต็ก

คำอธิบาย:

½           .. 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 , 122 120 ไบต์

-2 ไบต์ขอบคุณ Mr. Xcoder!

0 การจัดทำดัชนี

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]

ลองออนไลน์!


1
หวังว่าคุณจะไม่ว่าอะไร. ฉันเพิ่มลิงค์ TiO
Mr. Xcoder

1

Mathematica, 94 ไบต์

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


1 การจัดทำดัชนี


1

JavaScript, 120 101 ไบต์

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]

ลองออนไลน์!

0 การจัดทำดัชนี
มันจะส่งคืนดัชนีที่ดัชนีหนึ่งมีค่าน้อยที่สุดเท่าที่จะเป็นไปได้ (ตัวอย่างเช่นในกรณีที่ดัชนี428คืนมา22,31)


1

Brain-Flak , 220 166 ไบต์

-54 ไบต์โดยค้นหาฟังก์ชันโมดูโลบนวิกิทำให้สามารถเปลี่ยนแปลงโครงสร้างบางอย่างได้

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

ลองออนไลน์!

0 การจัดทำดัชนี

คำอธิบาย

เช่นเดียวกับโซลูชั่นอื่น ๆ มากมายนี่เป็นการคำนวณการขยายแบบสามส่วนn/2และแปลงนั้นเป็นเลขฐานสอง

ขั้นตอนที่ 1: แบ่งการป้อนข้อมูลด้วย 2

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

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

ขั้นตอนที่ 2: คำนวณการขยายส่วนที่สาม

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

 ({}(<>))<>         {   (({})){({}[()])<>}{} }{}<> ([{}()]{})         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: แปลงเป็นโซลูชัน

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

([]){{}                                                      ([][()])}           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ไบต์

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

(จัดทำดัชนี 0 และเห็นได้ชัดว่าเกือบเป็นทางออกเดียวกับ @Neil แม้ว่าฉันจะไม่เห็นคำตอบของเขา)

ฉันเริ่มต้นด้วยการดึงดัชนีกลับมาจากตัวเลขโดยใช้ reverse ของกระบวนการ: stringify ด้วย base 3 แทนที่ทุกอัน2ด้วย1 , แจงด้วย base 2

เพื่อให้ได้ตัวเลขสองตัวและนั่นสำหรับทุกๆคู่เราแค่ใส่ครึ่งหนึ่ง - แต่ตอนนี้1ตัวเลขก็สามารถเกิดขึ้นได้เช่นกัน ดังนั้นเราจึงแทนที่ด้วย a 0ในจำนวนหนึ่งและ a 2ในอีกหมายเลขหนึ่งซึ่งไม่เปลี่ยนผลรวมของสองก่อนหน้าขั้นตอนการแทนที่และแยก นี่คือสิ่งที่ฉันคิดขึ้นมา (ทำสองสิ่งทดแทน1-> 0-or-2 และ2-> 1ในขั้นตอนเดียว):

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

แน่นอนว่าการแทนที่ทั้งสองแผนที่ (สตริง) แตกต่างกันในดัชนีเดียวเท่านั้นดังนั้นเราควรจะสามารถย่ออาร์เรย์ตัวอักษรให้สั้นลงโดยการแทนที่1และ2ด้วยd == 2 ? 1 : xเท่านั้น d-1 || xหรือ ที่ไหน-1ไม่เช่นเดียวกับสองผู้ประกอบการเอก - แต่พวกเขาดูน่ากลัว :-)

พยายามหลีกเลี่ยงการเรียงลำดับตัวอักษรและวงเล็บที่อยู่รอบ ๆn/2ฉันด้วย

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

แต่มันก็ไม่เกิดผล


ฉันเริ่มด้วย["001","011"]เวอร์ชันด้วย (ชื่อตัวแปรของฉันแตกต่างกัน)
Neil

ฉันคิดว่า.replace(/./g,d=>d>>1|x)ประหยัดได้ 2 ไบต์
Neil

@Neil แต่น่าเสียดายที่ไม่ได้ทำงานd="0"และx=1- หลักควรจะอยู่0
Bergi

ใช่ฉันเพิ่งทำออกมาหลังจากลองทดสอบอีกสองสามกรณี (และฉันได้เกิดขึ้นกับตัวแปรอื่น แต่นั่นเป็นไปในคำตอบของฉันฉันกลัว.)
Neil

1
โอ้ดีมากและผมคิดว่าผมเป็นฉลาดจะชนะรุ่นก่อนหน้าของคุณ ...
นีล

0

Pyth, 22 ไบต์

J.m}1jb3hQxLJhfqsTQ^J2

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

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