Stampa i numeri di Super Collatz


22

La sequenza Collatz (chiamata anche problema 3x + 1) è dove inizi con qualsiasi numero intero positivo, per questo esempio useremo 10 e applicheremo questo set di passaggi ad esso:

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

10 è pari, quindi dividiamo per 2 per ottenere 5. 5 è dispari, quindi moltiplichiamo per 3 e aggiungiamo 1 per ottenere 16. 16 è pari, quindi tagliatelo a metà per ottenere 8. La metà di 8 è 4, la metà di 4 è 2 e la metà di 2 è 1. Dato che ci sono voluti 6 passaggi, diciamo che 10 ha una distanza di arresto di 6.

Un numero Super Collatz è un numero la cui distanza di arresto è maggiore della distanza di arresto di ogni numero più piccolo di esso. Ad esempio, 6 è un numero Super Collatz poiché 6 ha una distanza di arresto di 8, 5 ha una distanza di arresto di 5, 4 ha 2, 3 ha 7, 2 ha 1 e 1 ha 0. ( A006877 nell'OEIS) È necessario prendere un numero n come input ed emettere tutti i numeri di Super Collatz fino a n .

Regole

  • Il programma completo o la funzione sono accettabili.

  • Non è possibile precompilare o codificare la sequenza Super Collatz.

  • Puoi ricevere input in qualsiasi formato ragionevole.

  • L'output può essere restituito come elenco dalla funzione o stampato su STDOUT o su un file. Qualunque sia il più conveniente.

  • Gli input non validi (non numeri, decimali, numeri negativi, ecc.) Comportano un comportamento indefinito.

Pitone ungolf di esempio

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 di esempio:

#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

Anche qui ci sono i primi 44 numeri di 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
Inoltre, se qualcuno riesce a trovare un numero con una distanza di arresto di infinito (non raggiunge mai 1) darò loro la taglia più grande che posso offrire. = D
DJMcMayhem

1
Così molti matematici ...: P
R


5
Questa è solo una congettura, ma sospetto che la regola 2 sia un fatto matematico piuttosto che una restrizione alla sfida.
trichoplax,

1
"Devi prendere un numero n come input ed emettere tutti i numeri di Super Collatz fino a n" Quindi se lo capisco correttamente NON chiedi di emettere il primo n numero di Super Collatz? Perché è quello che fa la risposta di Pyth per esempio, quindi penso che non sia abbastanza chiaro.
Fatalizza il

Risposte:


1

Pyth, 23 byte

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

Dimostrazione

Questo funziona prendendo il massimo dell'intervallo fino a ciascun numero per la loro distanza di arresto Collatz e controllando se quel massimo è il numero in questione.


2

Python 2, 104 byte

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è una funzione di supporto che calcola la distanza di Collatz per un dato intero. La lambda senza nome è la funzione principale, che calcola i numeri di Super Collatz fino a (ma non includendo) l'input.


2

Dyalog APL , 41 byte

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

Una funzione senza nome. Nome o parentesi da applicare.

Casi test:

       ((∪⊢⍳⌈\)≢∘{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 comporta un comportamento indefinito.


1

ES6, 86 83 byte

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])

Modifica: salvato 3 byte passando da filteruna comprensione dell'array.


1

Haskell, 84 byte

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]]

Questo è enormemente lento, ovviamente, ma funziona!


1

Oracle SQL 11.2, 329 byte

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;

Versione senza golf

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;

La vista q è una vera vista ricorsiva (non una query gerarchica con CONNECT BY) che calcola tutti i passi verso 1 per ogni numero intero compreso tra 1 e: 1.

La vista v calcola le distanze di arresto.

La vista m usa la versione analitica di MAX per applicarla a tutte le righe precedenti, esclusa la riga corrente. In questo modo per ogni numero intero sappiamo che è la distanza di arresto e l'attuale distanza di arresto maggiore.

La query finale controlla se la distanza di arresto è maggiore della distanza di arresto maggiore. E aggiunge alcuni trucchi per gestire 1 e il caso speciale di: 1 con un valore di 0.


0

MATL , 37 byte

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

Provalo online!

:         % 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 caratteri / 38 byte

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

Try it here (Firefox only).

L'unico motivo per cui non l'ho pubblicato prima era perché non ero chiaro sulle specifiche. Utilizza una codifica personalizzata che codifica caratteri a 10 bit.

Spiegazione

⩥ïⓜcrea un intervallo [0,input)da mappare. МȬ⧺$,a=[])genera numeri Collatz in un array vuoto e ⋎⟮aꝈ-1⟯>ɐutilizza l'array di numeri Collatz per ottenere la distanza di arresto e verificare se è maggiore della distanza di arresto massima precedente. In tal caso, ⅋(ɐ=Ⅰ,ᵖ$rende l'attuale distanza di arresto la massima distanza di arresto e spinge l'oggetto corrente nell'intervallo nella pila. Successivamente, gli articoli della pila vengono stampati in modo implicito.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.