Mảng của tôi nên bằng cái này, nhưng nó không!


21

Cho một mảng các số nguyên achứa n số nguyên và một số nguyên duy nhất x; loại bỏ số lượng phần tử ít nhất ađể tạo ra tổng abằng x. Nếu không có kết hợp nào acó thể hình thành x, trả về giá trị giả.

Như đã chỉ ra trong một nhận xét, đây là tập hợp tối đa với tổng x , xin lỗi bộ não toán học ít hơn của tôi. Tôi đã quên rất nhiều điều khoản kể từ khi học đại học.


Ví dụ (Sự thật):

f([1,2,3,4,5,6,7,8,9,10], 10) = [1,2,3,4]

f([2,2,2,2,2,2,2,2,2], 10) = [2,2,2,2,2]

f([2,2,2,2,-2,-2,-2,-4,-2], -8) = [2,2,-2,-2,-2,-4,-2]

f([-2,-4,-2], -6) = [-4,-2] OR [-2,-4]

f([2,2,2,4,2,-2,-2,-2,-4,-2], 0) = [2,2,2,4,2,-2,-2,-2,-4,-2] (Không thay đổi)

f([], 0) = [] (Trường hợp không tổng không thay đổi)


Ví dụ (Falsy, mọi giá trị không phải là mảng nhất quán):

Không thể thực hiện trường hợp: f([-2,4,6,-8], 3) = falsy (E.G. -1)

Trường hợp không tổng: f([], non-zero number) = falsy (E.G. -1)

  • Lưu ý: bất kỳ giá trị nào như [-1]không thể có giá trị cho giả, vì đó là một đầu ra trung thực tiềm năng.

Quy tắc:

  • Đầu vào có thể được lấy ở dạng mảng hoặc dưới dạng danh sách các đối số, cuối cùng hoặc đầu tiên x.
  • Đầu ra có thể là bất kỳ danh sách giới hạn của số nguyên. TRỨNG 1\n2\n3\nhay [1,2,3].
  • Bất kỳ giá trị nào cũng có thể được sử dụng như một chỉ báo giả, trừ một mảng các số nguyên.
  • Mã của bạn phải tối đa hóa kích thước của mảng kết thúc, thứ tự không quan trọng.
    • EG Cho f([3,2,3],5)cả hai [2,3][3,2]đều có giá trị như nhau.
    • EG Đối với f([1,1,2],2)bạn chỉ có thể trở lại [1,1]như [2]là ngắn hơn.
  • Cả tổng avà giá trị của xsẽ nhỏ hơn 2^32-1và lớn hơn -2^32-1.
  • Đây là , byte thấp nhất.
  • Nếu có nhiều tập hợp con có cùng kích thước hợp lệ, thì không thể chấp nhận đầu ra tất cả chúng. Bạn phải chọn một cái duy nhất và đầu ra cái đó.

Hãy cho tôi biết nếu điều này đã được đăng, tôi không thể tìm thấy nó.

Bài viết tôi tìm thấy như thế này : Liên quan nhưng đã đóng , ...


1
Tôi cho rằng "Falsy, bất kỳ giá trị không phải là mảng nhất quán" bao gồm việc gây ra lỗi?
Jonathan Allan

" Bất kỳ giá trị nào cũng có thể được sử dụng làm chỉ báo giả, trừ một mảng số nguyên. " Điều đó có bao gồm một mảng trống không?
Xù xì

@shaggy [] là biểu thị của một giá trị trung thực tiềm năng, phải không? Là cho phép quy tắc meta quan trọng hơn sự thật và giả dối khác biệt?
Bạch tuộc ma thuật Urn

@Johnathan ALLan nếu lỗi đó không thể được nêu ra trong một kịch bản Sự thật- Tôi cho rằng. Nhưng tôi cảm thấy điều này là cố ý kéo dài thông số kỹ thuật. Nếu tôi thay đổi từ ngữ từ chỉ báo sang giá trị trả lại thì có ổn không?
Bạch tuộc ma thuật Urn

Tôi có tin rằng các giá trị thoát nhất quán được tính là giá trị trả về mặc dù trên mỗi meta không?
Bạch tuộc ma thuật Urn

Câu trả lời:


7

Brachylog , 8 byte

h⊇.+~t?∧

Hãy thử trực tuyến!

Câu trả lời hàng tháng của Brachylog. Trả về false.nếu không thể.

Giải trình

h⊇.           The output is a subset of the head of the input
  .+~t?       The sum of the elements of the output must equal the tail of the input
       ∧      (Avoid implicit unification between the output and the input)

6

Python 2 , 108 104 byte

lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]
from itertools import*

Hãy thử trực tuyến!

-4 byte, nhờ Jonathan Allan


Python 2 , 108 106 byte

def f(a,n):
 q=[a]
 while q:
  x=q.pop(0);q+=[x[:i]+x[i+1:]for i in range(len(x))]
  if sum(x)==n:return x

Hãy thử trực tuyến!

-2 byte, nhờ có Janathan Frech


1
Bạn có thể sử dụng range(-len(a),1)-llưu 2, nhưng lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]tiết kiệm 4.
Jonathan Allan


1
Có thể 106 byte .
Jonathan Frech

@JonathanFrech Cảm ơn, tôi đã mệt mỏi ngày hôm qua;)
TFeld



4

Bình thường , 8 byte

  • 8-byter ( Hãy thử! ) - Chỉ đưa ra một giải pháp khả thi. Đối với các đầu vào không thể giải quyết được, nó không in bất cứ thứ gì sang STDOUT, đây là một chuỗi rỗng, nói về mặt kỹ thuật là falsey trong Pyth, nhưng ghi vào STDERR. Cảm ơn FryAmTheEggman đã gợi ý điều này (bỏ qua STDERR và chỉ tập trung vào đầu ra STDOUT), do đó tiết kiệm được 1 byte.

    efqz`sTy    
    
  • 9-byter ( Hãy thử! ) - Chỉ đưa ra một giải pháp khả thi, được bao bọc trong một danh sách đơn lẻ theo mặc định (ví dụ ([1...10], 10) -> [[1,2,3,4]]; ([], 0) -> [[]]). Đối với các đầu vào không thể giải quyết, nó trả về [], đó là falsey trong Pyth.

    >1fqz`sTy
    
  • 10-byter ( Hãy thử! ) - Để có đầu ra rõ ràng hơn, không sử dụng quy tắc danh sách đơn và sử dụng 0thay vì []làm giá trị giả.

    e+0fqz`sTy
    

Giải trình

Đầu tiên, mã tính toán bộ quyền hạn của danh sách đầu vào (tất cả các bộ sưu tập con được đặt hàng có thể có). Sau đó, nó chỉ giữ những bộ sưu tập có tổng bằng số đầu vào. Cần lưu ý rằng các bộ sưu tập được tạo ra từ ngắn nhất đến dài nhất, vì vậy chúng tôi tập trung vào cái cuối cùng. Để có được nó:

  • Các 8-byter chỉ đơn giản là sử dụng cuối tích hợp, trong đó ném một lỗi, nhưng STDERR thể bỏ qua theo nguyên tắc trang của chúng tôi, sản lượng để STDOUT là một chuỗi rỗng, đó là falsy.
  • Các 9-byter mất yếu tố cuối cùng, nhưng sử dụng mã Python tương đương lst[-1:]ở vị trí của lst[-1]lỗi tránh khỏi bị ném cho đầu vào nan giải.
  • Các 10-byter prepends một 0 vào danh sách lọc sub-bộ sưu tập, sau đó mất hết bộ sưu tập mà (yếu tố cuối cùng). Nếu đầu vào không thể giải quyết được thì thay vào đó, 0 được sử dụng một cách tự nhiên.

[]là giả? Khéo léo. Tại sao Pyth làm điều đó []?
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Pyth thừa hưởng điều đó từ Python thực sự: Hãy thử trực tuyến .
Ông Xcoder

@FryAmTheEggman danh sách trống sẽ là đầu ra trung thực trong trường hợp thử nghiệm f([], 0) = []?
Sok

@FryAmTheEggman Cảm ơn lời đề nghị của bạn! Tôi đã thực hiện các thay đổi cần thiết :)
Ông Xcoder


3

Perl 6 , 38 37 byte

{*.combinations.grep(*.sum==$_).tail}

Hãy thử trực tuyến!

Chức năng cuộn tròn.


Đợi đã, có ;cần thiết không?
Jo King

@JoKing Cần phải lặp lại trước đó để tránh lỗi "đóng cửa kép không đúng định dạng". Nhưng vì một số lý do, nó có thể được bỏ qua ngay bây giờ. (Tôi nghĩ sau khi tôi thay thế $^xbằng $_.)
nwellnhof

3

Brachylog , 4 byte

⟨⊇+⟩

Hãy thử trực tuyến!

Chỉ tương đương với Fatalize h⊇.+~t?∧, ngoại trừ ngắn hơn rất nhiều , nhờ tính năng sáng tác vị ngữ mà theo lịch sử chỉnh sửa của tài liệu tham khảo là một công việc đang diễn ra cho đến ngày 8 tháng 1, hoãn lại câu trả lời trong hơn hai tháng. ⟨⊇+⟩là một bánh sandwich , mở rộng đến {[I,J]∧I⊇.+J∧}, trong đó trường hợp niềng răng không liên quan vì dù sao bánh sandwich cũng nằm trên dây chuyền của chính nó.

                The input
[I,J]           is a list of two elements I and J.
        .       The output,
         +J     which sums to J
           ∧    (which we don't unify with the output),
      I⊇        is a sublist of I
     ∧          (which we don't unify with [I,J]).

Một sự chuyển đổi ít hơn nhiều so với câu trả lời của Fatalize, sử dụng cùng một vị từ với cùng một biến nhưng đưa ra một byte ngắn hơn từ cách tổ chức khác nhau:

Brachylog , 7 byte

h⊇.&t~+

Hãy thử trực tuyến!

           The input
h          's first element
 ⊇         is a superlist of
  .        the output,
   &       and the input
    t      's last item
     ~+    is the sum of the elements of
           the output.

(Ngoài ra, nếu bất cứ ai muốn thấy điều gì đó kỳ lạ, hãy thay đổi bất kỳ dấu gạch dưới nào trong các trường hợp thử nghiệm thành dấu gạch nối.)


1
Sandwiches được thực hiện bởi @ ais523 vào tháng 11 năm 2018 nhưng chỉ được kéo vào Brachylog vào đầu tháng 1 năm 2019.
Fatalize

1
Tất nhiên, không có vấn đề nào trong lịch sử này, vì các ngôn ngữ trì hoãn thử thách đã được cho phép trong nhiều năm.
pppery


2

Sạch , 89 byte

import StdEnv,Data.List,Data.Func
$n=find((==)n o sum)o sortBy(on(>)length)o subsequences

Hãy thử trực tuyến!

Xác định hàm $ :: Int -> [Int] -> (Maybe [Int])trả về Nothingnếu không có sự kết hợp thích hợp của các phần tử và mặt (Just [elements...])khác.


2

JavaScript (ES6), 108 byte

Đưa đầu vào là (array)(n). Trả về một mảng hoặc false.

a=>n=>a.reduce((a,x)=>[...a,...a.map(y=>1/r[(y=[...y]).push(x)]||eval(y.join`+`)-n?y:r=y)],[[]],r=!n&&[])&&r

Hãy thử trực tuyến!


2

Điều này bắt đầu mát mẻ và nhỏ, nhưng trường hợp cạnh đã cho tôi. Bất cứ điều gì xảy ra, tôi tự hào về công việc tôi đưa vào này.

Python 3 , 169 161 154 byte

from itertools import*
def f(a,x):
	if sum(a)==x:return a
	try:return[c for i in range(len(a))for c in combinations(a,i)if sum(c)==x][-1]
	except:return 0

Hãy thử trực tuyến!


Hãy nhớ rằng đây là [code-golf] vì vậy bạn nên cố gắng làm cho số byte của mình càng nhỏ càng tốt! Bạn có một dòng mới hàng đầu và một số sân golf không gian tầm thường khác , và tôi cá là một người khác biết trăn có thể đánh gôn này xuống hơn nữa.
Giuseppe

@Giuseppe Cảm ơn bạn đã nhắc nhở tôi về khoảng trắng hàng đầu. Tôi đã dành một chút thời gian để cố gắng hợp nhất một số phần của điều này, nhưng quyết định đăng nó trong thời gian đó trong trường hợp bất kỳ ai khác có thể đề nghị chỉnh sửa.
Gigaflop

Không thành vấn đề! Đã 5 năm kể từ khi tôi làm bất kỳ Python nào, nhưng không range(x)tạo ra (0...x-1)? Vì vậy, bạn range(len(a))không cung cấp cho bạn khả năng để mảng không thay đổi?
Giuseppe

@Giuseppe Eureka, đã làm điều đó. Tôi có thể đã tập trung quá nhiều vào tài liệu mới mà tôi đang làm việc.
Gigaflop

Thay vì if a==[] and x==0sử dụng if sum(a)==x. Sau đó, bạn cũng có thể loại bỏ +1khỏi range.
Vedant Kandoi


1

Tùy viên , 28 byte

${(y&`=@Sum\Radiations@x)@0}

Hãy thử trực tuyến!

Lựa chọn thay thế

34 byte :f[x,y]:=({y=Sum@_}\Radiations@x)@0

30 byte :First@${y&`=@Sum\Radiations@x}

29 byte :{(_&`=@Sum\_2)@0}#/Radiations

29 byte :${({y=Sum@_}\Radiations@x)@0}

29 byte :`@&0@${y&`=@Sum\Radiations@x}

29 byte :{_}@@${y&`=@Sum\Radiations@x}

Giải trình

${(y&`=@Sum\Radiations@x)@0}
${                         }    function receiving two arguments, x and y
            Radiations@x        calculate the radiations of x
                                (simulates removing all possible subslices of x)
           \                    keep those radiations
        Sum                     ...whose sum...
     `=@                        ...equals...
   y&                           ...y
  (                     )@0     select the first one (always the longest)

0

APL (NARS), 65 ký tự, 130 byte

{m←⍺=+/¨v←1↓{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}⍵⋄0=↑⍴b←m/v:⍬⋄b⊃⍨n⍳⌈/n←⍴¨b}

Được sử dụng vì phần tử đầu tiên của tập hợp sẽ là một tập hợp void (ở đây Zilde), người ta muốn loại bỏ vì có vẻ + / ⍬ bằng 0 ...

Nếu không tìm thấy, hoặc lỗi, nó sẽ trả về hoặc trong văn bản in:

  o←⎕fmt
  o ⍬
┌0─┐
│ 0│
└~─┘

kiểm tra:

  z←{m←⍺=+/¨v←1↓{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}⍵⋄0=↑⍴b←m/v:⍬⋄b⊃⍨n⍳⌈/n←⍴¨b}

  o 1 z ,1
┌1─┐
│ 1│
└~─┘
  o 2 z ,1
┌0─┐
│ 0│
└~─┘
  o 10 z 1 2 3 4 5 6 7 8 9 10
┌4───────┐
│ 1 2 3 4│
└~───────┘
  o 10 z 2,2,2,2,2,2,2,2,2
┌5─────────┐
│ 2 2 2 2 2│
└~─────────┘
  o ¯8 z 2,2,2,2,¯2,¯2,¯2,¯4,¯2
┌7──────────────────┐
│ 2 2 ¯2 ¯2 ¯2 ¯4 ¯2│
└~──────────────────┘
  o ¯6 z ¯2,¯4,¯2
┌2─────┐
│ ¯4 ¯2│
└~─────┘
  o 0 z 2,2,2,4,2,¯2,¯2,¯2,¯4,¯2
┌10───────────────────────┐
│ 2 2 2 4 2 ¯2 ¯2 ¯2 ¯4 ¯2│
└~────────────────────────┘
  o 10 z 1 2 3 4
┌4───────┐
│ 1 2 3 4│
└~───────┘
  o 10 z 1 2 3
┌0─┐
│ 0│
└~─┘
  o 0 z ⍬
┌0─┐
│ 0│
└~─┘
  o +/⍬  
0
~
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.