Хлопчик йо, чи варто це підсумовувати


67

Кожне додатне ціле число може бути виражене як сума щонайменше трьох паліндромних позитивних цілих чисел у будь-якій базі b ≥5.   Cilleruelo et al., 2017

Позитивне ціле число є паліндромним у даній основі, якщо його представлення в цій базі, без провідних нулів, читає ті самі зворотні зміни. У наступному, тільки базової б = 10 будуть розглянуті.

Розкладання як сума паліндромних чисел не є унікальним . Наприклад, 5може бути виражена безпосередньо як 5, або як сума 2, 3. Аналогічно 132може бути розкладено як 44, 44, 44або як 121, 11.

Змагання

Давши додатне ціле число, виробіть його розклад суми на три чи менші додатні цілі числа, паліндромні в основі 10.

Додаткові правила

  • Використовуваний алгоритм повинен працювати для довільно великих входів. Однак це прийнятно, якщо програма обмежена пам'яттю, часом або типом даних.

  • Введення та вихід можна приймати будь-якими розумними засобами . Формат введення та виведення є гнучким, як зазвичай.

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

  • Програми або функції дозволені на будь- якій мові програмування . Стандартні лазівки заборонені.

  • Виграє найкоротший код у байтах.

Приклади

Оскільки вхід може мати багато декомпозицій, це приклади, а не тестові випадки. Кожне розкладання показано на іншій лінії.

Input  ->  Output

5     ->   5
           2, 3

15    ->   1, 3, 11
           9, 6

21    ->   11, 9, 1
           7, 7, 7

42    ->   22, 11, 9
           2, 7, 33

132   ->   44, 44, 44
           121, 11

345   ->   202, 44, 99
           2, 343

1022  ->   989, 33
           999, 22, 1

9265  ->   9229, 33, 3
           8338, 828, 99

32
ммм, каламбур в заголовку
Ерік Аутгольфер

Цікаво: чи є якесь ціле число, яке повинно бути складене на два паліндроми? Це зробить хороший тестовий випадок (якщо ні, ей, гольфісти можуть використовувати цей факт і лише перевірити k=1і k=3.)
Лінн

@Lynn Здається "малоймовірним", оскільки виявляється досить багато розкладу на кожен вхід. Але, як ми знаємо, інтуїція з математики може бути настільки оманливою ...
Луїс Мендо

1
@Lynn Якщо ви дозволяєте k=1(як в оригінальному номері вже паліндром), це означає, що ви припускаєте, що інші 2 числа є обома 0. Отже, якщо 0 є прийнятним як одне з чисел, будь-яке число, яке потрібно зробити з k=2також буде працювати , k=3якщо один з трьох чисел 0
Даррел Хоффман

Я не думаю, що немає жодних цифр, які ТОЛЬКО можна виразити сумою 2. Тому ви можете просто охопити 3 та 1 випадок і проігнорувати 2.
Magic Octopus Urn

Відповіді:


19

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

~+ℕᵐ.↔ᵐ

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

Дивно не так повільно.

Пояснення

(?)~+  .          Output is equal to the Input when summed
     ℕᵐ.          Each element of the Output is a positive integer
       .↔ᵐ(.)     When reversing each element of the Output, we get the Output

2
Що з випадковими .'в поясненні, і (.)? Не знаю Брахілог.
Magic Octopus Urn

3
@MagicOctopusUrn .- вихідна змінна. ~+, ℕᵐі ↔ᵐє предикатами, які мають ліву і праву змінну. Дублювання цих .просто вказує на те, що вихід бере участь безпосередньо у кожному з цих 3 викликів предикатів. Фінал (.)тут демонструє, що вихідна змінна по суті є останньою змінною програми. Тому останнє заявлене співвідношення дійсно .↔ᵐ.означає, що "відображення зворотного відображення на виході призводить до виводу" .
Фаталізувати

Нарешті, дуже вдалий вхід може бути> 10000
RosLuP


8

Желе , 12 10 9 8 байт

ŒṗDfU$ṪḌ

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

Як це працює

ŒṗDfU$ṪḌ  Main link. Argument: n (integer)

Œṗ        Find all integer partitions of n.
  D       Convert each integer in each partition to base 10.
     $    Combine the two links to the left into a chain.
    U     Upend; reverse all arrays of decimal digits.
   f      Filter the original array by the upended one.
      Ṫ   Take the last element of the filtered array.
          This selects  the lexicographically smallest decomposition of those with
          the minimal amount of palindromes.
       Ḍ  Undecimal; convert all arrays of decimal digits to integers.

5
Я просто хотів подати рішення з ~ 140 байтами, тоді я бачу 8 байт і мені здається: "Ні, не збираюся розміщувати моє".
ВАМ НЕ РОБОТА

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

8

Python 2 , 117 байт

def f(n):p=[x for x in range(n+1)if`x`==`x`[::-1]];print[filter(None,[a,b,n-a-b])for a in p for b in p if n-a-b in p]

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

Друкує список списків, кожен з яких є рішенням. Род зберег 9 байт.


-9 байт, що переходять у функцію, замінюючи cвідніманнями та використовуючиfilter
Rod

1
@Rod Дякую! filter(Noneвдарив і мене, поки я готував вечерю, ха-ха. c → n-a-bкруто :)
Лінн

7

JavaScript (ES6), 115 ... 84 83 байт

Завжди повертає триелементний масив, де невикористані записи заповнені нулями.

f=(n,b=a=0)=>(r=[b,a%=n,n-a-b]).some(a=>a-[...a+''].reverse().join``)?f(n,b+!a++):r

Тестові справи


6

R, 126 байт 145 байт

Завдяки Джузеппе за те, що виграли 19 байт

function(n){a=paste(y<-0:n)
x=combn(c(0,y[a==Map(paste,Map(rev,strsplit(a,"")),collapse="")]),3)
unique(x[,colSums(x)==n],,2)}

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

Пояснення

R не має власного способу повернення рядків і багато рядкових операцій за замовчуванням не працюють на числах. Тому спочатку перетворюємо ряд натуральних чисел (плюс 0) в символи.

Далі виробляємо вектор 0 і всі паліндроми. Для обертання рядків потрібно розділити кожне число на символи, змінити порядок вектора і вставити їх назад, без проміжку.

Далі я хочу перевірити всі групи з трьох (ось де важливі 0), на щастя, R має вбудовану комбіновану функцію, яка повертає матрицю, кожен стовпець у комбінації.

Я застосовую colSumsфункцію до матриці і зберігаю лише ті елементи, які дорівнюють поставленій цілі.

Нарешті, оскільки є два 0, будь-який набір з двох натуральних чисел буде дублюватися, тому я використовую унікальну функцію на стовпцях.

Вихід - це матриця, де кожен стовпець - це набір позитивних, палліндромних цілих чисел, які дорівнюють цільовому значенню. Це ліниво і повертає 0, коли використовується менше 3 елементів.


1
128 байт . Хоча +1, приємно використовувати Mapдля генерування паліндром!
Джузеппе

ой, знайшли 126 байт
Джузеппе

4

Желе , 14 байт

L<4aŒḂ€Ạ
ŒṗÇÐf

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

Дуже, дуже неефективно.


Здається, занадто повільно, навіть якщо ціль - це довжина коду, для мене це не лише довжина
RosLuP

@RosLuP Тут ви не прагнете підтримувати ефективність коду, тут ви прагнете максимально скоротити код. Він повинен працювати в теорії , а не обов'язково на практиці, оскільки це виклик коду-гольфу , а не кодового гольфу з обмеженою складністю або виклику код-гольф з обмеженим часом .
Ерік Аутгольфер

4

Желе , 17 байт

RŒḂÐfṗ3R¤YS⁼³$$Ðf

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

-6 байт завдяки HyperNeutrino.

Виводить усіма способами. Однак вихід складається з деяких дублікатів.


1
Є is palindromeвбудований лол
HyperNeutrino

Крім того, якщо ви використовуєте нормальний (піднятий) діапазон, ви можете видалити останні 4 байти
HyperNeutrino


@cairdcoinheringaahing Все ще не може бити ні Деніса, ні Еріка. У будь-якому разі я збираюся розшифровувати усічену зашифровану за допомогою Дефляту стиснуту Base64 URL-адресу?
користувач202729

@ user202729 Так, не слід правильно скопіювати посилання. Код бувRŒḂÐfṗ3R¤YS⁼¥Ðf
caird coinheringaahing




3

Java (OpenJDK 8) , 185 байт

n->{for(int i=0,j=n,k;++i<=--j;)if(p(i))for(k=0;k<=j-k;k++)if(p(k)&p(j-k))return new int[]{j-k,k,i};return n;}
boolean p(int n){return(""+n).equals(""+new StringBuffer(""+n).reverse());}

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

Видаліть 1 байт з TIO, щоб отримати правильну суму, оскільки подання не містить ;лямбда.


На мій погляд, це краще, ніж усі інші рішення, розміщені дотепер
RosLuP

@RosLuP Чому це, якщо я можу запитати?
Олів'є Грегоар

Тому що нарешті дайте відповіді на введення> 500000 (якщо я добре пам’ятаю)
RosLuP

Запропонувати i++<--jзамість++i<=--j
roofcat

2

Протон , 117 байт

a=>filter(l=>all(p==p[by-1]for p:map(str,l)),(k=[[i,a-i]for i:1..a-1])+sum([[[i,q,j-q]for q:1..j-1]for i,j:k],[]))[0]

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

Виводить рішення


920 як вхід не повертає висновок за 1 хв в tio ... Я не кажу про 364757698688, але лише про 920
RosLuP

1
@RosLuP Це не має значення. Ефективність - це не важлива річ у коді-гольф. Теоретично це буде працювати для всіх розмірів введення, щоб це не мало значення; дано достатньо часу, він дасть правильний вихід на 920.
HyperNeutrino

2

Pyth ,  16 12  10 байт

ef_I#`MT./

Спробуйте тут!

Як це працює

ef_I # `MT. / ~ Повна програма.

        ./ ~ Цілі розділи.
 f ~ Фільтр зі змінною Т.
     `MT ~ Позначте кожен елемент T на поданні рядка.
    # ~ Фільтр.
  _I ~ Чи паліндром? (тобто інваріант над зворотним?)
e ~ Отримати останній елемент.


2

Аксіома, 900 байт

R(x)==>return x;p(r,a)==(n:=#(a::String);if r<0 then(a=0=>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2));if r>0 then(n=1 and a<9=>R(a+1);a=10^n-1=>R(a+2));r=0 and n=1=>1;v:=a quo 10^(n quo 2);repeat(c:=v;w:=(n rem 2>0=>v quo 10;v);repeat(c:=10*c+w rem 10;w:=w quo 10;w=0=>break);r<0=>(c<a=>R c;v:=v-1);r>0=>(c>a=>R c;v:=v+1);R(c=a=>1;0));c)
b:List INT:=[];o:INT:=0
f(a:NNI):List INT==(free b,o;o:=p(-1,o);w:=0;c:=#b;if c>0 then w:=b.1;e:=a-o;e>10000000=>R[];if w<e then repeat(w:=p(1,w);w>e=>break;b:=cons(w,b));g:List INT:=[];for i in #b..1 by-1 repeat(b.i>e=>break;g:=cons(b.i,g));if o>e then g:=cons(o,g);n:=#g;for i in 1..n repeat(x:=g.i;x=a=>R[x];3*x<a=>break;for j in i..n repeat(y:=g.j;t:=x+y;t>a=>iterate;t=a=>R[x,y];t+y<a=>break;for k in j..n repeat(z:=t+g.k;z=a=>R[x,y,g.k];z<a=>break)));[])
D(a:NNI):List INT==(free o;p(0,a)=1=>[a];o:=a;for j in 1..10 repeat(t:=f(a);#t>0=>R t);[])

код тесту

--Lista random di n elmenti, casuali compresi tra "a" e "b"
randList(n:PI,a:INT,b:INT):List INT==
    r:List INT:=[]
    a>b =>r
    d:=1+b-a
    for i in 1..n repeat
          r:=concat(r,a+random(d)$INT)
    r

test()==
   a:=randList(20,1,12345678901234)
   [[i,D(i)] for i in a]

Якщо цей код повинен розкласти число X на 1,2,3 паліндром, що робить цей код, спробуйте поруч з паліндром N <X і розкласти XN на 2 паліндром; якщо це розкладання XN має успіх, поверніть 3 паліндром; якщо він не вдається, спробуйте попередній паліндром G <N <X і спробуйте розкласти XG на 2 паліндром і т. д. Код Ungolf (але можлива помилка)

 R(x)==>return x

-- se 'r'=0 ritorna 1 se 'a' e' palindrome altrimenti ritorna 0
-- se 'r'>0 ritorna la prossima palindrome >'a'
-- se 'r'<0 ritorna la prossima palindrome <'a'
p(r,a)==(n:=#(a::String);if r<0 then(a=0=>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2));if r>0 then(n=1 and a<9=>R(a+1);a=10^n-1=>R(a+2));r=0 and n=1=>1;v:=a quo 10^(n quo 2);repeat(c:=v;w:=(n rem 2>0=>v quo 10;v);repeat(c:=10*c+w rem 10;w:=w quo 10;w=0=>break);r<0=>(c<a=>R c;v:=v-1);r>0=>(c>a=>R c;v:=v+1);R(c=a=>1;0));c)

b:List INT:=[]   -- the list of palindrome
o:INT:=0         -- the start value for search the first is a

--Decompose 'a' in 1 or 2 or 3 palindrome beginning with prev palindrome of o
--if error or fail return []
f(a:NNI):List INT==
    free b,o
    -- aggiustamento di o, come palindrome piu' piccola di o
    o:=p(-1,o)
    -- aggiustamento di b come l'insieme delle palindromi tra 1..a-o compresa
    w:=0;c:=#b
    if c>0 then w:=b.1 --in w la massima palindrome presente in b
    e:=a-o
    output["e=",e,"w=",w,"o=",o,"#b=",#b]
    e>10000000=>R[]   --impongo che la palindrome massima e' 10000000-1
    if w<e then       --se w<a-o aggiungere a b tutte le palindromi tra w+1..a-o
          repeat(w:=p(1,w);w>e=>break;b:=cons(w,b))
                      -- g e' l'insieme dei b palindromi tra 1..a-o,o
    g:List INT:=[];for i in #b..1 by-1 repeat(b.i>e=>break;g:=cons(b.i,g))
    if o>e then g:=cons(o,g)
    --output["g=",g,b]
    n:=#g
    for i in 1..n repeat
        x:=g.i
        x=a  =>R[x]
        3*x<a=>break
        for j in i..n repeat
           y:=g.j;t:=x+y
           t>a   =>iterate
           t=a   =>R[x,y]
           t+y<a =>break
           for k in j..n repeat
                z:=t+g.k
                z=a =>R[x,y,g.k]
                z<a =>break
    []

--Decompose 'a' in 1 or 2 or 3 palindrome
--if error or fail return []
dPal(a:NNI):List INT==
   free o
   p(0,a)=1=>[a]
   o:=a                  -- at start it is o=a
   for j in 1..10 repeat -- try 10 start values only
        t:=f(a)
        #t>0=>R t
   []

результати:

(7) -> [[i,D(i)] for i in [5,15,21,42,132,345,1022,9265] ]
   (7)
   [[5,[5]], [15,[11,4]], [21,[11,9,1]], [42,[33,9]], [132,[131,1]],
    [345,[343,2]], [1022,[999,22,1]], [9265,[9229,33,3]]]
                                                      Type: List List Any
                                   Time: 0.02 (IN) + 0.02 (OT) = 0.03 sec
(8) -> test()
   (8)
   [[7497277417019,[7497276727947,624426,64646]],
    [11535896626131,[11535888853511,7738377,34243]],
    [2001104243257,[2001104011002,184481,47774]],
    [3218562606454,[3218561658123,927729,20602]],
    [6849377785598,[6849377739486,45254,858]],
    [375391595873,[375391193573,324423,77877]],
    [5358975936064,[5358975798535,136631,898]],
    [7167932760123,[7167932397617,324423,38083]],
    [11779002607051,[11779000097711,2420242,89098]],
    [320101573620,[320101101023,472274,323]],
    [5022244189542,[5022242422205,1766671,666]],
    [5182865851215,[5182864682815,1158511,9889]],
    [346627181013,[346626626643,485584,68786]],
    [9697093443342,[9697092907969,443344,92029]],
    [1885502599457,[1885502055881,542245,1331]], [10995589034484,[]],
    [1089930852241,[1089930399801,375573,76867]],
    [7614518487477,[7614518154167,246642,86668]],
    [11859876865045,[11859866895811,9968699,535]],
    [2309879870924,[2309879789032,81418,474]]]
                                                      Type: List List Any
      Time: 0.25 (IN) + 115.17 (EV) + 0.13 (OT) + 28.83 (GC) = 144.38 sec

1

Java (OpenJDK 8) , 605 байт

Друкує мальви, але їх не заборонено

a->{int i=0,j,k,r[]=new int[a-1];for(;i<a-1;r[i]=++i);for(i=0;i<a-1;i++){if(r[i]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse()))System.out.println(r[i]);for(j=0;j<a-1;j++){if(r[i]+r[j]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse())&(""+r[j]).equals(""+new StringBuffer(""+r[j]).reverse()))System.out.println(r[i]+" "+r[j]);for(k=0;k<a-1;k++)if(r[i]+r[j]+r[k]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse())&(""+r[j]).equals(""+new StringBuffer(""+r[j]).reverse())&(""+r[k]).equals(""+new StringBuffer(""+r[k]).reverse()))System.out.println(r[i]+" "+r[j]+" "+r[k]);}}}

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




1

Perl 6 , 51 байт

{first *.sum==$_,[X] 3 Rxx grep {$_ eq.flip},1..$_}

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

  • grep { $_ eq .flip }, 1 .. $_ створює список усіх паліндромних чисел від 1 до вхідного числа.
  • 3 Rxx повторює цей список тричі.
  • [X]зменшує цей список списків за допомогою оператора крос-продукту X, в результаті чого виходить список усіх 3-масел чисел паліндромінку з 1 до вхідного номера.
  • first *.sum == $_ знаходить перший такий 3-кортеж, який підсумовує вхідне число.

Ви можете зберегти байт , не повертаючи його назад xx 3.
Джо Кінг

1

Python 3 , 106 байт

lambda n:[(a,b,n-a-b)for a in range(n)for b in range(n)if all(f'{x}'==f'{x}'[::-1]for x in(a,b,n-a-b))][0]

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

У посиланні TIO я використовував більш швидку (але на 1 байт довшу версію), яка приймає перший дійсний результат як генератор, а не будує весь список можливих комбінацій та приймає першу.



0

Додайте ++ , 62 байти

D,g,@,BDdbR=
D,l,@@,$b+=
D,k,@@*,
L,RÞgdVBcB]Gd‽kdG‽k€bF++A$Þl

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

~ 50 байт у гольф під час написання пояснення. Визначає лямбда-функцію, яка повертає список списків, що містять рішення.

Як це працює

1,231нн

1,2,...,нgRÞggА

Наступний розділ можна розділити на три наступні частини:

BcB]
Gd‽k
dG‽k€bF

А[1 2 3 4 ...][[1] [2] [3] [4] ... ]Аk

D,k,@@*,

Ця функція в основному нічого не робить. Він отримує два аргументи і обертає їх у масив. Однак стіл швидкий, тут є чарівна хитрість. Він бере два списки і генерує кожну пару елементів між цими двома списками. Так [1 2 3]і [4 5 6]породжує [[1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6]]. Потім він приймає свій функціональний аргумент (в даному випадку k) і виконує цю функцію над кожною парою, яка в цьому випадку просто повертає пари як є.

А і запускає функцію таблиці над двома масивами. Це майже генерує список потрібних нам потрій, але прикро кожній трійці є вкладена пара. Щоб видалити це, ми €bFпереходимо до списку, який розгладжує кожен підпис. Нарешті, ми об'єднуємо три списки, щоб сформувати список усіх необхідних списків.

1,23нlн

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