Можете ли вы достичь этого числа путем удвоения и перестановки?


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. включительно. Первый столбец - это число (ваш ввод), второй столбец - это оптимальное количество шагов (которое вы можете использовать для проверки правильности вашего решения), а третий столбец является одной оптимальной последовательностью, чтобы добраться туда:

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 Хороший вопрос. Я думаю, что должно быть доказательство того, что ввода всегда достаточно, но я сейчас его отредактирую.
Исаак

@ MartinBüttner Доказательство того, что итерации, равные вводу, всегда достаточно добавлено.
Исаак

Ах, очень мило. :) (Интересно, что даже до 100 000 вам не нужно больше 26 шагов.)
Мартин Эндер

Я полагаю, что было бы быстрее перечислить все шаги не длиннее ввода?
Джон Дворак

7

SWI-Пролог, 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. Если у вас есть время -> удачи ;-)

редактировать: ungolfed версия:

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.