सुपर Collatz संख्या मुद्रित करें


22

Collatz अनुक्रम (भी 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. 5 विषम है, इसलिए हम 3 से गुणा करते हैं और 1 को 16 प्राप्त करने के लिए जोड़ते हैं। 16 भी है, इसलिए इसे आधे में काटें 8. 8 का आधा 4 है, आधा आधा है। 4 2 है, और 2 का आधा है। 1 क्योंकि इसने हमें 6 कदम उठाए, हम कहते हैं कि 10 की एक रोक दूरी है 6 की है।

एक सुपर Collatz संख्या एक संख्या है जिसका रुकने की दूरी अधिक होती है और फिर हर संख्या की रुकने की दूरी इससे छोटी होती है। उदाहरण के लिए, 6 एक सुपर Collatz संख्या है क्योंकि 6 में 8 की एक स्टॉपिंग दूरी है, 5 की स्टॉपिंग दूरी 5 है, 4 में 2 है, 3 में 7 है, 2 में 1 है और 1 में 0. ( एईएस में A006877 ) है इनपुट के रूप में एक संख्या n लें , और सभी सुपर Collatz संख्याओं को n तक आउटपुट करें

नियम

  • पूर्ण कार्यक्रम या समारोह स्वीकार्य है।

  • आप सुपर 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 सुपर 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 तक नहीं पहुंचती है) तो मैं उन्हें सबसे बड़ा इनाम दे सकता हूं जो मैं पेश कर सकता हूं। = डी
DJMcMayhem

1
तो कई गणितज्ञ ...: पी
R '


5
यह केवल अनुमान है, लेकिन मुझे संदेह है कि नियम 2 केवल एक चुनौती प्रतिबंध के बजाय एक गणितीय तथ्य है।
ट्राइकोप्लाक्स

1
"आपको इनपुट के रूप में एक नंबर n लेना चाहिए, और सभी सुपर Collatz संख्याओं को n तक आउटपुट करना होगा" तो अगर मैं इसे सही ढंग से समझता हूं तो आप पहले n सुपर कोलेजन नंबर को आउटपुट करने के लिए नहीं कहते हैं? क्योंकि उदाहरण के लिए पाइथ का जवाब यही है, इसलिए मुझे लगता है कि यह पर्याप्त स्पष्ट नहीं है।
घातक

जवाबों:


1

पायथ, 23 बाइट्स

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

प्रदर्शन

यह उनके Collatz रोक दूरी द्वारा प्रत्येक संख्या तक सीमा की अधिकतम लेने के द्वारा काम करता है, और यह जांचता है कि क्या वह अधिकतम प्रश्न में संख्या है।


2

पायथन 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एक सहायक फ़ंक्शन है जो किसी दिए गए पूर्णांक के लिए Collatz दूरी की गणना करता है। अनाम लंबोदर मुख्य कार्य है, जो इनपुट के लिए सुपर Collatz संख्या (लेकिन शामिल नहीं) तक की गणना करता है।


2

दिल्लोग एपीएल , 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

ईएस 6, 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])

संपादित करें: filterएक सरणी समझ से स्विच करके 3 बाइट्स सहेजे गए ।


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 के बीच के प्रत्येक पूर्णांक के लिए सभी चरणों की गणना करता है।

V दृश्य रुकने की दूरी की गणना करता है।

एम दृश्य वर्तमान पंक्ति को छोड़कर, पूर्ववर्ती प्रत्येक पंक्तियों पर लागू करने के लिए 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

S, 30 चार्ट / 38 बाइट्स

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

Try it here (Firefox only).

एकमात्र कारण जो मैंने पहले पोस्ट नहीं किया था, क्योंकि मैं ऐनक पर स्पष्ट नहीं था। एक कस्टम एन्कोडिंग का उपयोग करता है जो 10-बिट चार्ट को एन्कोड करता है।

व्याख्या

⩥ïⓜ[0,input)नक्शे पर एक सीमा बनाता है । МȬ⧺$,a=[])एक खाली सरणी में Collatz संख्या उत्पन्न ⋎⟮aꝈ-1⟯>ɐकरता है , और रोक दूरी प्राप्त करने और पिछले अधिकतम रोक दूरी से अधिक है अगर जाँच करने के लिए Collatz संख्या के सरणी का उपयोग करता है। यदि ऐसा है, तो ⅋(ɐ=Ⅰ,ᵖ$वर्तमान स्टॉपिंग दूरी को अधिकतम स्टॉपिंग दूरी बनाता है और वर्तमान आइटम को स्टैक में सीमा में धकेलता है। इसके बाद, स्टैक के आइटम को स्पष्ट रूप से मुद्रित किया जाता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.