Нове замовлення №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=an1q if an1q{0,a1,...,an1}an=pan1 otherwise

Він довів, що для будь-якого p,q>1 такого, що logp(q) є нераціональним, послідовність є перестановкою натуральних чисел. Оскільки існує нескінченна кількість значень p і q для яких це правда, це справді цілий світ перестановок натуральних чисел. Ми будемо дотримуватися оригіналу (p,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(n1)2 if a(n1)2{0,a1,...,a(n1)}a(n)=3a(n1) otherwise

Примітка: тут передбачається індексація на основі 1; Ви можете використовувати індексацію 0 на основі, так ( 0 ) = 1 ; a ( 1 ) = 3 і т. д. Будь ласка, зазначте це у своїй відповіді, якщо ви вирішили скористатися цим.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
Я видалив програму, але я мав би змогу її відтворити. Я опублікую це як неконкурентоспроможний, як тільки перероблю його.
Тау

@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 bytes

Saved 1 byte thanks to @EmbodimentofIgnorance
Saved 1 byte thanks to @tsh

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

Try it online!



@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 байт завдяки Kevin Cruijssen .
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-індексований, змінивши початкові елементи на, 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*{:@])])^:[~]

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

неозорий

[: {: 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




2

C ++ (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і замінити i на -1. Це повинно стригти одного з двох символів.
agtoever

@agtoever, що так розумно - дякую! :)
Noodle9

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

@ArBo вау! абсолютно геніально - дякую :)
Noodle9

1

Гая , 22 20 байт

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

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

Індекс на основі 0.

Кредит Shaggy для підходу

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.