Чи можете ви досягти цього числа шляхом подвоєння та перестановки?


34

Натхненний цим питанням на Math.SE .

Починаючи з 1вас, ви можете неодноразово виконувати одну з наступних двох операцій:

  • Подвійне число.

    або

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

Беручи приклад із пов’язаної публікації на Math.SE, ми можемо досягти 1000наступних кроків:

1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 125, 250, 500, 1000

Яких цифр ви можете досягти за допомогою цього процесу і яке найкоротше рішення?

Змагання

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

Послідовність може бути у будь-якому зручному, однозначному форматі рядка чи списку.

Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out).

Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.

Випробування

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

1       1       {1}
2       2       {1,2}
4       3       {1,2,4}
8       4       {1,2,4,8}
16      5       {1,2,4,8,16}
23      7       {1,2,4,8,16,32,23}
29      10      {1,2,4,8,16,32,23,46,92,29}
32      6       {1,2,4,8,16,32}
46      8       {1,2,4,8,16,32,23,46}
58      11      {1,2,4,8,16,32,23,46,92,29,58}
61      6       {1,2,4,8,16,61}
64      7       {1,2,4,8,16,32,64}
85      12      {1,2,4,8,16,32,23,46,92,29,58,85}
92      9       {1,2,4,8,16,32,23,46,92}
104     15      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104}
106     14      {1,2,4,8,16,32,64,128,256,265,530,305,610,106}
107     14      {1,2,4,8,16,32,23,46,92,29,58,85,170,107}
109     18      {1,2,4,8,16,32,23,46,92,184,368,386,772,277,554,455,910,109}
116     12      {1,2,4,8,16,32,23,46,92,29,58,116}
122     7       {1,2,4,8,16,61,122}
124     16      {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,124}
125     11      {1,2,4,8,16,32,64,128,256,512,125}
128     8       {1,2,4,8,16,32,64,128}
136     18      {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,136}
140     15      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,140}
142     16      {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,142}
145     17      {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,145}
146     18      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,146}
148     11      {1,2,4,8,16,32,23,46,92,184,148}
149     16      {1,2,4,8,16,32,64,128,182,364,728,287,574,457,914,149}
152     11      {1,2,4,8,16,32,64,128,256,512,152}
154     17      {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154}
158     16      {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158}
160     14      {1,2,4,8,16,32,64,128,256,265,530,305,610,160}
161     13      {1,2,4,8,16,32,23,46,92,29,58,116,161}
163     18      {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,163}
164     18      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,164}
166     20      {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166}
167     17      {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,167}
169     23      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229,458,916,169}
170     13      {1,2,4,8,16,32,23,46,92,29,58,85,170}
176     17      {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176}
182     9       {1,2,4,8,16,32,64,128,182}
184     10      {1,2,4,8,16,32,23,46,92,184}
185     16      {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,185}
188     23      {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,185,370,740,470,940,409,818,188}
190     18      {1,2,4,8,16,32,23,46,92,184,368,386,772,277,554,455,910,190}
194     16      {1,2,4,8,16,32,64,128,182,364,728,287,574,457,914,194}
196     23      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229,458,916,196}
203     16      {1,2,4,8,16,32,64,128,256,265,530,305,610,160,320,203}
205     13      {1,2,4,8,16,32,64,128,256,512,125,250,205}
208     16      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208}
209     19      {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,145,290,209}
212     8       {1,2,4,8,16,61,122,212}
214     15      {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214}
215     11      {1,2,4,8,16,32,64,128,256,512,215}
218     9       {1,2,4,8,16,32,64,128,218}
221     8       {1,2,4,8,16,61,122,221}
223     14      {1,2,4,8,16,32,23,46,92,29,58,116,232,223}
227     20      {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,361,722,227}
229     20      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229}
230     16      {1,2,4,8,16,32,64,128,256,265,530,305,610,160,320,230}
232     13      {1,2,4,8,16,32,23,46,92,29,58,116,232}
233     22      {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166,332,233}
235     19      {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176,352,235}
236     19      {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,632,236}
238     19      {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,832,238}
239     25      {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166,332,233,466,932,239}
241     16      {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,241}
244     8       {1,2,4,8,16,61,122,244}
247     21      {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,632,362,724,247}
248     17      {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,124,248}
250     12      {1,2,4,8,16,32,64,128,256,512,125,250}
251     11      {1,2,4,8,16,32,64,128,256,512,251}
253     19      {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176,352,253}
256     9       {1,2,4,8,16,32,64,128,256}

Якщо ви хочете ще більше тестових даних, тут є та сама таблиця, що включає 1000 .

Будь-яке число, яке не відображається в цих таблицях, повинно дати порожній список (за умови, що число знаходиться в діапазоні таблиці).


Чи є межі часу виконання?
Фаталізувати

2
@ Фаталізувати ні, сходити з розуму.
Мартін Ендер

Я думаю, що потенційно нескінченний час виконання неприйнятний? Це має теоретично припинити?
Фаталізувати

@ Фаталізуй Ага так, як завжди .
Мартін Ендер

А як щодо того, коли результатів більше ніж: [1, 2, 4, 8, 16, 32, 64, 46, 92, 29] [1, 2, 4, 8, 16, 32, 23, 46, 92, 29]
dbramwell

Відповіді:


18

Pyth, 43 байти

?}QKhu?Jf}QTGJsm+Ld+yedsMfnhT\0.p`edGQ]]1KY

Демонстрація.

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

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


Цього гарантовано вистачить ітерацій. По-перше, ми знаємо, що цих багатьох ітерацій достатньо для всіх n <= 1000, завдяки прикладним результатам. Для більшої кількості має місце такий аргумент:

По-перше, кожен етап процесу повинен або підтримувати, або збільшувати кількість цифр.

По-друге, три числа, які є всіма перестановками один одного, ніколи не можуть з’являтися в найкоротшій послідовності, тому що було б швидше просто зробити одну перестановку з першого на останнє.

По-третє, всі кратні 3 є недосяжними, оскільки ні подвоєння, ні перестановка не можуть призвести до кратного 3 з не кратного 3.

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

Кількість таких наборів цифр для кожної кількості цифр:

4 - 474
5 - 1332
6 - 3330

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

4: 474 * 2 + 26 = 974
5: 974 * 2 + 1332 = 3638
6: 3330 * 2 + 3638 = 10298

У кожному випадку верхня межа нижча за будь-яке число з кількістю цифр

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

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


Ви впевнені, що достатньо кількості повторень, рівних вхідному? Теоретично не буде верхня межа навколо наступної більшої потужності 10 (оскільки послідовність може знижуватися довільно часто).
Мартін Ендер

@ MartinBüttner Добре. Я думаю, має бути доказ того, що введення завжди достатньо, але я зараз його відредагую.
isaacg

@ MartinBüttner Доведення, що ітерацій, рівних вхідному, завжди додається.
isaacg

Ах, дуже приємно. :) (Цікаво, що навіть до 100 000 вам не потрібно більше 26 кроків.)
Мартін Ендер

Я вважаю, що було б швидше перерахувати всі кроки не довше введення?
Джон Дворак

7

SWI-Prolog, 252 байти

a(N,Z):-findall(X,b(N,[1],X),R),sort(R,[Z|_]);Z=[].
b(N,[A|T],Z):-n(A,C),n(N,M),length(C,L),length(M,O),L=<O,((A=N,reverse([A|T],Z));(A\=N,(B is A*2;permutation(C,D),\+ nth0(0,D,48),n(B,D),\+member(B,[A|T])),b(N,[B,A|T],Z))).
n(A,B):-number_codes(A,B).

Приклад: a(92,Z).виходиZ = [1, 2, 4, 8, 16, 32, 64, 46, 92]

Я ще не перевіряв, чи працює це для N> 99 через час, який потрібен, але я не бачу причини, щоб це не працювало.


2

Юлія, 306 245 218 байт

Все ще працюю над цим гольфу. Коли я закінчу, надамо версію, що не має волі

s->(M=s=[s];while 1∉s C=0;for i=1:size(s,1) p=2;for j=permutations(dec(s[i])) j[1]>48&&j[end]%2<1&&(l=int(j);l=l÷p;l∉M&&(M=[M,l];S=[l s[i,:]];C==0?C=S:C=[C;S]));p=1end;end;C==0&&return [];s=C;end;sortrows(s)[1,:])

1

Haskell, 246 байт

Я не зовсім впевнений, що це спрацьовує, але це означає, що послідовність, яка спочатку розходиться нижче (як слід відсортувати нижче), завжди коротша, як, наприклад,

[1,2,4,8,16,32,64,128,256,512,125,250,500,1000]

коротше, ніж

[1,2,4,8,16,32,64,128,256,512,251,502,250,500,1000]

Я перевірив, що це правда до 1000.

import Data.List
h l|mod(e l)2==0=l:h(div(e l)2:l)|0<1=[l]
s l=map((:l).read)(filter((/='0').e)(permutations$show$e l))
e=head
m=map e
n f=m.groupBy(\a b->e a==e b).sort.concatMap f
w l|e(e l)==1=[nub$e l]|m x/=m l=w x|0<1=[[]] where x=n h(n s l)

1

C # 655 байт

List<int> C(int i,List<int> x,int a){x.Add(a);if(a==i)return x;List<int> o=null;string s=a.ToString(),m=i.ToString();var res=G(s,s.Length);foreach (var r in res)if (r.First()!='0'){var l=int.Parse(new String(r.ToArray()));if(!x.Contains(l)&&l.ToString().Length<=m.Length){var n=C(i,x.ToList(),l);if(n!=null&&(o==null||o.Count()>n.Count()))o=n;}}if ((a*2).ToString().Length>m.Length)return o;var p = C(i, x.ToList(), a * 2);if (p!=null&&(o==null||o.Count()>p.Count()))o=p;return o;}IEnumerable<IEnumerable<T>> G<T>(IEnumerable<T> l,int i){return i==1?l.Select(t =>new T[]{t}):G(l,i-1).SelectMany(t=>l.Where(e=>!t.Contains(e)),(a,b)=>a.Concat(new T[]{b}));}

Телефонуйте за допомогою (LinqPad):

var i = 64;
C(i,new List<int>(),1).Dump();

Не перевірені цифри вище 99. Якщо у вас є час -> удачі ;-)

редагувати: neololfed версія:

List<int> C(int i, List<int> x, int toAdd, bool removeLast)
{
    x.Add(toAdd);

    if ( toAdd == i )
    {
        return x;
    }
    else
    {
        List<int> shortest = null;
        if ( toAdd > 9 )
        {
            var res = G(toAdd.ToString(), toAdd.ToString().Length);

            foreach ( var r in res )
            {
                if ( r.First () != '0' )
                {
                    var resi = int.Parse(new String(r.ToArray()));

                    if ( !x.Contains(resi) && resi.ToString().Length <= i.ToString().Length )
                    {
                        var resPerm = C(i, x.ToList(), resi, false);
                        if ( resPerm != null )
                        {
                            if ( shortest == null || shortest.Count() > resPerm.Count() )
                            {
                                shortest = resPerm;
                            }
                        }
                    }
                }
            }
        }
        if ( (toAdd * 2).ToString().Length > i.ToString().Length )
        {
            return shortest;
        }
        var resDouble = C(i, x.ToList(), toAdd * 2, false);
        if ( resDouble != null )
        {
            if ( shortest == null || shortest.Count() > resDouble.Count() )
            {
                shortest = resDouble;
            }
            return shortest;
        }

        return shortest;
    }
}
IEnumerable<IEnumerable<T>> G<T>(IEnumerable<T> l,int i)
{
    return i==1?l.Select(t => new T[]{t}):G(l,i-1).SelectMany(t=>l.Where(e=>!t.Contains(e)),(a,b)=>a.Concat(new T[]{b}));
}

0

CJam, 83

ri:N_1a:Xa:Y;{X,{XI=__se!{c~},:i^\2*|NA*,&X-_YI=f+Y\+:Y;X\+:X;}fI}*X#_){Y=W%}{;L}?p

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

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

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