Мій масив повинен дорівнювати цьому, але це не так!


21

Дано масив цілих чисел, aякий містить n цілих чисел і одне ціле число x; видаліть найменшу кількість елементів, aщоб скласти суму, aрівну x. Якщо комбінації не aможуть скластись x, поверніть хибне значення.

Як зазначалося в коментарі, це максимальний набір із сумою х , вибачте мій менший математичний мозок. Я забув багато термінів ще з коледжу.


Приклади (Truthy):

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] (Без змін)

f([], 0) = [] (Справа без змін нульової суми)


Приклади (Falsy, будь-яке послідовне значення без масиву):

Неможливо скласти справи: f([-2,4,6,-8], 3) = falsy (E.G. -1)

Нульова сума: f([], non-zero number) = falsy (E.G. -1)

  • Примітка: будь-яке значення, подібне, [-1]не може бути дійсним для помилкового, оскільки воно є потенційним результатом.

Правила:

  • Введення може прийматися у формі масиву або як список аргументів, останній чи перший x.
  • Вихідним може бути будь-який обмежений список цілих чисел. EG 1\n2\n3\nабо [1,2,3].
  • Будь-яке значення може використовуватися як хибний показник, крім масиву цілих чисел.
  • Ваш код повинен збільшити розмір кінцевого масиву, порядок не має значення.
    • EG Для f([3,2,3],5)обох [2,3]і [3,2]вони однаково справедливі.
    • EG Для f([1,1,2],2)вас можна повернути тільки в [1,1]якості [2]коротше.
  • І сума, aі значення xбуде меншою 2^32-1та більшою за -2^32-1.
  • Це , виграє найменший байт.
  • Якщо є кілька подмассіви одного і того ж розміру , що справедливі, це НЕ прийнятно для виведення всіх з них. Ви повинні вибрати один і вивести його.

Повідомте мене, якщо це було розміщено, я не зміг його знайти.

Повідомлення, які я знайшов так : Пов'язані, але закриті , ...


1
Я припускаю, що "Falsy, будь-яке послідовне значення без масиву" включає помилку?
Джонатан Аллан

" Будь-яке значення може використовуватися як хибний індикатор, окрім масиву цілих чисел ". Чи включає він порожній масив?
Кудлатий

@shaggy [] вказує на потенційну ціннісну форму, чи не так? Чи дозволяє це мета-правило більш важливим, ніж чітка правда та хибність?
Magic Octopus Urn

@JohnathanAllan, якщо цю помилку не вдасться вирішити в сценарії Truthy - я б припустив. Але я відчуваю, що це навмисне намагається розтягнути специфікацію. Якщо я зміню формулювання з показника на значення повернення, то це добре?
Чарівний восьминога Урна

Я вірю, що послідовні значення виходу враховуються як повернене значення, хоча на мета?
Чарівний восьминога Урна

Відповіді:



6

Python 2 , 108 104 байт

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*

Спробуйте в Інтернеті!

-4 байти, завдяки Джонатану Аллану


Python 2 , 108 106 байт

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

Спробуйте в Інтернеті!

-2 байти, завдяки Джанатану Фреху


1
Ви можете використати range(-len(a),1)і -lзберегти 2, але lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]економить 4.
Джонатан Аллан

@JonathanAllan Дякую :)
TFeld


@JonathanFrech Дякую, я, мабуть, вчора втомився;)
TFeld



4

Pyth , 8 байт

  • 8-байт ( Спробуйте! ) - Виводить лише одне можливе рішення. Що стосується нерозв'язних входів, він нічого не друкує на STDOUT, що є порожнім рядком, який технічно є фальсиєю в Pyth, але пише в STDERR. Завдяки FryAmTheEggman за те, що запропонував це (ігноруючи STDERR і зосередившись лише на висновку STDOUT), таким чином заощадивши 1 байт.

    efqz`sTy    
    
  • 9-байт ( спробуйте! ) - виводить лише одне можливе рішення, загорнуте в однотонний список, як це дозволено за замовчуванням (наприклад ([1...10], 10) -> [[1,2,3,4]]; ([], 0) -> [[]]). Для нерозв'язних входів він повертається [], що є фальсифікою в Pyth.

    >1fqz`sTy
    
  • 10 байт ( спробуйте! ) - для більш чіткого виводу, не використовуючи правило єдиного списку та використовуючи, 0а не []як хибне значення.

    e+0fqz`sTy
    

Пояснення

По-перше, код обчислює набір живлення списку вхідних даних (усі можливі впорядковані його підбірки). Потім він зберігає лише ті колекції, сума яких дорівнює вхідному номеру. Слід зазначити, що колекції генеруються від найкоротшого до найдовшого, тому ми зосередимось на останній. Щоб отримати його:

  • 8-byter просто використовує кінець вбудований, який кидає помилку, але STDERR можуть бути проігноровані відповідно з нашими правилами сайту, вихід на STDOUT бути символом нового рядка, яка є falsy.
  • 9-byter бере останнього елемента, але використовуючи еквівалентний код Python lst[-1:]замість lst[-1]помилок уникнути від кидка для нерозв'язних входів.
  • 10-byter приєднує 0 до списку відфільтрованих суб-колекції, а потім бере кінець цієї колекції (останній елемент). Якщо входи не вирішуються, то замість цього використовується 0 .

[]хибність? Акуратний. Чому Pyth робить це []?
Чарівна восьминога урна

@MagicOctopusUrn Pyth наслідує це від Python насправді: Спробуйте це в Інтернеті .
Містер Xcoder

@FryAmTheEggman чи не пустий список не буде надійним результатом у тестовому випадку f([], 0) = []?
Сік

@FryAmTheEggman Дякую за вашу пропозицію! Я вніс необхідні зміни :)
Містер Xcoder


3

Perl 6 , 38 37 байт

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

Спробуйте в Інтернеті!

Загорнута функція.


Зачекайте, це ;навіть необхідне?
Джо Кінг

@JoKing У попередній ітерації потрібно було уникнути помилки подвійного закриття. Але чомусь це можна опустити і зараз. (Я думаю , що після того, як я замінив $^xз $_.)
nwellnhof

3

Брахілог , 4 байти

⟨⊇+⟩

Спробуйте в Інтернеті!

Це майже еквівалент Fatalize h⊇.+~t?∧, за винятком набагато коротшого, завдяки функції предикатної композиції, яка згідно історії редагування посилань працювала до 8 січня, після чого відповідь за два місяці. ⟨⊇+⟩- це сендвіч , який розширюється туди {[I,J]∧I⊇.+J∧}, де дужки в цьому випадку не мають значення, оскільки сендвіч так чи інакше знаходиться на власній лінії.

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

Набагато менш драматична трансформація відповіді Fatalize, яка використовує ті самі предикати з тими ж змінними, але виходить на байт, коротший від того, щоб організувати по-різному:

Брахілог , 7 байт

h⊇.&t~+

Спробуйте в Інтернеті!

           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.

(Крім того, якщо хтось хоче побачити щось дивне, змініть будь-яке підкреслення в тестових випадках на дефіси.)


1
Бутерброди були реалізовані @ ais523 в листопаді 2018 року , але були виведені тільки в Brachylog на початку січня 2019 року
Fatalize

1
Звичайно, жодне з цього копання історії не має значення, оскільки мови, які подають виклик, дозволяються роками.
pppery


2

Чисто , 89 байт

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

Спробуйте в Інтернеті!

Визначає функцію, що $ :: Int -> [Int] -> (Maybe [Int])повертається, Nothingякщо немає відповідної комбінації елементів, (Just [elements...])інакше.



2

Це почалося круто і мало, але кращі випадки мені дісталися. Що б не сталося, я пишаюся роботою, яку я вклав у це.

Python 3 , 169 161 154 байт

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

Спробуйте в Інтернеті!


Пам'ятайте, що це [код-гольф], тому вам слід спробувати зробити свій байт якомога меншим! У вас є провідний новий рядок та деякі інші тривіальні гольфи пробілів , і я думаю, що хтось інший, хто знає пітон, може гольфувати це ще далі.
Джузеппе

@Giuseppe Дякуємо, що нагадали про провідну пробілу. Я витратив деякий час, намагаючись закріпити деякі частини цього, але тим часом вирішив опублікувати його на випадок, якщо інші можуть запропонувати зміни.
Гігафлоп

Не проблема! Минуло 5 років, як я зробив будь-який Python, але не range(x)генерує (0...x-1)? Отже, ваш range(len(a))не дає вам можливості залишити масив незмінним?
Джузеппе

@Giuseppe Eureka, це і вдалося. Можливо, я занадто зосередився на новому матеріалі, з яким працював.
Гігафлоп

Замість if a==[] and x==0використання if sum(a)==x. Потім ви також можете видалити +1з range.
Ведант Кандой

2

R , 100 80 байт

function(a,x){i[sum(a|1):0,j[combn(a,i,,F),if(sum(j)==x)return(j)]]
F}
`[`=`for`

Спробуйте в Інтернеті!

20 байт збережено завдяки digEmAll

Повертається FALSEза неможливими критеріями.



@digEmAll Я, звичайно, радий, що не отримав шансу відредагувати у вашій відповіді 98 байт :-)
Джузеппе

eheh забув її видалити: D
digEmAll

1

Attache , 28 байт

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

Спробуйте в Інтернеті!

Альтернативи

34 байти :f[x,y]:=({y=Sum@_}\Radiations@x)@0

30 байт :First@${y&`=@Sum\Radiations@x}

29 байт :{(_&`=@Sum\_2)@0}#/Radiations

29 байт :${({y=Sum@_}\Radiations@x)@0}

29 байт :`@&0@${y&`=@Sum\Radiations@x}

29 байт :{_}@@${y&`=@Sum\Radiations@x}

Пояснення

${(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 символів, 130 байт

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

↓ використовується тому, що першим елементом набору множин буде один недійсний набір (тут ⍬ Zilde), який потрібно усунути, тому що, здається, + / ⍬ дорівнює нулю ...

Для того, щоб не знайти або помилку, вона повернеться ⍬ або в тексті друку:

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

тест:

  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
~
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.