เพิ่มขึ้นลำดับเพิ่มขึ้น


19

เรามีลำดับของจำนวนเต็มที่ไม่เป็นลบที่เพิ่มขึ้นอย่างเคร่งครัดเช่น:

12 11 10

รอ! ลำดับนี้ไม่เพิ่มขึ้นอย่างแน่นอนใช่ไหม ตัวเลขเขียนในฐานที่ต่างกัน ฐานที่เป็นไปได้น้อยที่สุดคือ 2 ที่ใหญ่ที่สุดคือ 10

งานคือการคาดเดาฐานแต่ละหมายเลขถูกเขียนเพื่อให้:

  • ลำดับเพิ่มขึ้นอย่างเข้มงวด
  • ผลรวมของฐานถูกขยายให้ใหญ่สุด

ตัวอย่างเช่นการแก้ปัญหาสำหรับตัวอย่างจะเป็น:

6 8 10

เพราะภายใต้ฐานผู้ลำดับกลายเป็น8 9 10ทศนิยม - 6+8+10ลำดับที่เพิ่มขึ้นอย่างเคร่งครัดและเราไม่ได้มีความสามารถในการหาฐานที่ยังคงอยู่ลำดับที่เพิ่มขึ้นอย่างเคร่งครัดและมีผลรวมมีขนาดใหญ่กว่า

เนื่องจากข้อ จำกัด ที่สองแก้ปัญหา3 5 7ไม่เป็นที่พอใจ: ทั้งๆที่ความจริงว่าลำดับกลายเป็น5 6 7ภายใต้ฐานเหล่านั้น - 3+5+7 < 6+8+10เราจำเป็นต้องเพิ่มผลรวมฐานและ

หากไม่มีฐาน2<=b<=10เป็นไปได้ที่ซีรี่ส์จะเพิ่มขึ้นอย่างเคร่งครัดเช่น:

102 10000 10

เดียว

0

ควรจะออก

ลำดับการป้อนข้อมูลสามารถส่งผ่านในวิธีที่สะดวกที่สุดสำหรับโซลูชันของคุณ (พารามิเตอร์อินพุต / บรรทัดคำสั่งมาตรฐาน / อาร์กิวเมนต์ของฟังก์ชัน ... )


1
เป็น1 3 5ลำดับเพิ่มขึ้น? เกี่ยวกับ1 7 22อะไร (ในฐาน 10)
Doorknob

ใช่1 3 5และ1 7 22ทั้งคู่กำลังเพิ่มขึ้นภายใต้ฐาน 10 ดังนั้นวิธีแก้ปัญหาสำหรับทั้งสองกรณีคือ10 10 10เนื่องจากเราจำเป็นต้องเพิ่มผลรวมของฐานให้มากที่สุดในขณะที่มั่นใจว่าลำดับเพิ่มขึ้นเมื่อตัวเลข n-th ถูกตีความว่าเขียนในฐานเท่ากับ n - ระยะเวลาของการแก้ปัญหา
pawel.boczarski

2
@ เดนนิสใช่ฉันหมายถึงลำดับที่เพิ่มขึ้นอย่างเคร่งครัด 1 1 1หรือ3 3 4ไม่เพิ่มขึ้น
pawel.boczarski

3
หากความคิดเห็นบ่งชี้ว่าคำถามนั้นเปิดให้มีการตีความที่ผิดอย่าเพิ่งตอบกลับความคิดเห็น แก้ไขคำถามเพื่อให้คนอื่นไม่ต้องเสียเวลาเขียนคำตอบซึ่งตีความมันแตกต่างไปจากคุณ
Peter Taylor

3
และในเรื่องของความคลุมเครือหนึ่งในความคิดเห็นเกี่ยวกับคำตอบของฉันอ้างว่าเราควรสมมติว่าตัวเลขนั้นเขียนในรูปแบบมาตรฐานในฐานที่กำหนด หากเป็นเช่นนั้นโปรดแก้ไขวลี " ฐานที่เป็นไปได้น้อยที่สุดคือ 2 " กับบางอย่างเช่น " ฐานที่เป็นไปได้น้อยที่สุดคือหนึ่งที่มากกว่าค่าที่ใหญ่ที่สุด "
Peter Taylor

คำตอบ:


13

Pyth, 31 30 29 ไบต์

e+0f.x!sgM.:iVczdT2ZosN^STlcz

1 ไบต์ต้องขอบคุณ @Jakube

สาธิต. สายรัดทดสอบ

อินพุตถูกกำหนดบน STDIN คั่นด้วยช่องว่าง หากอนุญาตให้ใช้อินพุตที่คั่นด้วยบรรทัดใหม่ฉันสามารถทำให้โปรแกรมสั้นลง 2 ไบต์

คำอธิบาย:

e+0f.x!sgM.:iVczdT2ZosN^STlcz
                                  Implicit: z = input(), T = 10, Z = 0, d = ' '
                        ST        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
                          lcz     len(z.split())
                       ^          All combinations w/replacement of that length.
                    osN           Order by increasing sum.
   f                              Filter on
              czd                 z.split(' ')
            iV   T                Vectorize the "Convert to base" operation over 
                                  the integers as strings and the base sequence.
          .:      2               Take length 2 subsequences.
        gM                        Map the >= operation over them.
      !s                          Sum and logically negate.
    .x             Z              If that throws an error, returns 0 (e.g. reject)
 +0                               Prepend a 0, in case no sequences are found.
e                                 Take the end of the list.

การรวม1ในรายการของฐานที่เป็นไปได้นั้นปลอดภัยเพราะiซึ่งใช้ Python intbuiltin ไม่อนุญาตให้1ใช้เป็นฐานและมักจะโยนข้อผิดพลาดซึ่งถูกจับและกรองออก


9

CJam, 43 ไบต์

0B,2>ea,m*{:+~}${ea::~_2$.b__Q|$=*@.b=}=p];

อ่านอาร์กิวเมนต์บรรทัดคำสั่งและพิมพ์อาร์เรย์

ลองใช้ออนไลน์ในล่าม CJamล่าม

ตัวอย่าง

$ cjam rise.cjam 12 11 10
[6 8 10]
$ cjam rise.cjam 19 18 17
0

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

0       e# Push a 0 (default return value).
B,2>    e# Push [0 ... 10] and remove the first two elements.
ea,     e# Push the number of command-line arguments (n).
m*      e# Cartesian power. Pushes all vectors of {2 ... 10}^n.
{:+~}$  e# Sort by the negated sums.
{       e# Find; for each vector V in {2 ... 10}^n:
  ea::~ e#   Evaluate each character of each command-line argument.
  _2$   e#   Copy the results and V.
  .b    e#   Vectorized base conversion (list to integer).
  __    e#   Push two copies.
  Q|$   e#   Deduplicate and sort the last copy.
  =     e#   Compare it to the first. Pushes 1/0 if equal/unequal.
  *     e#   Repeat the original result of .b that many times.
  @.b   e#   Vectorized base conversion (integer to list).
  =     e#   Compare the result to the modified command-line arguments.
        e#   Equality makes sure that the base was greater than all digits.
}=      e# If pushed 1, push V and break.
p       e# Print. Either prints the last V or 0 if none matched.
];      e# Clear the stack to avoid implicitly printing the 0 (if still present).

6

Julia, 176 156 145 118 109 99 97 ไบต์

A->try p=NaN;flipud(map(i->(k=11;t=p;while t<=(p=parseint("$i",k-=1))end;k),flipud(A)))catch;0end

Ungolfed:

function anonfunc(i)
  # Start with k=11 so that it evaluates to 10 on first while iteration
  k=11
  # set t to the previous value of p
  # Note: p here gets held over between iterations within the map
  t=p
  # Iterate through, dropping k by 1 and evaluating the integer in
  # base k and stopping if the value drops below t
  # Note: "p=" expression inside conditional to ensure k-=1 is evaluated
  # at least once (to make NaN work as desired)
  while t<=(p=parseint("$i",k-=1))
  end
  # if it dropped below t, return the base, k to be the corresponding
  # element in the map
  return k
end

function f(A)
  # Using try/catch to return 0 if no acceptable base found
  try
    # This is a trick to make sure the comparison in the while loop
    # evaluates to false on the first use of it (last value in A)
    p=NaN
    # Apply anonfunc to each element of A, starting with the last element
    # and store the result in S
    S=map(anonfunc,flipud(A))
    # S is backwards, so flip it and return it
    return flipud(S)
  catch
    # Will throw to here if parseint fails with the base due to having
    # a digit not acceptable in the base
    return 0
  end
end

ใช้กับอินพุตอาร์เรย์ 1d หากฟังก์ชั่นที่ได้รับมอบหมายไปcแล้วคุณจะเรียกและมันจะเอาท์พุทc([12,11,10])[6,8,10]

หมายเหตุ: ฉันได้ใช้dec(i)ภายในคำสั่ง parseint แต่เนื่องจากiเป็นชื่อตัวแปรอักขระเดี่ยวและฉันไม่ต้องการเข้าถึงคอมโพเนนต์ฉันจึง"$i"ได้ผลลัพธ์เดียวกัน


คุณมีเทคนิคที่ดีที่นี่ ทำได้ดีมาก
Alex A.

รหัสนี้ดูเหมือนว่าจะตรวจสอบเบสเพื่อลดลำดับอย่างเคร่งครัดภายใต้ลำดับการอ่านจากซ้ายไปขวาตามปกติ
pawel.boczarski

@ pawel.boczarski - ฉันไม่แน่ใจว่าคุณหมายถึงอะไร แต่ถ้าคุณต้องการฉันสามารถให้ตัวอย่างของสิ่งที่มันส่งออกสำหรับการป้อนข้อมูลบางอย่าง ตัวอย่างเช่นถ้าคุณกำหนดชื่อฟังก์ชั่นcแล้วc([12,11,10])เอาท์พุท[6,8,10]ซึ่งเป็นฐานที่จำเป็น
เกลน O

@GlenO โอ้ฉันเห็น ฉันใช้เวกเตอร์แถว[12 11 10]แทน[12,11,10]และนั่นเป็นผลที่ไม่พึงประสงค์
pawel.boczarski

@ pawel.boczarski - อ่าเข้าใจแล้ว ใช่ถ้าคุณต้องการให้มันทำงานกับเวกเตอร์แถวคุณต้องแทนที่ "flipud" ด้วย "fliplr" ซึ่งในกรณีนี้มันจะคืนค่าเวกเตอร์แถวของฐาน
เกลน O

5

Julia, 259 204 183 ไบต์

บันทึกพวงด้วยความช่วยเหลือจาก Glen O.

A->(M(x)=maxabs(digits(x))+1:10;S=[];X={};for i=M(A[1]),j=M(A[2]),k=M(A[3]) s=map(parseint,map(dec,A),[i,j,k]);all(diff(s).>0)&&(S=[S,sum(s)];X=[X,{[i,j,k]}])end;X==[]?0:X[indmax(S)])

คำอธิบาย Ungolfed +:

function f(A)
    # Define a function to obtain the smallest possible base range
    M(x) = (maxabs(digits(x)) + 1):10

    # Define container arrays for the sums and bases
    S = []
    X = {}

    # Loop over all possible bases for each of the elements
    for i = M(A[1]), j = M(A[2]), k = M(A[3])
        # Parse each element of the input as a string
        # in the given base
        s = map(parseint, map(dec, A), [i,j,k])

        # Push the sum and bases if s is rising
        if all(diff(s) .> 0)
            S = [S, sum(s)]
            X = [X, {[i,j,k]}]
        end
    end

    # If X is empty, return 0, otherwise return the bases
    isempty(X) ? 0 : X[indmax(S)]
end

ตกลงการตีกอล์ฟบางอย่างต้องทำ ... ใช้ "repr" แทน "string" ในคำสั่ง map พวกเขาจะทำงานเหมือนกันในบริบทนี้และบันทึกสองไบต์ และเราสามารถประหยัดได้อีกสองสามโดยใช้ตัวดำเนินการมัดสำหรับ parseint โดยการเขียน "\ = parseint" แล้วใช้ x [1] \ i มากกว่า p (x [1], i) - อีกหนึ่งไบต์ใน "\" ส่วนแล้วบันทึกสามสำหรับแต่ละการใช้ p สำหรับการบันทึกสุทธิ 8 ไบต์ อีกหนึ่งไบต์ที่บันทึกไว้โดยแทนที่ "สูงสุด (หลัก (x)) ด้วยสูงสุด (ตัวเลข (x) ... )"
เกลน O

สำหรับการประหยัดที่ใหญ่กว่าผสานสำหรับลูป - การใช้งานfor i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;ประหยัดแปดลดลงสองend;และแปดสำหรับการเปลี่ยน `` ,สำหรับกับ
เกลน O

ที่จริงเราสามารถทำได้ดียิ่งขึ้นสำหรับส่วน parseint ปล่อยการเปลี่ยนชื่อ parseint ทั้งหมดและใช้s=map(parseint,x,[i,j,k])ประหยัด 18 ไบต์เมื่อเทียบกับโซลูชันดั้งเดิมของคุณและ 10 เทียบกับการปรับปรุงที่แนะนำก่อนหน้านี้ของฉัน และแทนที่จะs==sort(unique(s))ใช้all(diff(s).>0)เพื่อบันทึกอีก 3 ไบต์
เกลน O

ยังมีอีกมากที่สามารถทำได้ แต่ฉันจะทิ้งคุณไว้และลองหาวิธีของตัวเองแทน
เกลน O

การแก้ไขเล็กน้อย - ฉันแนะนำให้ใช้ max (... ) แทนสูงสุด ... แต่ในขณะที่บันทึกหนึ่งไบต์มันจะล้มเหลวสำหรับค่าอินพุตหลักเดียวดังนั้นคุณต้องใช้สูงสุด
เกลน O

4

CJam (39 ไบต์)

{Afb:X,9,2f+m*{X\.b__$_&=*},{:+}$0\+W=}

นี่คือฟังก์ชันที่ไม่ระบุชื่อซึ่งรับอินพุตเป็นอาร์เรย์ของจำนวนเต็มฐานสิบในสแต็กและปล่อยให้เอาต์พุตเป็นอาร์เรย์หรือจำนวนเต็ม0บนสแต็ก สาธิตออนไลน์


นอกจากนี้ดูเหมือนว่าจะเรียงลำดับตามผลรวมของจำนวนเต็มที่เกิดขึ้นแทนที่จะเป็นฐานและมีปัญหาเดียวกันกับที่การแก้ไขครั้งก่อนของฉันมี ( 19ไม่สามารถเป็นฐาน 9 ได้)
เดนนิส

1
อืมมม คำถามดูเหมือนจะต้องมีการปรับปรุง
Peter Taylor

@PeterTaylor Pah แก้ตัว;)
Beta Decay

2

Python 2 (147 ไบต์)

def x(s):
 q=int;c=10;o=q(s[-1])+1;l=[]
 for i in map(str,s)[::-1]:
    n=q(i,c)
    while o<=n:
        c-=1;n=q(i,c)
        if 3>c:return 0
    l=[c]+l;o=n
 return l

เรียกใช้ฟังก์ชัน xด้วยรายการของ ints

ตัวอย่าง:

print x([12,11,10])

พิมพ์

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