Hofstadter এইচ-সিকোয়েন্স


15

সংজ্ঞা

  • a(0) = 0
  • a(n) = n-a(a(a(n-1))) পূর্ণসংখ্যার জন্য n > 0

কার্য

অ-নেতিবাচক পূর্ণসংখ্যা n, আউটপুট দেওয়া a(n)

Testcases

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
এবং আমি এখনও মনে করি আপনার জিইবি রেফারেন্স করা উচিত ...
মার্টিন

1
নম্বর-তত্ত্ব এখানে কীভাবে প্রাসঙ্গিক?
flawr

1
@ ফ্লোয়ার ফেসপাম আমাকে আবার চেষ্টা করুন: গডেল, এসচার, বাচ: একটি চিরন্তন গোল্ডেন ব্রাইড
স্টিগ হেমার

1
@ স্টিগহ্যামার আসলে ফেসপামটির এখন নিজস্ব ইমোজি রয়েছে: Tob
টোবিয়াস কেইনজলার

উত্তর:


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 বাইটের চেয়ে বড় প্রোগ্রামগুলিও পরিচালনা করতে পারে?
স্টেইনবার্গ

9

গণিত, 20 বাইট

বাইট গণনাটি আইএসও 8859-1 (বা সামঞ্জস্যপূর্ণ) এনকোডিং ধরে এবং $CharacterEncodingউইন্ডোজ ডিফল্টের মতো মিলের মানতে সেট করে WindowsANSI

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

এটি একটি unary অপারেটর সংজ্ঞায়িত করে ±


কী করবে বা কীভাবে এটি কাজ করে তা আপনি ব্যাখ্যা করতে পারেন? বিটিডব্লিউ, 100 কে-তে সংকলন।
ডেভিডসি

1
@ ডেভিডসি ধন্যবাদ :) এটি কেবল একটি বিল্ট-ইন অপারেটর যা অব্যবহৃত ফাংশনের জন্য শর্টহ্যান্ড PlusMinus। বিস্তারিত জানার জন্য এই পোস্টটি দেখুন ।
মার্টিন ইন্ডার

1
অনেক আগ্রহব্যাঞ্জক. @বা [ ]খুব বেশি সঙ্গে Dispenses ।
ডেভিডসি

9

জে, 14 12 বাইট

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

সংরক্ষিত 2 @ ধন্যবাদ বাইট লিকি নূনের

নিজেই যাও recursively যখন কল করে ফলাফলের নির্ণয় করে এন উপর> 0 তিনবার এন -1 থেকে যে ফলাফলের বিয়োগ এন । বেস কেসটির ক্ষেত্রে আলাদা পরিস্থিতি রয়েছে যখন এন = 0 থাকে There সেখানে এটি 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

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

আমরা !আমাদের উদ্দেশ্যে আনারি অপারেটরটিকে নতুনভাবে সংজ্ঞায়িত করি ।

তাহলে এন = 0 তুলনা n>0আয় মিথ্যা এবং তাই করে !

অন্যথায়, কোড পরে &&কার্যকর করা হয়। ~-nসমতূল্য (n-1)দুই এর সম্পূরক এ, !!!যাও recursively কল !উপর তিনবার এন - 1 , এবং তার ফলে মান থেকে বিয়োগ করা হয় এন


কোন ব্যাখ্যা যুক্ত করছ? কী চলছে তা আমার কোনও ধারণা নেই -!!~-_
ডাউনগোট

1
অভিনব কিছু না। !কেবল ফাংশনের নাম।
ডেনিস

5

পাইথন, 31 বাইট

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

পুনরাবৃত্তি সীমা এবং সময়ের সীমাবদ্ধতাগুলি উপরে ফাংশনটিকে অবৈধ করে তোলে, তবে তাত্ত্বিকভাবে এটি কাজ করা উচিত (এবং ছোট এন এর জন্যও কাজ করে)।


4

জাভাস্ক্রিপ্ট (ES6), 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যদিও বৃহত্তর মানগুলির জন্য ভাল স্কেল হয় না ।


আপনি যদি নিজের অবস্থার সাথে পরিবর্তন করেন তবে আপনার বাইট (এবং বেশ কয়েকটি ত্রুটি ডাব্লু / খারাপ ইনপুট) হারাতে সক্ষম হওয়া উচিত n<1। এটির ক্রম হিসাবে এটি কেবলমাত্র অ-নেতিবাচক পূর্ণসংখ্যার জন্যই সংজ্ঞায়িত।
ব্যবহারকারী5957401

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 পর্যন্ত ইনপুটগুলি পরিচালনা করে তবে রান পর্বের সময়টি নাটকীয়ভাবে বেড়ে যায় point

এটি অনলাইন চেষ্টা করুন! উত্পাদিত এসবিআইএন কোড দেখতে ডিবাগ পরীক্ষা করুন ।

সেসোস সমাবেশ

উপরের বাইনারি ফাইলটি নিম্নলিখিত এসএএসএম কোডটি একত্রিত করে তৈরি করা হয়েছে।

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

এটি একটি দীর্ঘ, দ্রুত উত্তর যা ক্রমের পূর্ববর্তী এন্ট্রিগুলিকে ক্যাশে করে। উভয় উত্তর কেবল ১.৯-এর পরে সংস্করণের জন্য কাজ করে, যেমনটি ছিল ->, ছুরিকাঘাতের ল্যাম্বদা রুবির সাথে পরিচয় হয়েছিল।

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



1

সি, 35 32 বাইট

@ পিটারটেলরকে 3 বাইট সংরক্ষিত!

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

আইডিয়নে চেষ্টা করে দেখুন!


2
সি-তে আপনি শর্তসাপেক্ষ হিসাবে সরাসরি কোনও পূর্ণসংখ্যার ব্যবহার করতে পারেন, তিন-বাইট সংরক্ষণ করে:a(n){return n?n-a(a(a(n-1))):0;}
পিটার টেলর

1
@ বিটসেগ - আপনার কোডটিতেও ভুল :আছে। আপনি একটি পরে নেওয়া উচিত ?
owacoder

1

জাভাস্ক্রিপ্ট ES6, 22 বাইট

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

আমি বিরক্ত হয়ে যাব এবং পুনরাবৃত্ত সংস্করণ করব: পি


1

ভিবিএ, 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। অনলাইনে চেষ্টা করুন: বিক্ষোভ

এটি পাইথের আপেক্ষিক নতুন বৈশিষ্ট্য ব্যবহার করে। আপনি ভাঁজ-সিনট্যাক্স ব্যবহার করে একাধিকবার একটি ফাংশন প্রয়োগ করতে পারেন। এটি আসলে কোনও বাইট সংরক্ষণ করে না, আমি এটি কেবল প্রদর্শনের উদ্দেশ্যে ব্যবহার করেছি।

ব্যাখ্যা:

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

সি ++ (এমএসভিসি, মূলত)

সাধারণ সংস্করণ: 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 এর জন্য, স্ট্যাক ওভারফ্লো ত্রুটির কারণে পুনরাবৃত্ত সংস্করণটি ক্র্যাশ হয়ে গেছে এবং টেমপ্লেট সংস্করণ গভীরতার কারণে সংকলন সময়ে টেমপ্লেট সংস্করণটি ক্র্যাশ হয়ে গেছে। জিসিসি 900 এ যায় (614)


আমার মনে হয় আপনার টেম্পলেট মেটা প্রোগ্রামিং সংস্করণের মধ্যে Cএবং এর {মধ্যে জায়গার দরকার নেই
জ্যাচার ý

@ জ্যাচার এমএসভিসি সেই জায়গাটি ছাড়াই সংকলন করতে অস্বীকার করেছে
হাটসুপয়েন্টারকুন

আহ্, আমি এখন দেখছি কেন এমনটি মনে হচ্ছে
জাকারি

@ জাচারý এটি ম্যাক্রোর ধরণের উপর নির্ভর করে। যদি এর প্যারামিটার থাকে তবে আমি স্থানটি সরিয়ে ফেলতে পারি, তবে এখানে এটি হয় না
HatsuPointerKun


1

এপিএল (ডায়ালগ ইউনিকোড) , 18 17 বাইট

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

এটি অনলাইন চেষ্টা করুন!

আশ্চর্যজনকভাবে, এই চ্যালেঞ্জের কোনও এপিএল উত্তর নেই। এটি ওপিতে ফাংশনটির আক্ষরিক বাস্তবায়ন।

তিনবার সময় বের হয়ে গেল এন>90

@ জাচারিকে একটি বাইট ধন্যবাদ সংরক্ষণ করা হয়েছে ý


1
{⍵=0:0⋄⍵-∇⍣3⊢⍵-1}
জাকারি


0

পাওয়ারশেল ভি 2 +, 56 বাইট

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

পুনরাবৃত্ত সংজ্ঞাটি গঠনের জন্য একটি ল্যাম্বদার পাওয়ারশেল সমতুল্য। মাধ্যমে এটি চালানো &কল অপারেটর, যেমন &$a(5)দীর্ঘ সময় নেয়কার্যকর করতে সময় - এমনকি50 আমার মেশিনে (8 জিবি র‍্যাম সহ সাম্প্রতিক আই 5) প্রায় 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 বাইট । এটি অনলাইন চেষ্টা করুন!

এটি হেকা ধীর, কারণ এটি ফলাফল গণনা করতে পুনরাবৃত্তি ব্যবহার করে। টিআইও ব্যবহার h(50)করে এক মিনিট সময় নেয়। এটি সঠিক ফলাফলগুলি ফিরে আসে <= 30, সুতরাং আমি নিশ্চিত যে এটির জন্য কার্যকর হবে h(10000), আমি এটি খুঁজে বের করার জন্য চালাইনি!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.