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" .
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 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 .
Tugas
Diberikan input integer , output dalam format integer ( bukan dalam format biner).
didefinisikan sebagai bilangan bulat paling positif yang tidak terjadi sebelumnya dalam urutan sehingga dan berbeda hanya dalam satu bit ketika ditulis dalam biner.
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.
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.
- Standar I / O aturan berlaku.
- Celah default dilarang.
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang
Catatan akhir
Lihat pertanyaan PP&CG terkait (tetapi tidak sama):
JavaScript (ES6), 65 byte
1-diindeks.
Cobalah online!
Berkomentar
sumber
Jelly ,
2620 byteCobalah 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
Tautan utama
sumber
Java (JDK) ,
14213812412313213098 byteCobalah online!
sumber
import java.util.*;
+Set s=new HashSet();
untukvar 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. :)Stack
daripadaHashSet
. Jauh lebih lambat tapi berhasil!Python 2 , 81 byte
Pengindeksan berbasis 1
Cobalah online!
Python 2 , 79 byte
Ini membutuhkan banyak waktu (9999 tidak selesai setelah berjalan secara lokal selama 7 menit)
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 74 byte
Cobalah online!
sumber
APL (Dyalog Extended) , 46 byte
Cobalah online!
sumber
Arang , 65 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Inisialisasi hasilnya ke 0.
n
Waktu loop .Simpan hasil sebelumnya sehingga kami tidak menggunakannya lagi.
Temukan bit tertinggi di hasil sebelumnya.
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.
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.
Keluarkan hasil akhir di akhir loop.
sumber
05AB1E ,
212018 byteCukup tidak efisien, jadi semakin besar input, semakin lama waktu yang dibutuhkan untuk mendapatkan hasilnya. Apakah bekerja untuk input
0
juga.Coba online atau verifikasi dulun istilah .
Penjelasan:
sumber
Haskell , 101 byte
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.sumber
R , 90 byte
Cobalah online!
sumber