Yeni Sipariş # 2: Yolumu Aç


15

Giriş (yok sayılabilir)

Tüm pozitif sayıları düzenli sıraya koymak (1, 2, 3, ...) biraz sıkıcı, değil mi? Burada, tüm pozitif sayıların permütasyonları (yeniden karıştırmaları) etrafında bir dizi zorluk var. Bu serideki ikinci zorluk. İlk zorluk burada bulunabilir .

Bu meydan okumada, doğal sayıları yeniden düzenlemek için Gray kodlarını kullanıyoruz. Gri kod veya "yansıtılan ikili kod", birbirini izleyen iki değerin yalnızca bir bitte farklılık göstereceği şekilde bir ikili kodlamadır. Bu kodlamanın pratik bir uygulaması, onu döner kodlayıcılarda kullanmaktır , dolayısıyla "Dönüşümü" referansım .

3 bit ikilik olarak işaretlenmiş açı ölçüm cihazları için döner kodlayıcı.

Bu kodlamanın bir dereceye kadar özgürlük bıraktığını unutmayın. Örneğin, ikili 1100'ü izleyen dört olası kod vardır: 1101, 1110, 1000 ve 0100. Bu yüzden a(n) 'yi ikili kodlamada yalnızca bir karakterden farklı olan en küçük, daha önce kullanılmayan değer olarak tanımlayacağım . Bu dizi A163252'ye karşılık gelir .

Bu bir "saf dizisi" meydan okuma olduğu için, görev çıkışı için a(n) , belirli bir içinn as input, where a(n) is A163252.

Task

Given an integer input n, output a(n) in integer format (not in binary format).

a(n) is defined as the least positive integer not occurring earlier in the sequence such that a(n1) and a(n) differ in only one bit when written in binary.

Note: 1-based indexing is assumed here; you may use 0-based indexing, so a(0)=1;a(1)=3, etc. Please mention this in your answer if you choose to use this.

Test cases

Input | Output
--------------
1     | 1
5     | 4
20    | 18
50    | 48
123   | 121
1234  | 1333
3000  | 3030
9999  | 9997

Rules

  • Input and output are integers (your program should at least support input and output in the range of 1 up to 32767)
  • Invalid input (0, floats, strings, negative values, etc.) may lead to unpredicted output, errors or (un)defined behaviour. In A163252, a(0) is defined as 0. For this challenge, we will ignore this.
  • Default I/O rules apply.
  • Default loopholes are forbidden.
  • This is , so the shortest answers in bytes wins

Final note

See the following related (but not equal) PP&CG questions:

Yanıtlar:


1

Stax, 19 17 bytes

êÑ{╚α8è╙mc┼σ▀»É▲ü

Run and debug it

It stops working at some point after the specified domain due to the hardcoded bit index iteration. (32767)

Unpacked, ungolfed, and commented, it looks like this.

z0,         push an empty array, literal zero, and the input, in that order
             - the zero represents the last calculated value in the sequence
             - the array contains all the previous ones
D           repeat the rest of the program n times (from input)
  +         append the last calculated value to the array
  17r       [0 .. 16] (these are the bit indices necessary to cover the input range)
  {|2nH|^m  calculate candidate values; previous value with each of these bits toggled 
  n-        remove all values previously calculated
  |m        keep the minimum candidate remaining

Run this one


You're 1 byte behind the shortest 05AB1E answer. Do you plan on optimizing this further? Otherwise I'll accept Kevin's answer...
agtoever

1
If I have the opportunity I will work on it today, sometime in the next 14 hours.
recursive

Allright. I'll keep it open for another day. Good luck!
agtoever

@agtoever: Thanks. I'm done now.
recursive

Aferin! Sen kazandın! Tebrikler!
agtoever

4

JavaScript (ES6), 65 bayt

1 endeksli.

n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}

Çevrimiçi deneyin!

Yorumlananlar

n => {                  // n = index of requested term
  for(                  // for loop:
    o =                 //   o = storage object for the terms of the sequence
    p =                 //   p = last term found in the sequence
      [k = 1];          //   k = current term
    o[k] |              //   if k was already encountered
    ~-(i = p ^ k) & i ? //   or (p XOR k) has more than 1 bit set:
      k++               //     increment k
    :                   //   else:
      k = o[p = k]      //     set o[k], set p to k
        = !!n--;        //     stop if n is equal to 0 or set k to 1; decrement n
  );                    // end of for()
  return p              // return p
}                       // end

TIO'da n> ~ 1024 için yığın taşması alıyorum. Abu diğer ortamda bununla nasıl başa çıkılacağı konusunda herhangi bir öneriniz var mı? Kural: " Programınız en az 1 ila 32767 teori aralığında giriş ve çıkışı desteklemelidir "
agtoever

1
@agtoever Özyinelemeli olmayan bir sürüme güncelledim.
Arnauld

4

Jelly, 26 20 bytes

ṀBLŻ2*^1ị$ḟ⁸Ṃ;
0Ç⁸¡Ḣ

Try it online!

A full program that takes n as the single argument. Works for all test cases. Also note that, although not required, it handles n=0.

Explanation

Helper link: find next term and prepend

Ṁ              | maximum of list so far
 B             | convert to binary
  L            | number of binary digits
   Ż           | 0..above number
    2*         | 2 to the power of each of the above
      ^        | exclusive or with...
       1ị$     | ... the most recent term in the list so far
          ḟ⁸   | filter out anything used already
            Ṃ  | find the minimum
             ; | prepend to existing list

Main link

0              | start with zero
 Ç             | call the above link
  ⁸¡           | and repeat n times
    Ḣ          | take the last term added

3

Java (JDK), 142 138 124 123 132 130 98 bytes

n->{int s[]=new int[9*n],j,k=0;for(;n-->0;s[k=j]++)for(j=0;s[++j]>0|n.bitCount(j^k)>1;);return k;}

Try it online!


1
I'm afraid imports has to be included in the byte-count. You can however golf the import java.util.*;+Set s=new HashSet(); to var s=new java.util.HashSet();. In addition, the rest can be golfed to: Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;. Nice answer nonetheless, so +1 from me. :)
Kevin Cruijssen

1
Saved 2 more bytes using Stack rather than HashSet. A lot slower but works!
Daniel Widdis

1
Ah, of course, smart. And no matter how slow, if we can save a byte it's worth it for code-golf challenges. ;p I once had an answer that went from complexity O(n) to O(nn) by saving a byte, haha xD
Kevin Cruijssen

2
Hala benim ilk yorumda önerilen ikinci golf ile 126 bayt golf. :)
Kevin Cruijssen


2

Python 2, 81 bytes

1-based indexing

l=[0];p=0
exec"n=0\nwhile(p^n)&(p^n)-1or n in l:n+=1\np=n;l+=p,;"*input()
print p

Try it online!


Python 2, 79 bytes

This takes a lot of time (9999 wasn't finished after running locally for 7 minutes)

l={0};p=0;n=input()
exec'p=min({p^2**k for k in range(n)}-l);l|={p};'*n
print p

Try it online!


1
Maksimum 32767 girişi desteklenmez (varsayılan özyineleme derinliği sisteme bağlı değildir).
Outgolfer Erik

Even the given test case 9999 isn't supported. :)
Daniel Widdis

@EriktheOutgolfer Changed it to an iterative approach, probably still doesn't finish in time on TIO, but runs locally just fine.
ovs

@ovs Oh, timeouts alone don't matter.
Outgolfer Erik

Cool! I just tried it for n=9999 and it completed successfully after about an hour. +1. Yay! ;-)
agtoever



1

Charcoal, 65 bytes

≔⁰θFN«⊞υθ≔¹ηW¬‹θ⊗η≦⊗ηW∧›η¹∨¬&θη№υ⁻θη≧÷²ηW№υ⁻|θη&θη≦⊗η≔⁻|θη&θηθ»Iθ

Try it online! Link is to verbose version of code. Explanation:

≔⁰θ

Initialise the result to 0.

FN«

Loop n times.

⊞υθ

Save the previous result so that we don't use it again.

≔¹ηW¬‹θ⊗η≦⊗η

Find the highest bit in the previous result.

W∧›η¹∨¬&θη№υ⁻θη≧÷²η

While that bit is greater than 1, if the bit is set in the previous result, try subtracting that bit to see if the result is an unseen result. This ensures that the potential results are tried in ascending order of value.

W№υ⁻|θη&θη≦⊗η

Now try XORing that bit with the previous result, doubling the bit until an unseen result is found. This handles the cases when a bit needs to be set, again in ascending order of value, but also the case when the least significant bit needs to be toggled, which the previous loop doesn't bother to test (because it's golfier to test for that here). If the previous loop found an unseen result then this loop never runs; if it didn't then this loop will uselessly retest those results.

≔⁻|θη&θηθ

Update the result by actually XORing the bit with it.

»Iθ

Output the final result at the end of the loop.


1

05AB1E, 21 20 18 bytes

ÎFˆ∞.Δ¯θy^bSO¯yå_*

Pretty inefficient, so the larger the input, the longer it takes to get the result. Does work for input 0 as well, though.

Try it online or verify the first n terms.

Explanation:

Î                # Push 0 and the input
 F               # Loop the input amount of times:
  ˆ              #  Pop the current number and add it to the global_array
  ∞.Δ            #  Inner loop starting at 1 to find the first number which is truthy for:
     ¯θy^        #   XOR the last number of the global_array with the loop-number `y`
         b       #   Convert it to binary
          SO     #   Sum it's binary digits
     ¯yå_        #   Check if the loop-number `y` is NOT in the global_array yet
            *    #   Multiply both (only if this is 1 (truthy), the inner loop will stop)
                 # (after the loops, output the top of the stack implicitly)

1

Haskell, 101 bytes

import Data.Bits
(u!n)0=n
(u!n)m|q<-minimum[x|r<-[0..62],x<-[xor(2^r)n],notElem x u]=(n:u)!q$m-1
[]!0

Try it online!

It seems a shame to incur an import just for xor, but I haven't found a good work-around yet. I also wonder if there's a better way to express the loop.


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.