Суми цифр від 1 до 7


21

Виклик

Враховуючи додатне ціле число, Nяке становить 28 або вище, виведіть список номерів, підсумовуючи Nце, використовуючи кожну цифру 1через 7один раз. Ви можете дати як програму або функцію.

Цифри можуть з’являтися самі по собі або з’єднуватись, якщо ви використовуєте кожну з них один раз без повторів. Наприклад, [12, 34, 56, 7]дійсно, як [1, 27, 6, 4, 35]і [1234, 567], але не [123, 34567]або [3, 2, 1476]. Порядок того, що номери вказані, значення не має.

Якщо Nнеможливо зробити 1-7, нічого не повертайте або виводите.

Інша інформація

  • Це кодовий гольф, тому найкоротший код у байтах до четверга 15 жовтня виграє.

  • Задавайте будь-які питання в коментарях.

  • Все, що я не вказую у виклику, залежить від вас.

  • Стандартні лазівки заборонені.

Приклади

Вони можуть усунути будь-яку плутанину:

Вхідні дані

28

Вихідні дані

[1, 2, 3, 4, 5, 6, 7]

Вхідні дані

100

Вихідні дані

[56, 7, 4, 31, 2]

Вхідні дані

1234567

Вихідні дані

[1234567]

Вхідні дані

29

Вихідні дані

Нічого, 29 недійсне.

Вхідні дані

1891

Вихідні дані

[1234, 657]

Вхідні дані

370

Вихідні дані

[15, 342, 7, 6]

Я зароблю більше, якщо потрібно.

Ось пастабін з усіх можливих чисел, створених за допомогою цих семи чисел, люб’язно надано FryAmTheEggman.


Для чого результат 29?
Геобіць

4
Якщо ви хочете, щоб результат не був нічого, не ставте його (N/A)як вихід.
mbomb007

1
@LukStorms [1234566, 1]не є дійсним результатом, тому що 6 повторюється. Ви не можете повторювати числа у висновку.
The_Basset_Hound

2
Можливо »... перелік чисел із десяткових цифр 1 до 7, які підсумовують N«, є більш чітким формулюванням, ніж те, що зараз у питанні.
Paŭlo Ebermann

3
Для дещо менш жорстокого рішення: Це еквівалентно призначенню коефіцієнта потужності 10 для кожного з них, 1, ..,, 7щоб було як мінімум стільки ж 1, скільки 10, принаймні стільки 10, скільки 100і так далі.
xnor

Відповіді:


9

Піт, 18 14 байт

hfqSjkTjkS7./Q

Завдяки @isaacg за те, що виграли 2 байти та проклали шлях ще на 2.

Код вийде з ладу, якщо він не дасть результату, що не призведе до отримання результату.

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

Щоб переконатися, що код працює за призначенням, ви можете замінити на 7а 3для суми цифр від 1 до 3 . Клацніть тут для тестового набору.

Приклад виконання

$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 28
(1, 2, 3, 4, 5, 6, 7)

real    4m34.634s
user    4m34.751s
sys     0m0.101s
$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 29 2>/dev/null

real    9m5.819s
user    9m6.069s
sys     0m0.093s

Як це працює

           ./Q    Compute all integer partitions of the input.
 f                Filter the integer partitions:
    jkT             Join the integers with empty separator.
   S                Sort the characters of the resulting string.
      jkS7          Join [1, ..., 7] with empty separator.
  q                 Check both results for equality.
                  Keep the partition of `q' returned True.
h                 Retrieve the first element of the filtered list.
                  For a non-empty list, this retrieves the solution.
                  For the empty list, it causes an error and produces no output.

2
Молодці! Досить інноваційний підхід. `` MS7`` коротше, ніж r\1\8. Також @ .. 0те саме, що h.
isaacg

@isaacg Дякую! Я не впевнений, як я пропустив h, але я не мав уявлення, що ти можеш скористатися Sцим способом. (Посилання на char в онлайн-перекладачі не згадує про це.) jkS7Схоже, це ще коротше, тому що мені вже не потрібно s.
Денніс

5

Пітон 3, 109

def f(n,s=set('1234567'),l='0,'):[f(n,s-{x},l+x+c)for c in(',','')for x in s]or n-sum(eval(l))or~print(l[2:])

Функція, яка приймає число і виводить кортеж у подібне 123,4567,. Так, це дійсний кортеж.

Ідея полягає в тому , щоб створити всі можливі рядки , як , 43,126,7,5,які мають цифри 1через 7розділені комами, без двох ком поспіль. Оцініть цей вираз як кортеж, а його сума дорівнює n, надрукуйте його та закінчіть помилкою.

Щоб побудувати всі такі рядки, ми відстежуємо набір sсимволів, які потрібно використовувати, і намагаємось додавати кожну або комою, яка змушує цифру закінчувати запис, або без, і в цьому випадку майбутні цифри будуть приєднані до неї.

Коротке замикання використовується , щоб перевірити, sпорожньо , тому що список-комп порожній, і що n==sum(eval(l)), в цьому випадку ми друкуємо lі завершуватися з помилкою, взявши ~з Noneповертаються печаток (завдяки Sp3000 для цього.).

Я вважаю, що в Python 3.5 можна записати дві символи написання s={*'1234567'}(дякую Sp3000).

Є деякі невеликі роздратування, які з'їдають символи. Одне полягає в тому, що у випадку, якщо lвиглядає як 1234567без коми, він розбирається як єдине число і виклик sumвидає помилку. Це обробляється злом, починаючи lз елемента 0і знімаючи його під час друку. Це коштує 6 символів.

Ітерація cнад комою та порожнім рядком дратує багатослів’я for c in(',',''), оскільки Python 3 не дозволяє цьому кортежу бути голим. Мені б хотілося, щоб було якесь значне число, ?яке ігнорується в цифрах, щоб зробити ',?'на 4 символів менше, але, схоже, такого немає.


Старий метод:

Пітон 2, 117

def f(n,s={1,2,3,4,5,6,7},l=[],p=0):
 if{n,p}|s=={0}:print l;1/0
 if p:f(n-p,s,l+[p])
 for x in s:f(n,s-{x},l,p*10+x)

Визначає функцію, яка приймає число і друкує список.

Ідея полягає у використанні рекурсії для випробування кожної гілки. Трек змінних є

  • Решта nпотрібна сума
  • Набір цифр, що sзалишилися для використання
  • Перелік lномерів, внесених до цього часу
  • Поточне частково сформоване число p

Коли n==0і sпорожньо, друкуйте lта закінчуйте помилково.

Якщо поточне частково сформоване число pне дорівнює нулю, спробуйте додати його до списку та видалити його із залишкової суми.

Для кожної цифри, яку xми можемо використовувати s, спробуйте додати її pта видалити з неї s.


4

Піта, 23

#iRThfqQsiR10Ts./M.pS7q

Наївна груба сила, занадто повільна робота в Інтернеті, займає близько хвилини на моєму комп’ютері. Використовує загальну схему "петля назавжди до виключення" піт-гольфів, коли доступ до результату відфільтрованого списку комбінацій викликає помилку для неможливих чисел, наприклад 29.

Виходи, як пітонічний список, наприклад

1891
[1234, 657]
100
[1, 2, 34, 56, 7]
370
[12, 345, 6, 7]

Ось паста з усіх 10136 номерів, які можна зробити так.


Чи можу я використати посилання на пастину для прикладів?
The_Basset_Hound

@The_Basset_Hound Звичайно, йти вперед.
FryAmTheEggman

3

Python 2.7, 178 172 169 байт

n=input()
for i in range(8**7):
 for j in len(set('%o0'%i))/8*range(128):
    s=''
    for c in'%o'%i:s+='+'[:j%2*len(s)]+c;j/=2
    if eval(s)==n:print map(int,s.split('+'));1/0

Зауважте, що останні три рядки повинні бути відрізані вкладками, але я не можу зрозуміти, як це зробити в цьому редакторі.

Редагувати: Зрівняйте один шар гніздування за допомогою Sp3000


SE, на жаль, викреслює вкладки, тому просто сказати, як це означає відступити, це добре :)
Sp3000

Ну гаразд, я все ще розгадую свій шлях навколо цього сайту.
xsot

3

JavaScript (ES6), 165 196

Редагувати Скорочене трохи. Можна використовувати коротше eval, але мені подобається, що це швидко

Груба сила, ганебно довша за версію Пітта, але швидша. Перевірте запуск фрагмента нижче в браузері, сумісному з EcmaScript 6.

f=z=>{for(r=i=1e6;r&&++i<8e6;)for(m=/(.).*\1|[089]/.test(w=i+'')?0:64;r&&m--;t.split`+`.map(v=>r-=v,r=z))for(t=w[j=0],l=1;d=w[++j];l+=l)t+=l&m?'+'+d:d;return r?'':t}

function test() { O.innerHTML=f(+I.value) }

test()

// Less golfed

f=z=>{
  for(r=i=1e6; r&&++i<8e6;)
    for(m=/(.).*\1|[089]/.test(w=i+'')?0:64; r&&m--; t.split`+`.map(v=>r-=v,r=z))
      for(t=w[j=0],l=1;d=w[++j];l+=l)
        t+=l&m?'+'+d:d;
  return r?'':t
}
<input id=I value=28><button onclick=test()>-></button><span id=O></span>


Не соромно бути довше через мову, мені дуже подобаються ваші відповіді на JS, +1
FryAmTheEggman

1

Python 2, 270 268 байт

from itertools import*;P=permutations
x,d,f=range(1,8),[],input()
r=sum([[int(''.join(str(n)for n in i))for i in list(P(x,j))]for j in x],[])
z=1
while z:
 t=sum([[list(j)for j in P(r,z)]for i in x],[])
 v=filter(lambda i:sum(i)==f,t)
 if v:print v[0];break
 else:z+=1

Ще працюю над гольфом.

Це циклі, поки не буде знайдено збіг.


import asрідко потрібно - ви можете зробитиfrom itertools import*;P=permutations
Sp3000

Використовувати його коротше, map(str,i)ніж розуміння списку, і ви можете сконструювати список r безпосередньо, а не згладжувати вкладений список: r=[int(''.join(map(str,i)))for j in x for i in P(x,j)]та подібну річ для t.
Рут Франклін

Ви можете використовувати `n`замість str(n), оскільки nніколи не буде вище максимального цілого числа.
mbomb007

1

Haskell (145 байт)

main=getLine>>=print.head.f[1..7].read
f[]0=[[]]
f b s=[n:j|(n,g)<-m b,j<-f g$s-n]
m b=[(d+10*z,g)|d<-b,(z,g)<-(0,filter(/=d)b):m(filter(/=d)b)]

Використовується рекурсія.

Безумовно (337 байт):

delete d = filter (/= d)
main = getLine >>= print . (`form` [1..7]) . read

form s [] | s == 0    = [[]]
form s ds | s <= 0    = []
form s ds | otherwise = [n:ns | (n, ds') <- makeNumbers ds, ns <- form (s-n) ds']

makeNumbers [] = []
makeNumbers ds  = [(d + 10 * n',ds') | d <- ds, (n',ds') <- (0,delete d ds):makeNumbers (delete d ds)]

0

Скала, 195 байт

Це не найефективніше, і для отримання виходу за 29 пішло 15 хвилин, але це працює

def g(s: Seq[Int]): Iterator[Seq[Int]]=s.combinations(2).map(c=>g(c.mkString.toInt +: s.filterNot(c.contains))).flatten ++ Seq(s)
def f(i: Int)=(1 to 7).permutations.map(g).flatten.find(_.sum==i)

Ось деякі результати

scala> f(100)
res2: Option[Seq[Int]] = Some(Vector(46, 35, 12, 7))

scala> f(1891)
res3: Option[Seq[Int]] = Some(Vector(567, 1324))

scala> f(370)
res4: Option[Seq[Int]] = Some(Vector(345, 12, 6, 7))

scala> f(29)
res5: Option[Seq[Int]] = None

0

Рубін, 105 байт

Груба сила! Перевіряє кожну підмножину довжин від 0 до 7 цілих чисел між 1 і 7654321 і бачить, чи відповідає одне з наших критеріїв. Напевно, ви не хочете чекати, коли це закінчиться.

->n{8.times{|i|[*1..7654321].permutation(i){|x|return x if
x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}

Для запуску та перевірки алгоритму ви можете звузити пошуковий простір, замінивши 7654321на відповідь найбільшу кількість, яку ви знаєте. Наприклад, 56 для n = 100, або 1234 для n = 1891. Ось пробний запуск останнього:

$ ruby -e "p ->n{8.times{|i|[*1..1234].permutation(i){|x|return x if x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}[gets.to_i]" <<< 1891
[657, 1234]

0 до 7 цілих чисел? Ви повинні використовувати exceclty 7 цілих чисел: 1,2,3,4,5,6,7
edc65

@ edc65 Ви маєте на увазі рівно 7 цифр . Результатом є набір цілих чисел, а розмір набору залежить від введення.
daniero

Я не розмовляю з Рубі, я вважаю, що програма працює, але я не отримую пояснень. Якщо ваші цілі числа менше 1234567, як ви отримуєте 7654321?
edc65

@ edc65 Ти маєш рацію, мені доведеться змінити це число. Я спробую це теж пояснити.
daniero
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.