Orde Baru # 2: Putar Jalanku

15

Pendahuluan (dapat diabaikan)

Menempatkan semua angka positif dalam urutan regulernya (1, 2, 3, ...) agak membosankan, bukan? Jadi di sini adalah serangkaian tantangan seputar permutasi (perombakan) dari semua angka positif. Ini adalah tantangan kedua dalam seri ini. Tantangan pertama dapat ditemukan di sini .

Dalam tantangan ini, kami menggunakan kode Gray untuk menyusun ulang bilangan asli. Kode abu-abu, atau "kode biner tercermin" adalah pengkodean biner sedemikian rupa sehingga dua nilai berturut-turut berbeda hanya dalam satu bit. Aplikasi praktis dari pengkodean ini adalah menggunakannya dalam rotary encoders , maka referensi saya untuk "Turn My Way" .

Rotary encoder untuk perangkat pengukur sudut yang ditandai dalam biner 3-bit.

Perhatikan bahwa pengkodean ini meninggalkan beberapa derajat kebebasan. Misalnya, mengikuti biner 1100, ada empat kemungkinan kode berikut: 1101, 1110, 1000 dan 0100. Inilah sebabnya saya akan mendefinisikan a(n) sebagai nilai terkecil, yang sebelumnya tidak digunakan yang hanya berbeda satu karakter dalam pengkodean biner. Urutan ini sesuai dengan A163252 .

Karena ini adalah tantangan "urutan murni", tugasnya adalah mengeluarkan untuk input diberikan , di mana adalah A163252 .a(n)na(n)

Tugas

Diberikan input integer , output dalam format integer ( bukan dalam format biner).na(n)

a(n) didefinisikan sebagai bilangan bulat paling positif yang tidak terjadi sebelumnya dalam urutan sehingga dan berbeda hanya dalam satu bit ketika ditulis dalam biner.a(n1)a(n)

Catatan: pengindeksan berbasis 1 diasumsikan di sini; Anda dapat menggunakan pengindeksan berbasis 0, jadi , dll. Sebutkan ini dalam jawaban Anda jika Anda memilih untuk menggunakan ini.Sebuah(0)=1;Sebuah(1)=3

Uji kasus

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

Aturan

  • Input dan output adalah bilangan bulat (program Anda setidaknya harus mendukung input dan output dalam kisaran 1 hingga 32767)
  • Input yang tidak valid (0, float, string, nilai negatif, dll.) Dapat mengakibatkan output yang tidak terduga, kesalahan atau (tidak) perilaku yang didefinisikan. Dalam A163252 , didefinisikan sebagai 0. Untuk tantangan ini, kita akan mengabaikan ini.a(0)
  • Standar I / O aturan berlaku.
  • Celah default dilarang.
  • Ini adalah , jadi jawaban tersingkat dalam byte menang

Catatan akhir

Lihat pertanyaan PP&CG terkait (tetapi tidak sama):

agtoever
sumber

Jawaban:

1

Stax , 19 17 byte

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

Jalankan dan debug itu

Itu berhenti bekerja di beberapa titik setelah domain yang ditentukan karena pengindeksan bit indeks hardcoded. (32767)

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

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

Jalankan yang ini

rekursif
sumber
Anda 1 byte di belakang jawaban 05AB1E terpendek. Apakah Anda berencana untuk mengoptimalkan ini lebih lanjut? Kalau tidak, saya akan menerima jawaban Kevin ...
agtoever
1
Jika saya memiliki kesempatan, saya akan mengerjakannya hari ini, sekitar 14 jam ke depan.
rekursif
Baiklah. Saya akan tetap buka untuk hari lain. Semoga berhasil!
agtoever
@ agtoever: Terima kasih. Saya sudah selesai sekarang.
rekursif
Sudah selesai dilakukan dengan baik! Kamu menang! Selamat!
agtoever
4

JavaScript (ES6), 65 byte

1-diindeks.

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

Cobalah online!

Berkomentar

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
Arnauld
sumber
Pada TIO, saya mendapatkan stack overflow untuk n> ~ 1024. Ada saran tentang bagaimana tot menangani itu di lingkungan Abu lainnya? Aturan: " program Anda setidaknya harus mendukung input dan output dalam kisaran kalori 1 hingga
total
1
@agtoever Saya sudah memperbarui ke versi non-rekursif.
Arnauld
4

Jelly , 26 20 byte

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

Cobalah online!

Program lengkap yang menggunakan n sebagai argumen tunggal. Berfungsi untuk semua kasus uji. Juga perhatikan bahwa, meskipun tidak diperlukan, ia menangani n = 0.

Penjelasan

Tautan bantuan: cari istilah berikutnya dan tambahkan

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

Tautan utama

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

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

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

Cobalah online!

Daniel Widdis
sumber
1
Saya khawatir impor harus dimasukkan dalam byte-count. Namun Anda dapat menggunakan tanda import java.util.*;+ Set s=new HashSet();untuk var s=new java.util.HashSet();. Selain itu, sisanya dapat golfed ke: 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;. Jawaban yang bagus tetap, jadi +1 dari saya. :)
Kevin Cruijssen
1
Disimpan 2 byte lebih banyak menggunakan Stackdaripada HashSet. Jauh lebih lambat tapi berhasil!
Daniel Widdis
1
O(n)O(nn)
2
Anda masih dapat golf hingga 126 byte dengan golf kedua yang saya sarankan di komentar pertama saya. :)
Kevin Cruijssen
2
98 byte .
Olivier Grégoire
2

Python 2 , 81 byte

Pengindeksan berbasis 1

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

Cobalah online!


Python 2 , 79 byte

Ini membutuhkan banyak waktu (9999 tidak selesai setelah berjalan secara lokal selama 7 menit)

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

Cobalah online!

ovs
sumber
1
Input maksimum 32767 tidak didukung (kedalaman rekursi default tidak bergantung pada sistem).
Erik the Outgolfer
Bahkan test case yang diberikan 9999 tidak didukung. :)
Daniel Widdis
@EriktheOutgolfer Mengubahnya menjadi pendekatan berulang, mungkin masih belum selesai tepat waktu di TIO, tetapi berjalan secara lokal dengan baik.
Ov
@ovs Oh, timeout saja tidak masalah.
Erik the Outgolfer
Keren! Saya baru saja mencobanya untuk n = 9999 dan berhasil diselesaikan setelah sekitar satu jam. +1. Yay! ;-)
agtoever
1

Arang , 65 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⁰θ

Inisialisasi hasilnya ke 0.

FN«

nWaktu loop .

⊞υθ

Simpan hasil sebelumnya sehingga kami tidak menggunakannya lagi.

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

Temukan bit tertinggi di hasil sebelumnya.

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

Sementara bit itu lebih besar dari 1, jika bit tersebut diatur dalam hasil sebelumnya, coba kurangi bit itu untuk melihat apakah hasilnya adalah hasil yang tidak terlihat. Ini memastikan bahwa hasil potensial dicoba dalam urutan nilai naik.

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

Sekarang coba XORing bit itu dengan hasil sebelumnya, gandakan bit sampai hasil yang tidak terlihat ditemukan. Ini menangani kasus-kasus ketika sedikit perlu diatur, lagi dalam urutan nilai naik, tetapi juga kasus ketika bit paling signifikan perlu diaktifkan, yang loop sebelumnya tidak repot-repot untuk menguji (karena golfier untuk menguji itu disini). Jika loop sebelumnya menemukan hasil yang tidak terlihat maka loop ini tidak pernah berjalan; jika tidak maka loop ini akan sia-sia menguji kembali hasil tersebut.

≔⁻|θη&θηθ

Perbarui hasilnya dengan benar-benar XORing sedikit dengan itu.

»Iθ

Keluarkan hasil akhir di akhir loop.

Neil
sumber
1

05AB1E , 21 20 18 byte

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

Cukup tidak efisien, jadi semakin besar input, semakin lama waktu yang dibutuhkan untuk mendapatkan hasilnya. Apakah bekerja untuk input 0juga.

Coba online atau verifikasi dulunistilah .

Penjelasan:

Î                # 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)
Kevin Cruijssen
sumber
1

Haskell , 101 byte

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

Cobalah online!

Tampaknya memalukan untuk melakukan impor hanya untuk xor, tetapi saya belum menemukan solusi yang baik. Saya juga bertanya-tanya apakah ada cara yang lebih baik untuk mengekspresikan loop.

dfeuer
sumber
0

R , 90 byte

function(n){A=1
while(sum(A|1)<n)A=c(min((x=bitwXor(A[1],2^(0:30)))[x>0&!x%in%A]),A)
A[1]}

Cobalah online!

Giuseppe
sumber