Новый заказ № 4: Мир


17

Введение (может быть проигнорировано)

Размещать все положительные числа в обычном порядке (1, 2, 3, ...) немного скучно, не правда ли? Итак, вот ряд проблем, связанных с перестановками (перестановками) всех положительных чисел. Это четвертая задача в этой серии (ссылки на первую , вторую и третью задачу).

В этой задаче мы исследуем не одну перестановку натуральных чисел, а целый мир перестановок!

В 2000 году Кларк Кимберлинг поставил проблему в 26- м выпуске Crux Mathematicorum , научном журнале по математике, опубликованном Канадским математическим обществом. Проблема была:

Sequence a={a1=1an=an12 if an12{0,a1,...,an1}an=3an1 otherwise

Каждое положительное целое число встречается ровно один раз в этой последовательности?

В 2004 году Матеуш Квасницкий представил положительные доказательства в том же журнале, а в 2008 году он опубликовал более формальное и (по сравнению с первоначальным вопросом) более общее доказательство. Он сформулировал последовательность с параметрами p и Q :

{a1знак равно1aNзнак равноaN-1Q если aN-1Q{0,a1,,,,,aN-1}aNзнак равнопaN-1 в противном случае

Он доказал, что для любого п,Q>1 такого, что Lограммп(Q) иррационально, последовательность является перестановкой натуральных чисел. Поскольку существует бесконечное число значений п и Q для которых это верно, это действительно целый мир перестановок натуральных чисел. Мы будем придерживаться оригинала (п,Q)знак равно(3,2) , и для этих параметров, последовательность может быть найдена как A050000в ОЕИС. Его первые 20 элементов:

1, 3, 9, 4, 2, 6, 18, 54, 27, 13, 39, 19, 57, 28, 14, 7, 21, 10, 5, 15

Поскольку это задача «чистой последовательности», задача состоит в том, чтобы вывести a(N) для заданного N качестве входных данных, где a(N) равно A050000 .

задача

Учитывая целочисленный ввод N , выведите a(N) в целочисленном формате, где:

{a(1)знак равно1a(N)знак равноa(N-1)2 если a(N-1)2{0,a1,,,,,a(N-1)}a(N)знак равно3a(N-1) в противном случае

Примечание: здесь предполагается индексирование на основе 1; Вы можете использовать индексирование на основе 0, поэтому a(0)знак равно1;a(1)знак равно3 и т. д. Пожалуйста, укажите это в своем ответе, если вы решите использовать это.

Контрольные примеры

Input | Output
---------------
1     |  1
5     |  2
20    |  15
50    |  165
78    |  207
123   |  94
1234  |  3537
3000  |  2245
9999  |  4065
29890 |  149853

правила

  • Вход и выход являются целыми числами (ваша программа должна по крайней мере поддерживать вход и выход в диапазоне от 1 до 32767)
  • Неверный ввод (0, число с плавающей запятой, строки, отрицательные значения и т. Д.) Может привести к непредсказуемому выводу, ошибкам или (не) определенному поведению.
  • Применяются правила ввода / вывода по умолчанию .
  • Лазейки по умолчанию запрещены.
  • Это , поэтому самые короткие ответы в байтах выигрывают

Я бы ответил на это, используя TI-BASIC, но ввод будет ограничен поскольку списки ограничены 999 элементами. Тем не менее, это большой вызов! 0<N<1000
Тау

@Tau: хотя и вне спецификации (и это неконкурентоспособно), мне было бы интересно ваше решение. У вас есть тот, который вы можете опубликовать?
agtoever

1
Я удалил программу, но я должен быть в состоянии воссоздать ее. Я отправлю это как не конкурирующее, как только я переделал это.
Tau

@agtoever, «неконкурентный» не распространяется на недействительные решения; это было для решений, использующих языки или языковые функции, которые были созданы после публикации заявки.
Лохматый

Мета PP & CG действительно очень ясно об этом. Я не был награжден такой строгой интерпретацией "неконкурентных" ... @Tau: кажется, что вы не можете опубликовать свое решение TI-BASIC в соответствии с этими правилами. Сожалею.
agtoever

Ответы:


3

Japt , 15 14 байтов

1-индексироваться.

@[X*3Xz]kZ Ì}g

Попытайся

@[X*3Xz]kZ Ì}g     :Implicit input of integer U
             g     :Starting with the array [0,1] do the following U times, pushing the result to the array each time
@                  :  Pass the last element X in the array Z through the following function
 [                 :    Build an array containing
  X*3              :      X multiplied by 3
     Xz            :      X floor divided by 2
       ]           :    Close array
        kZ         :    Remove all elements contained in Z
           Ì       :    Get the last element
            }      :  End function
                   :Implicit output of the last element in the array

7

JavaScript (ES6),  55 51  50 байт

Сохранено 1 байт благодаря @EmbodimentofIgnorance
Сохранено 1 байт благодаря @tsh

n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")

Попробуйте онлайн!



@EmbodimentofIgnorance Я обычно избегаю этого трюка, так как eval'ed код гораздо медленнее. Но разница для этого едва заметна, так что, думаю, все в порядке.
Арно

2
Но это код-гольф, нас не волнует скорость, пока она выполняет свою работу
Воплощение невежества,

n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")
TSH

5

Желе , 15 байт

µ×3żHḞḢḟȯ1Ṫ;µ¡Ḣ

Полная программа, принимающая целое число n(на основе 1) из STDIN, которое печатает результат.

Попробуйте онлайн!

Как?

µ×3żHḞḢḟȯ1Ṫ;µ¡Ḣ - Main Link: no arguments (implicit left argument = 0)
µ           µ¡  - repeat this monadic chain STDIN times (starting with x=0)
                -                   e.g. x = ...  0      [1,0]            [9,3,1,0]
 ×3             -   multiply by 3                 0      [3,0]            [27,9,3,0]
    H           -   halve                         0      [1.5,0]          [4.5,1.5,0.5,0]
   ż            -   zip together                  [0,0]  [[3,1.5],[0,0]]  [[27,4.5],[9,1.5],[3,0.5],[0,0]]
     Ḟ          -   floor                         [0,0]  [[3,1],[0,0]]    [[27,4],[9,1],[3,0],[0,0]]
      Ḣ         -   head                          0      [3,1]            [27,4]
       ḟ        -   filter discard if in x        []     [3]              [27,4]
        ȯ1      -   logical OR with 1             1      [3]              [27,4]
          Ṫ     -   tail                          1      3                4
           ;    -   concatenate with x            [1,0]  [3,1,0]          [4,9,3,1,0]
              Ḣ - head                            1      3                4
                - implicit print

4

05AB1E , 16 15 байт

Сохранено 1 байт благодаря Кевину Круйссену .
0 индексированные.

¾ˆ$FDˆx3*‚;ï¯Kн

Попробуйте онлайн!

объяснение

Используя в n=1качестве примера

¾ˆ                 # initialize global array as [0]
  $                # initialize stack with 1, input
   F               # input times do:
    Dˆ             # duplicate current item (initially 1) and add one copy to global array
                   # STACK: 1, GLOBAL_ARRAY: [0, 1]
      x            # push Top_of_stack*2
                   # STACK: 1, 2, GLOBAL_ARRAY: [0, 1]
       3*          # multiply by 3
                   # STACK: 1, 6, GLOBAL_ARRAY: [0, 1]
         ‚;ï       # pair and integer divide both by 2
                   # STACK: [0, 3], GLOBAL_ARRAY: [0, 1]
            ¯K     # remove any numbers already in the global array
                   # STACK: [3], GLOBAL_ARRAY: [0, 1]
              н    # and take the head
                   # STACK: 3


@KevinCruijssen: Спасибо! Я думал об использовании глобального массива, но предполагал, что он будет такой же длины, что и список в стеке, и никогда не пробовал: /
Emigna

4

Perl 6 , 49 байт

-2 байта благодаря nwellnof

{(1,3,{(3*@_[*-1]Xdiv 6,1).max(*∉@_)}...*)[$_]}

Попробуйте онлайн!

Возвращает 0-индексированный элемент в последовательности. Вы можете изменить это на 1-indexed, изменив начальные элементы на 0,1вместо1,3

Объяснение:

{                                             }  # Anonymous code block
 (                                   ...*)[$_]   # Index into the infinite sequence
  1,3                                            # That starts with 1,3
     ,{                             }            # And each element is
       (                 ).max(    )             # The first of
          @_[*-1]X                               # The previous element
        3*        div 6                          # Halved and floored
        3*        div  ,1                        # Or tripled
                               *∉@_             # That hasn't appeared in the sequence yet

3

J , 47 40 байт

[:{:0 1(],<.@-:@{:@](e.{[,3*{:@])])^:[~]

Попробуйте онлайн!

ungolfed

[: {: 0 1 (] , <.@-:@{:@] (e. { [ , 3 * {:@]) ])^:[~ ]

Прямой перевод определения в J. Он строится снизу вверх, используя ^:для итерации от начального значения требуемое количество раз.


3

Java 10, 120 99 байт

n->{var L=" 1 0 ";int r=1,t;for(;n-->0;L+=r+" ")if(L.contains(" "+(r=(t=r)/2)+" "))r=t*3;return r;}

Попробуйте онлайн.

Объяснение:

n->{                              // Method with integer as both parameter and return-type
  var L=" 1 0 ";                  //  Create a String that acts as 'List', starting at [1,0]
  int r=1,                        //  Result-integer, starting at 1
      t;                          //  Temp-integer, uninitialized
  for(;n-->0;                     //  Loop the input amount of times:
      L+=r+" "))                  //    After every iteration: add the result to the 'List'
                          t=r     //   Create a copy of the result in `t`
                       r=(...)/2  //   Then integer-divide the result by 2
    if(L.contains(" "+(...)+" ")) //   If the 'List' contains this result//2:
      r=t*3;                      //    Set the result to `t` multiplied by 3 instead
  return r;}                      //  Return the result

3

Haskell , 67 65 байт

(h[1,0]!!)
h l@(a:o)|elem(div a 2)o=a:h(3*a:l)|1>0=a:h(div a 2:l)

Попробуйте онлайн!

Использует индексирование на основе 0.

РЕДАКТИРОВАТЬ: сохранить 2 байта, используя elemвместо notElemи условия переключения




2

С ++ (gcc) , 189 180 байт

-9 байт для малого гольфа

#import<vector>
#import<algorithm>
int a(int n){std::vector<int>s={1};for(int i=0;i<n;++i)s.push_back(i&&std::find(s.begin(),s.end(),s[i]/2)==s.end()?s[i]/2:3*s[i]);return s[n-1];}

Попробуйте онлайн!

Вычисляет последовательность до n, затем возвращает нужный элемент. Медленно для больших индексов.


@ceilingcat К сожалению, это влияет на приоритет оператора и изменяет вывод функции.
Нил А.

2

Python 2 , 66 байт

l=lambda n,p=1,s=[0]:p*(n<len(s))or l(n,3*p*(p/2in s)or p/2,[p]+s)

Попробуйте онлайн!

Используется индексирование с нуля. Лямбда делает только рекурсивное построение последовательности и возвращает ее, как только будет достигнут требуемый индекс.





1

Python 3 , 105 103 100 95 83 байта

-2 байта благодаря agtoever
-12 байтов благодаря ArBo

def f(n):
 s=0,1
 while len(s)<=n:t=s[-1]//2;s+=(t in s)*3*s[-1]or t,
 return s[-1]

Попробуйте онлайн!


Вы можете заменить цикл for while len(s)<=nи заменить его на -1. Это должно сбрить одного из двух персонажей.
agtoever

@ Во всяком случае, это так умно - спасибо! :)
Noodle9

83 байта , работая с кортежем вместо списка, и удаляя ifиз whileцикла цикл, чтобы разрешить
однолинейный

@ Арбо вау! абсолютно блестяще - спасибо :)
Noodle9

1

Гайя , 22 20 байт

2…@⟨:):3פḥ⌋,;D)+⟩ₓ)

Попробуйте онлайн!

Индекс на основе 0

Кредит Шегги за подход

2…			| push [0 1]
  @⟨		 ⟩ₓ	| do the following n times:
    :):			| dup the list L, take the last element e, and dup that
       3פḥ⌋,		| push [3*e floor(e/2)]
	     ;D		| take the asymmetric set difference [3*e floor(e/2)] - L
	       )+	| take the last element of the difference and add it to the end of L (end of loop)
		   )	| finally, take the last element and output it

;D



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.