हॉफ़स्टैटर एच-सीक्वेंस


15

परिभाषा

  • a(0) = 0
  • a(n) = n-a(a(a(n-1))) पूर्णांक के लिए n > 0

कार्य

गैर-नकारात्मक पूर्णांक n, आउटपुट दियाa(n)

परीक्षण के मामलों

n     a(n)
0     0
1     1
2     1
3     2
4     3
5     4
6     4
7     5
8     5
9     6
10    7
11    7
12    8
13    9
14    10
15    10
16    11
17    12
18    13
19    13
20    14
10000 6823

संदर्भ


हॉफ़स्टैटर दृश्यों के बारे में संबंधित चुनौतियाँ: 1 , 2 , 3
मार्टिन एंडर

4
और मुझे अब भी लगता है कि आपको GEB ...
मार्टिन एंडर

1
कैसे है नंबर-सिद्धांत यहाँ प्रासंगिक?
निर्दोष

1
@flawr facepalm : मुझे लगता है कि फिर से कोशिश करते एक शाश्वत गोल्डन ब्रैड: गोडेल, Escher, बाख
स्टिग Hemmer

1
@StigHemmer वास्तव में फेसपालम का अपना इमोजी अब है: 3
टोबीस किन्ज़लर

जवाबों:


20

हास्केल, 23 22 बाइट्स

f 0=0
f n=n-f(f$f$n-1)

बस अनुक्रम की परिभाषा का उपयोग करता है। f(f$f$n-1)के बराबर हैf (f (f (n-1)))

परीक्षा:

main = putStrLn . show $ map f [0..20]
-- => [0,1,1,2,3,4,4,5,5,6,7,7,8,9,10,10,11,12,13,13,14]

एक बाइट के लिए एंडर्स कासोर्ग को धन्यवाद !


(f$f$f$n-1)= f(f$f$n-1)एक बाइट बचाता है।
एंडर्स केसोर्ग

9

जेली , 8 बाइट्स

’ßßßạµṠ¡

इसे ऑनलाइन आज़माएं! या छोटे परीक्षण मामलों की पुष्टि करें

यह काम किस प्रकार करता है

’ßßßạµṠ¡  Main link. Argument: n

     µṠ¡  Execute the preceding chain sign(n) times.
’         Decrement n, yielding n - 1.
 ßßß      Recursively call the main link thrice.
    ạ     Take the absolute difference of n and the result.

9
क्या जेली पार्सर 10 बाइट्स से बड़े कार्यक्रमों को भी संभाल सकता है?
steenbergh

9

गणितज्ञ, 20 बाइट्स

बाइट गिनती आईएसओ 8859-1 (या संगत) एन्कोडिंग और $CharacterEncoding विंडोज डिफ़ॉल्ट की तरह एक मिलान मूल्य पर सेटWindowsANSI

±0=0
±n_:=n-±±±(n-1)

यह एक एकीकृत ऑपरेटर को परिभाषित करता है ±


क्या आप बताएंगे कि ± क्या करता है या कैसे काम करता है? Btw, 100k पर बधाई।
डेविड ऑग

1
@ दाविद धन्यवाद। :) यह सिर्फ एक अंतर्निहित ऑपरेटर है जो अप्रयुक्त फ़ंक्शन के लिए शॉर्टहैंड है PlusMinus। देखें इस पोस्ट जानकारी के लिए।
मार्टिन एंडर

1
बहुत ही रोचक। @या के साथ मतभेद [ ]
डेविड 13

9

जे, 14 12 बाइट्स

-$:^:3@<:^:*

2 लीक बचे धन्यवाद @ लीक नन

खुद रिकर्सिवली जब फोन करके परिणाम की गणना करता है n पर> 0 तीन बार एन -1 और से है कि परिणाम को घटाकर एन । आधार मामले के लिए एक अलग स्थिति है जब n = 0. वहां यह n - n की गणना करता है जो 0 के बराबर होता है।

a(n) = n - n = 0           if n = 0
       n - a(a(a(n-1)))    if n > 0

इसे यहाँ आज़माएँ।

व्याख्या

-$:^:3@<:^:*  Input: n
           *  Get the sign of n (n = 0 => 0, n > 0 => 1)
         ^:   Execute that many times
                (0 times means it will just be an identity function)
       <:       Decrement n
 $:             Call itself recursively
   ^:3          three times
      @         on n-1
-             Subtract that result from n and return

मुझे नहीं लगता कि कोष्ठक की जरूरत है।
लीक नून

6

जूलिया, 16 बाइट्स

!n=n>0&&n-!!!~-n

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

हम यूनिरी ऑपरेटर को फिर से परिभाषित करते हैं ! अपने उद्देश्यों के लिए को हैं।

यदि n = 0 , तुलना n>0रिटर्न झूठी और ऐसा नहीं करता है!

अन्यथा, कोड &&निष्पादित होने के बाद । दो-पूरक में ~-nसमतुल्य है (n-1), !!!पुन: n - 1! पर तीन बार कॉल करता है , और परिणामी मान n से घटाया जाता है ।


एक स्पष्टीकरण जोड़ने मन? मुझे कुछ पता नहीं है कि क्या चल रहा है -!!~-।_।
डाउनगोट

1
कुछ भी आकर्षक नहीं। !बस फ़ंक्शन का नाम है।
डेनिस

5

पायथन, 31 बाइट्स

a=lambda n:n and n-a(a(a(n-1)))

पुनरावर्तन की सीमा और समय की कमी, कार्य को अव्यावहारिक बनाते हैं, लेकिन सिद्धांत रूप में इसे काम करना चाहिए (और छोटे n के लिए काम करता है)।


4

जावास्क्रिप्ट (ईएस 6), 52 बाइट्स

n=>[0,...Array(n)].reduce((p,_,i,a)=>a[i]=i-a[a[p]])

मैं उबाऊ हो सकता था और पुनरावर्ती संस्करण लिख सकता था लेकिन यह संस्करण बहुत तेज़ है (आसानी से अंतिम परीक्षण मामले का सामना कर रहा है) और reduceइसलिए इसका उपयोग एक प्लस भी है!



3

सीजाम, 13 12 बाइट्स

1 बाइट बचाने के लिए डेनिस को धन्यवाद।

ri0{_(jjj-}j

इसका परीक्षण यहां करें।


यह आश्चर्यजनक रूप से उच्च मूल्यों के लिए काम करता है। मुझे लगता है कि आपको इसकी आवश्यकता नहीं है a
डेनिस

@ डेनिस ओह, यह जानना अच्छा है, धन्यवाद।
मार्टिन एंडर

3

आर, 42 41 बाइट्स

a=function(n)ifelse(n<1,0,n-a(a(a(n-1))))

उपयोग:

> a(1)
1
> a(10)
7

यह पुनरावर्ती दृष्टिकोण nहालांकि बड़े मूल्यों के लिए अच्छा नहीं है ।


यदि आप अपनी स्थिति बदलते हैं, तो आपको एक बाइट (और कई त्रुटियों w / खराब इनपुट) को खोने में सक्षम होना चाहिए n<1। इसके अनुक्रम के रूप में, यह केवल किसी भी तरह गैर-नकारात्मक पूर्णांक के लिए परिभाषित किया गया है।
user5957401

a=function(n)"if"(n,n-a(a(a(n-1))),0)कई बाइट्स के लिए काम करेंगे।
ग्यूसेप


2

सेसोस , 58 55 बाइट्स

0000000: 16e0d7 bdcdf8 8cdf1b e6cfbb 840d3f bf659b 38e187  ..............?.e.8..
0000015: f8639b 39dc37 fc893f 666c05 7e7ed9 b88b3f ae0d3f  .c.9.7..?fl.~~...?..?
000002a: 676ed8 bd9940 7fdc3b 36619e f1                    gn...@..;6a..

400 तक इनपुट संभालती है अच्छी तरह , लेकिन उस बिंदु के बाद नाटकीय रूप से समय बढ़ता है।

इसे ऑनलाइन आज़माएं! डीबग की जाँच करेंउत्पन्न SBIN कोड देखने के लिए ।

सेसोस विधानसभा

ऊपर की बाइनरी फ़ाइल निम्नलिखित एसएएसएम कोड को इकट्ठा करके बनाई गई है।

set numin, set numout

get
jmp
    jmp
        rwd 3, add 1, rwd 1, add 1, fwd 4, sub 1
    jnz
    rwd 3, sub 1
jnz
rwd 3, add 1, fwd 2
jmp
    rwd 1, sub 1, fwd 3, sub 1, fwd 2, add 3
    jmp
        rwd 2
        jmp
            rwd 3
        jnz
        fwd 6, get, rwd 4, sub 1
        jmp
            fwd 1, sub 1
            jmp
                rwd 3
            jnz
            sub 1
            jmp
                fwd 3
            jnz
            rwd 4, sub 1
        jnz
        fwd 1
        jmp
            rwd 1, add 1, fwd 1, add 1
        jnz
        sub 1, fwd 3, sub 1
        jmp
            fwd 3
        jnz
        rwd 1, sub 1
    jnz
    rwd 2, get
    nop
        rwd 3
    jnz
    fwd 3, get, rwd 2
    jmp
        fwd 2, add 1
        jmp
            fwd 3
        jnz
        rwd 1, add 1, rwd 2
        jmp
            rwd 3
        jnz
        fwd 1, sub 1
    jnz
    fwd 2
    jmp
        rwd 2, add 1, fwd 2, sub 1
    jnz
    nop
        get, fwd 3
    jnz
    rwd 1, add 1, fwd 2
jnz
rwd 2, sub 1
jmp
    rwd 1, sub 1, fwd 1, sub 1
jnz
rwd 1, put


1

जावा 7, 42 बाइट्स

int c(int n){return n>0?n-c(c(c(n-1))):0;}

अनगुल्ड और परीक्षण के मामले:

इसे यहाँ आज़माएँ।

class Main{
  static int c(int n){
    return n > 0
              ? n - c(c(c(n-1)))
              : 0;
  }

  public static void main(String[] a){
    for(int i = 0; i < 21; i++){
      System.out.println(i + ": " + c(i));
    }
    System.out.println("1000: " + c(1000));
  }
}

आउटपुट:

0: 0
1: 1
2: 1
3: 2
4: 3
5: 4
6: 4
7: 5
8: 5
9: 6
10: 7
11: 7
12: 8
13: 9
14: 10
15: 10
16: 11
17: 12
18: 13
19: 13
20: 14
 (last case takes too long..)

1

रूबी, 27 बाइट्स

स्पष्ट कार्यान्वयन।

a=->n{n<1?0:n-a[a[a[n-1]]]}

यह एक लंबा, तेज़ उत्तर है जो अनुक्रम में पिछली प्रविष्टियों को कैश करता है। दोनों जवाब केवल 1.9 के बाद के संस्करणों के लिए काम करते हैं, जैसा कि तब था ->, जब स्टब्बी लैम्ब्डा को रूबी से मिलवाया गया था।

->n{r=[0];i=0;(i+=1;r<<i-r[r[r[i-1]]])while i<n;r[n]}



1

सी, 35 32 बाइट्स

@PeterTaylor के लिए धन्यवाद 3 बाइट्स सहेजे गए!

a(n){return n?n-a(a(a(n-1))):0;}

Ideone पर यह कोशिश करो!


2
सी में आप एक पूर्णांक को सीधे सशर्त के रूप में उपयोग कर सकते हैं, जिससे तीन बाइट की बचत होती है:a(n){return n?n-a(a(a(n-1))):0;}
पीटर टेलर

1
@betseg - :आपके कोड में भी एक गलत है। आपको एक के बाद एक बाहर निकालना चाहिए ?
13

1

जावास्क्रिप्ट ईएस 6, 22 बाइट्स

a=n=>n&&n-a(a(a(n-1)))

मैं उबाऊ हो जाऊंगा और पुनरावर्ती संस्करण करूंगा: पी


1

VBA, 69 बाइट्स

Function H(N):ReDim G(N):For j=1To N:G(j)=j-G(G(G(j-1))):Next:H=G(N)

परीक्षण सेट पर एक आंख की झपकी में काम करता है, n = 1000000 से थोड़ा ऊपर धीमा हो जाता है, स्मृति दीवार में n = 25 मिलियन से थोड़ा ऊपर चलता है।


1

अजगर, 10 बाइट्स

L-WbbyFtb3

एक कार्य को परिभाषित करता है y। इसे ऑनलाइन आज़माएँ: प्रदर्शन

यह Pyth की एक सापेक्ष नई विशेषता का उपयोग करता है। आप गुना-सिंटैक्स का उपयोग करके एक फ़ंक्शन को कई बार लागू कर सकते हैं। यह वास्तव में किसी भी बाइट्स को नहीं बचाता है, मैंने इसे केवल प्रदर्शन प्रयोजनों के लिए उपयोग किया है।

स्पष्टीकरण:

L-WbbyFtb3
L            define function y(b), that returns:
    b           b
 -Wb            and subtract the following if b>0
     yF  3      y applied three times to
       tb       b - 1

1

मेपल, 28 26 बाइट्स

`if`(n=0,0,n-a(a(a(n-1))))

उपयोग:

> a:=n->ifelse(n=0,0,n-a(a(a(n-1))));
> seq(a(i),i=0..10);
0, 1, 1, 2, 3, 4, 4, 5, 5, 6, 7

1

डीसी, 34 बाइट्स

dsn[zdddd1-;a;a;a-r:aln!=L]dsLx;ap

स्टैक के ऊपर से इनपुट लिया जाता है। स्टैक पर यह एकमात्र आइटम होना चाहिए, क्योंकि स्टैक डेप्थ का उपयोग काउंटर के रूप में किया जाता है। उपयोग का उदाहरण:

$ dc
10000dsn[zdddd1-;a;a;a-r:aln!=L]dsLx;ap

यह अनुक्रम परिभाषा का एक बिल्कुल सीधा कार्यान्वयन है:

dsn               # Store n as `n', and keep a copy as a depth buffer (see below)
[                 # Open loop definition
 z                # Push stack depth i for i-th term
 dddd             # Duplicate stack depth four times, for a total of five copies
 1-               # Get i-1 for use as index to previous term
                  #   Note that if we hadn't duplicated n above, or left something else
                  #   on the stack, 0-1 would be -1, which is not a valid array index
 ;a;a;a           # Fetch a(a(a(i-1)))
 -                # Calculate i-a(a(a(i-1)))
 r                # Arrange stack to store i-th term: TOS |  i  (i-a(a(a(i-1))))
 :a               # Store i-th term in array `a'
 ln!=L            # Load n. If n!=i, we're not done calculating terms yet, so execute loop
]                 # Close loop definition. Note that we started with five copies of i:
                  #   i-1 was used to get last term
                  #   i-a(...) was used to calculate current term
                  #   ... i :a was used to store current term
                  #   i ln !=L was used to check loop exit condition
                  # One copy of i is left on the stack to increment counter
dsLx              # Duplicate loop macro, store it, and execute copy
;a                # Last i stored on stack from loop will equal n, so use this to get a(n)
p                 # Print a(n)

वैसे भी, यह सीधा बाहर शुरू हुआ ... फिर गोल्फ हुआ।



1

C ++ (MSVC, मुख्य रूप से)

सामान्य संस्करण: 40 बाइट्स

int a(int n){return n?n-a(a(a(n-1))):0;}

टेम्प्लेट मेटा प्रोग्रामिंग संस्करण: 130 बाइट्स

#define C {constexpr static int a(){return
template<int N>struct H C N-H<H<H<N-1>::a()>::a()>::a();}};template<>struct H<0>C 0;}};

उपयोग:

std::cout << a(20) << '\n';       // Normal version
std::cout << H<20>::a() << '\n';  // Template version

टेम्प्लेट संस्करण सबसे तेज़ कोड है, क्योंकि एक रजिस्टर में एक मान => अनुकूलन के साथ आगे बढ़ने से तेज कुछ भी नहीं है, H<20>::a()जैसा कि संकलन:

mov esi, 14

10000 के लिए, पुनरावर्ती संस्करण एक स्टैक अतिप्रवाह त्रुटि के कारण क्रैश हो जाता है, और टेम्पलेट संस्करण टेम्पलेट तात्कालिकता गहराई के कारण संकलन समय पर क्रैश हो जाता है। GCC 900 (614) पर जाती है


मुझे लगता है कि आप के बीच Cऔर {टेम्पलेट मेटा प्रोग्रामिंग संस्करण में जगह की जरूरत नहीं है
Zacharý

@ Zacharý MSVC ने उस जगह के बिना संकलन करने से इंकार कर दिया
HatsuPointerKun

आह, मैं अब देख रहा हूं कि ऐसा क्यों हो रहा है
Zacharý

@ Zacharý यह मैक्रो के प्रकार पर निर्भर करता है। यदि इसके पैरामीटर हैं, तो मैं अंतरिक्ष को हटा सकता हूं, लेकिन यहां ऐसा नहीं है
HatsuPointerKun


1

एपीएल (डायलॉग यूनिकोड) , 18 17 बाइट्स

{⍵=0:0⋄⍵-∇⍣3⊢⍵-1}

इसे ऑनलाइन आज़माएं!

हैरानी की बात है कि इस चुनौती का कोई एपीएल जवाब नहीं है। यह ओपी में फ़ंक्शन का शाब्दिक कार्यान्वयन है।

TIO बार के लिए बाहर n>90

@ Zacharý को एक बाइट धन्यवाद दिया।


1
{⍵=0:0⋄⍵-∇⍣3⊢⍵-1}
Zacharý


0

PowerShell v2 +, 56 बाइट्स

$a={$n=$args[0];if($n){$n-(&$a(&$a(&$a($n-1))))}else{0}}

पुनरावर्ती परिभाषा बनाने के लिए एक मेमने के बराबर पावरशेल। &कॉल ऑपरेटर के माध्यम से इसे निष्पादित करें, जैसे &$a(5)। निष्पादित करने के लिए एक लंबा समय लगता है - यहां तक 50कि मेरी मशीन पर (8GB रैम के साथ हाल ही में i5) लगभग 90 सेकंड लगते हैं।

तेज़ पुनरावृत्ति समाधान, 59 बाइट्स

param($n)$o=,0;1..$n|%{$o+=$_-$o[$o[$o[$_-1]]]};$o[-1]*!!$n

केवल इसलिए कि हमें इनपुट के लिए खाते की आवश्यकता है 0(यह *!!$nअंत में है)। अन्यथा हम केवल पुनरावृति से $nप्रत्येक बार एक नया तत्व जोड़ते हुए सरणी का निर्माण करते हैं , और अंत में अंतिम एक आउटपुट करते हैं $o[-1]। सुपर-स्पीडी - 10000मेरी मशीन पर गणना करने में लगभग 5 सेकंड लगते हैं।


0

> <> , 55 + 2 = 57 बाइट्स

^~n;
.~-]{:0$
v>1-}32[
v/  /:1-32[
>$:?/$~]{:0$.
/30@2[

इनपुट कार्यक्रम प्रारंभ में स्टैक पर मौजूद होने की उम्मीद है, इसलिए -vध्वज के लिए +2 बाइट्स । इसे ऑनलाइन आज़माएं!

यह हक्का धीमा है, क्योंकि यह परिणाम की गणना करने के लिए पुनरावृत्ति का उपयोग करता है। TIO का उपयोग करते हुए, h(50)एक मिनट से अधिक समय लगता है। यह सही परिणाम देता है <= 30, इसलिए मुझे विश्वास है कि यह काम करेगा h(10000), मैंने इसे खोजने के लिए इसे नहीं चलाया है!

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