Роздрукуйте номери Super Collatz


22

Коллатц послідовність (також звана проблемою 3x + 1), де ви починаєте з будь-яким позитивним цілим числом, для цього прикладу ми будемо використовувати 10, і застосувати цей набір кроків до нього:

if n is even:
    Divide it by 2
if n is odd:
    Multiply it by 3 and add 1
repeat until n = 1

10 є парним, тому ділимо на 2, щоб отримати 5. 5 непарно, тому множимо на 3 і додаємо 1, щоб отримати 16. 16 парне, тому розрізаємо його навпіл, щоб отримати 8. Половина 8 - це 4, половина 4 - це 2, а половина 2 - 1. Оскільки для цього нам потрібно було 6 кроків, ми говоримо, що 10 має зупинку 6.

Номер Super Collatz - це число, відстань зупинки якого більше, ніж відстань зупинки кожного числа, менша за нього. Наприклад, 6 - номер Super Collatz, оскільки 6 має відстань зупинки 8, 5 має відстань зупинки 5, 4 має 2, 3 має 7, 2 має 1 і 1 має 0. ( A006877 в OEIS) Потрібно візьміть число n як вхід і виведіть всі номери Super Collatz до n .

Правила

  • Повна програма або функція є прийнятною.

  • Ви не можете попередньо обчислити або жорстко зафіксувати послідовність Super Collatz.

  • Ви можете взяти інформацію в будь-якому розумному форматі.

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

  • Неправильні введення (не числа, десяткові знаки, від’ємні числа тощо) призводять до невизначеної поведінки.

Зразок безгольового пітона

def collatzDist(n):
    if n == 1:
        return 0
    if n % 2 == 0:
        return 1 + collatzDist(n / 2)
    return 1 + collatzDist((n * 3) + 1)

n = input()

max = -1
superCollatz = []
for i in range(1, n + 1):
    dist = collatzDist(i)
    if dist > max:
        superCollatz.append(i)
        max = dist 

print superCollatz

Зразок IO:

#in       #out
 4     --> 1, 2, 3
 50    --> 1, 2, 3, 6, 7, 9, 18, 25, 27
 0     --> invalid
 10000 --> 1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171

Також ось перші 44 номери Super Collatz:

1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239, 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935, 626331, 837799

6
Крім того, якщо хтось зможе знайти номер із зупинкою нескінченності (ніколи не досягає 1), я дам їм найбільший виграш, який я можу запропонувати. = D
DJMcMayhem

1
Так буде багато математиків ...: P
Rɪᴋᴇʀ


5
Це лише здогадки, але я підозрюю, що правило 2 - це математичний факт, а не просто обмеження виклику.
трихоплакс

1
"Ви повинні взяти число n як вхід і вивести всі номери Super Collatz до n". Отже, якщо я це правильно зрозумів, ви НЕ просите вводити перший n номер супер колацу? Тому що це, наприклад, відповідь Pyth, тому я думаю, що це недостатньо зрозуміло.
Фаталізувати

Відповіді:


1

Pyth, 23 байти

q#eol.u@,/N2h*N3NN)STSQ

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

Це працює, приймаючи максимум діапазону до кожного числа за зупинкою відстані Колатца і перевіряючи, чи є цей макс відповідним числом.


2

Python 2, 104 байти

c=lambda x:x>1and 1+c([x/2,x*3+1][x%2])
lambda n:[1]+[x for x in range(2,n)if c(x)>max(map(c,range(x)))]

c- це допоміжна функція, яка обчислює відстань Колатца для заданого цілого числа. Безіменна лямбда - це основна функція, яка обчислює надмірні колатці числа до (але не включаючи) вводу.


2

Діалог APL , 41 байт

(∪⊢⍳⌈\)≢∘{1=⍵:⍬⋄2|⊃⌽⍵:⍵,∇1+3×⍵⋄⍵,∇⍵÷2}¨∘⍳

Безіменна функція. Ім'я або круглі параметри, які потрібно застосувати.

Тестові приклади:

       ((∪⊢⍳⌈\)≢∘{1=⍵:⍬ ⋄ 2|⊃⌽⍵:⍵,∇ 1+3×⍵ ⋄ ⍵,∇ ⍵÷2}¨∘⍳)¨4 50 10000
┌─────┬────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────┐
│1 2 3│1 2 3 6 7 9 18 25 27│1 2 3 6 7 9 18 25 27 54 73 97 129 171 231 313 327 649 703 871 1161 2223 2463 2919 3711 6171│
└─────┴────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘

0 призводить до невизначеної поведінки.


1

ES6, 86 83 байт

n=>(i=m=0,c=n=>n<3?n:c(n&1?n*3+1:n/2)+1,[for(x of Array(n))if(c(++i)>m&&(m=c(i)))i])

Редагувати: збережено 3 байти, перейшовши filterна розуміння масиву.


1

Хаскелл, 84 байти

c 1=0;c x|odd x=1+c(3*x+1)|0<1=1+c(div x 2)
f x=[n|n<-[1..x],all(c n>)$c<$>[1..n-1]]

Це, звичайно, повільно, але це працює!


1

Oracle SQL 11.2, 329 байт

WITH q(s,i)AS(SELECT LEVEL s,LEVEL i FROM DUAL CONNECT BY LEVEL<=:1 UNION ALL SELECT s,DECODE(MOD(i,2),0,i/2,i*3+1)i FROM q WHERE i<>1),v AS(SELECT s,COUNT(*)-1 d FROM q GROUP BY s),m AS(SELECT s,d,MAX(d)OVER(ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)m FROM v)SELECT s FROM m WHERE(d>m OR s=1)AND:1>0ORDER BY 1;

Версія без гольфу

WITH q(s,i) AS 
  (
    SELECT LEVEL s, LEVEL i 
    FROM DUAL CONNECT BY LEVEL <= :1
    UNION ALL 
    SELECT q.s, DECODE(MOD(i,2),0,i/2,i*3+1)i FROM q WHERE q.i <> 1
  )
, v AS (SELECT s, COUNT(*)-1 d FROM q GROUP BY s)
, m AS (SELECT s, d, MAX(d)OVER(ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) m FROM v)
SELECT * FROM m WHERE (d>m OR s=1) AND :1>0
ORDER BY 1;

Перегляд q - це справжній рекурсивний вигляд (а не ієрархічний запит з CONNECT BY), який обчислює всі кроки до 1 для кожного цілого числа між 1 і: 1.

V вигляд обчислює зупинні відстані.

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

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


0

MATL , 37 байт

:"@tqX`t0)t2\?3*Q}2/]ht0)q]n]N$htY>=f

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

:         % vector [1,2,...N], where N is implicit input
"         % for each number in that range
  @       %   push that number, k
  tq      %   truthy iff k is not 1
  X`      %   while...do loop
    t0)   %     pick first number of array
    t2\   %     is it odd?
    ?     %     if so:
      3*Q %       multiply by 3 and add 1
    }     %     else
      2/  %       divide by 2
    ]     %     end if
    h     %     concatenate into array with previous numbers
    t0)q  %     duplicate, pick last number, is it 1? Leave that as while condition
  ]       %   end while
  n       %   number of elements of array. This is the stopping distance for k
]         % end for
N$h       % concatenate all stopping distances into an array
tY>       % duplicate and compute cumulative maximum
=f        % indices of matching elements. Implicitly display

0

𝔼𝕊𝕄𝕚𝕟, 30 символів / 38 байт

⩥ïⓜМȬ⧺$,a=[])⋎⟮aꝈ-1⟯>ɐ⅋(ɐ=Ⅰ,ᵖ$

Try it here (Firefox only).

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

Пояснення

⩥ïⓜстворює діапазон [0,input)для відображення на карті. МȬ⧺$,a=[])генерує номери Collatz у порожньому масиві та ⋎⟮aꝈ-1⟯>ɐвикористовує масив номерів Collatz для отримання зупинного шляху та перевірки, чи перевищує його попередній максимальний відстань зупинки. Якщо це так, ⅋(ɐ=Ⅰ,ᵖ$робить поточний гальмівний шлях максимальне відстань зупинки і штовхає поточний елемент в діапазоні в стек. Після цього елементи стека неявно друкуються.


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