Süper Collatz numaralarını yazdır


22

Collatz Sırası Eğer herhangi bir pozitif tamsayı ile başlar bu örnek için biz 10 kullanacaktır ve buna adımların bu grubu uygulamak nerede (ayrıca 3x + 1 sorun olarak adlandırılır) 'dir:

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

10 eşit, yani 5 elde etmek için 2'ye bölüyoruz. 5 tuhaf, bu yüzden 3 ile çarpıyoruz ve 16'yı almak için 1 ekliyoruz. 16 eşit, yani 8 elde etmek için ikiye böldüm. 4, 2'dir ve 2'nin yarısı 1'dir. Bu bize 6 adım attığından, 10'un 6 durma mesafesine sahip olduğunu söylüyoruz .

Bir Süper Collatz numarası, durma mesafesi her sayının durma mesafesinden daha küçük olan bir sayıdır. Örneğin, 6 bir Süper Collatz sayısıdır, çünkü 6, 8, 5 durma mesafesine sahiptir 5, 4, 2, 3, 7, 2, 1 ve 1'e sahiptir. ( OEIS’de A006877 ) bir numara almak n kadar tüm Süper Collatz numaraları üzerinden giriş olarak ve çıkış n .

kurallar

  • Tam Program veya fonksiyon kabul edilebilir.

  • Süper Collatz sırasını önceden hesaplayamaz veya zor kodlayamazsınız.

  • Herhangi bir makul formatta girdi alabilirsiniz.

  • Çıktı, işlevden bir liste olarak döndürülebilir veya STDOUT'a veya bir dosyaya yazdırılabilir. Hangisi en uygunsa.

  • Geçersiz girişler (sayılar, ondalık sayılar, negatif sayılar vb.) Tanımsız davranışa neden olur.

Örnek ungolfed python

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

Örnek 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

Ayrıca burada ilk 44 Süper Collatz numarası var:

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
Ayrıca, eğer biri sonsuzluk durma mesafesine sahip bir sayı bulabilirse (asla 1'e ulaşmaz) onlara sunabileceğim en büyük ödülü vereceğim. = D
DJMcMayhem

1
Pek çok matematikçi olacak ...: P
Rɪᴋᴇʀ


5
Bu sadece bir varsayımdır, ancak 2. kuralın sadece bir meydan okuma kısıtlaması yerine matematiksel bir gerçek olduğundan şüpheleniyorum.
trichoplax

1
"Girdi olarak n bir sayı almalı ve n'ye kadar tüm Süper Collatz sayılarını çıkarmalısınız" Öyleyse bunu doğru anlarsam, ilk n süper kollatz numarasını vermemi istemez misiniz? Çünkü Pyth cevabının yaptığı şey bu, yani yeterince açık olmadığını düşünüyorum.
Şubat'ta

Yanıtlar:


1

Pyth, 23 bayt

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

gösteri

Bu, Collatz durma mesafeleri ile her bir rakama kadar olan menzili maksimumunu alarak ve bu maksimumın söz konusu sayı olup olmadığını kontrol ederek çalışır.


2

Python 2, 104 bayt

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

cverilen bir tamsayı için Collatz mesafesini hesaplayan bir yardımcı fonksiyondur. Adsız lambda, süper Collatz sayılarını girişe kadar hesaplayan (ancak dahil etmeyen) ana fonksiyondur.


2

Dyalog APL , 41 bayt

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

Adsız bir işlev. Uygulanacak ad veya parantez içinde.

Test durumları:

       ((∪⊢⍳⌈\)≢∘{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 tanımsız davranışla sonuçlanır.


1

ES6, 86 83 bayt

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

Düzenleme: filterBir dizi anlamaya geçiş yaparak 3 bayt kurtardı.


1

Haskell, 84 bayt

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

Bu, elbette, oldukça yavaş, ama işe yarıyor!


1

Oracle SQL 11.2, 329 bayt

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;

Golfsüz versiyon

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 görünümü, 1 ile 1 arasındaki her tamsayı için 1'e yönelik tüm adımları hesaplayan gerçek bir özyinelemeli görünümdür (CONNECT BY ile hiyerarşik bir sorgu değil).

V görünümü durma mesafelerini hesaplar.

M görünümü, mevcut satır hariç, önceki her satıra uygulamak için MAX analitik versiyonunu kullanır. Her tamsayı için bu şekilde durma mesafesini ve mevcut en büyük durma mesafesini biliyoruz.

Son sorgu, durma mesafesinin en büyük durma mesafesinden daha büyük olup olmadığını kontrol eder. Ve 1'i ve bunun özel durumunu ele almak için birkaç numara ekler: 1, 0 değerine sahip.


0

MATL , 37 bayt

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

Çevrimiçi deneyin!

:         % 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

Char, 30 karakter / 38 bayt

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

Try it here (Firefox only).

Bunu daha önce yayınlamamamın tek nedeni, özellikleri açıkça görmememdi. 10 bitlik karakterleri kodlayan özel bir kodlama kullanır.

açıklama

⩥ïⓜ[0,input)eşlemek için bir aralık oluşturur . МȬ⧺$,a=[])boş bir dizide Collatz sayıları oluşturur ⋎⟮aꝈ-1⟯>ɐve durma mesafesini almak için Collatz sayıları dizisini kullanır ve bunun önceki maksimum durma mesafesinden daha büyük olup olmadığını kontrol edin. Öyleyse ⅋(ɐ=Ⅰ,ᵖ$, geçerli durma mesafesini maksimum durma mesafesi yapar ve aralıktaki geçerli öğeyi yığına iter. Sonra, yığının öğeleri örtük olarak yazdırılır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.