Распечатать номера 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

Образец ввода-вывода:

#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 Super Collatz? Потому что это то, что делает ответ 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

Dyalog 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

Haskell, 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=[])генерирует числа Коллатца в пустом массиве и ⋎⟮aꝈ-1⟯>ɐиспользует массив чисел Коллатца, чтобы получить тормозной путь и проверить, превышает ли он предыдущий максимальный тормозной путь. Если это так, ⅋(ɐ=Ⅰ,ᵖ$делает текущее расстояние остановки максимальным расстоянием остановки и помещает текущий элемент в диапазоне в стек. После этого элементы стека печатаются неявно.


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