Membiarkan f
menjadi fungsi yang memetakan bitfield ( {0 1}
) ukuran n+1
ke bitfield ukuran n
dengan menerapkan XOR
ke bit th i
dan i+1
th dan menulis hasilnya di bitfield baru.
Contoh: f("0101") = "111"
Perhitungan informal:
0 XOR 1 = 1
1 XOR 0 = 1
0 XOR 1 = 1
Membiarkan f_inverse
menjadi fungsi kebalikan dari f
. Karena kebalikannya tidak unik, f_inverse
mengembalikan satu solusi yang valid.
Input: bitfield sebagai string (yaitu "0101111101011"
) dan bilangan alami yang diberikank
Output: bitfield sebagai string, sehingga string berisi hasil jika f_inverse
diterapkan k
kali ke bitfield input. (yaitu f_inverse(f_inverse(f_inverse(input)))
)
Kriteria pemenang: Karakter paling sedikit
Bonus:
-25
Karakter jika f_inverse
tidak diterapkan secara rekursif / iteratif, sebagai gantinya string keluaran langsung dihitung
Naskah ujian:
a = "011001"
k = 3
def f(a):
k = len(a)
r = ""
for i in xrange(k-1):
r += str(int(a[i]) ^ int(a[i+1]))
return r
def iterate_f(a, k):
print "Input ", a
for i in xrange(k):
a = f(a)
print "Step " + str(i+1), a
iterate_f(a, k)
Anda dapat menempelkannya misalnya di sini dan kemudian mencobanya.
{0-1}
-Bitfield? Saya juga tidak mengerti definisif
, dari mana datangnyai
? Apa argumen kedua XOR? bagaimana kita mendapatkan111
dari0101
?i
?"0 XOR 1" = 1 "1 XOR 0" = 1 "0 XOR 1" = 1
tidak menjelaskan apa-apa: Saya tahu cara kerja XOR, tapi apa sebenarnya yang kita XORing dan di mana kita menyimpan hasilnya?f([a,b,c,d]) = [a^b, b^c, c^d]
. Dan dia ingin kebalikan dari fungsi itu, yaituf'([x,y,z]) = [a,b,c,d]
seperti yanga^b=x
,b^c=y
,c^d=z
.Jawaban:
Pyth,
3330 - 25 = 5 byteJalankan dengan masukan dari stdin like (juru bahasa online: https://pyth.herokuapp.com/ ):
dan hasilnya akan ditulis ke stdout.
Ini adalah terjemahan langsung dari:
Python 2,
12711879 - 25 = 54 byteSebut saja
i("111", 3)
, dan hasilnya akan ditulis ke stdout.Perhatikan bahwa kami berharap k tidak terlalu besar, karena untuk tujuan kode-golf loop internal akan berjalan untuk O (2 k ) kali.
Saya pikir kita biasanya menyebut operasi ini "xorshift" atau sesuatu. Jika kita menyatakan input sebagai bilangan bulat big-endian, maka fungsinya f hanyalah:
Jika kita menerapkan f dua kali, kita akan mendapatkan:
Namun menerapkan 3 kali akan memiliki pola yang berbeda:
Menerapkan 4 kali kembali ke bentuk dasar:
Dan seterusnya:
Perhatikan bahwa jika kita memilih 2 k yang cukup besar , maka (x ≫ 2 k ) = 0, artinya f 2 k (x) = x, dan kebalikannya adalah fungsi identitas yang sepele!
Jadi strategi untuk menemukan f- k (x) tanpa memanggil f -1 (x) sama sekali adalah:
Temukan K sedemikian rupa sehingga:
Ekspresikan f -k (x) = f -K + (Kk) (x) = f -K (f K-k (x)) = f K-k (x)
Jadi, hasilnya
f
disebut kali Kk25 untung laba: p
Pembaruan 1 : Digunakan representasi oktal bukan biner sehingga kita bisa menggunakan
%
format untuk menyimpan banyak byte.Pembaruan 2 : Memanfaatkan struktur periodik
f
. Menghentikan versi iteratif karena versi yang tidak iteratif lebih pendek bahkan tanpa bonus -25 byte.Pembaruan 3 : Mengurangi 3 byte dari Pyth, terima kasih isaacg!
sumber
Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ
CJam,
1514 byteMengambil input seperti
Uji di sini.
Penjelasan
Hasilnya dicetak secara otomatis di akhir program.
Saya katakan "string / array", karena saya mulai dengan string (yang hanya array karakter), tapi saya tetap mengambil XOR di antara mereka dan di antara angka juga.
Character Character ^
memberikan integer (berdasarkan XOR dari titik kode),Character Integer ^
danInteger Character ^
memberikan karakter (berdasarkan XOR dari angka dengan titik kode - diartikan sebagai titik kode). DanInteger Integer ^
tentu saja hanya memberikan bilangan bulat.Jadi jenisnya terbang di semua tempat, tapi untungnya, setiap kali saya memiliki bilangan bulat itu baik
0
atau1
dan setiap kali saya memiliki karakter itu baik'0
dan'1
dan hasilnya selalu yang diinginkan (dalam jenis apa pun). Karena string hanyalah array karakter, pencampuran karakter dengan angka bukanlah masalah sama sekali. Dan pada akhirnya, ketika semuanya dicetak, karakter tidak mendapatkan pembatas khusus, sehingga output tidak terpengaruh oleh bit yang direpresentasikan sebagai angka atau karakter.sumber
J, 17 karakter
Selalu menggunakan 0 sebagai digit terdepan.
Mulai dari status 128 1 baris atas (kiri) dan status acak (kanan), menampilkan 128 digit terakhir melalui 129 iterasi pertama.
sumber
APL 11
Penjelasan:
Coba di tryapl.org
sumber
≠\
tidak akan berhasil2|+\
?((0,≠\)⍣⎕)⎕
saya mendapatkan token yang tidak valid. Tryapl tidak dapat menangani input?CJam, 25 - 25 = 0 byte
Ini hanyalah port CJam langsung dari jawaban GolfScript di bawah ini, karena, setelah membaca jawaban Martin Büttner , saya menyadari bahwa saya bisa menghemat satu byte karena penanganan CJam pada tipe integer dan karakter. (Pada dasarnya, CJam tidak perlu
1&
digunakan untuk memaksa karakter ASCII menjadi bit dalam kode GolfScript, tetapi memang membutuhkan prependedq
untuk membaca input.) Saya biasanya akan menganggap port sepele seperti trik murah, tetapi mencapai skor nol dibuat itu IMO berharga.Bagaimanapun, program ini bekerja persis seperti program GolfScript asli di bawah ini, jadi silakan merujuk ke deskripsi dan instruksi penggunaannya. Seperti biasa, Anda dapat menguji versi CJam menggunakan penerjemah online ini .
GolfScript, 26 - 25 = 1 byte
Solusi ini hanya diulang pada input string sekali saja, jadi saya yakin ini memenuhi syarat untuk bonus −25 byte. Ini bekerja dengan secara internal memelihara k array elemen yang menyimpan bit saat ini dari setiap pre-iterates k .
Input harus diberikan melalui stdin, dalam format
"1111111" 3
, yaitu sebagai string0
dan1
karakter yang , diikuti oleh angka k . Output akan menjadi stdout, sebagai bitstring tanpa tanda kutip.Uji kode ini secara online.(Jika program habis, coba jalankan kembali; server Web GolfScript terkenal karena waktu habis secara acak.)
Inilah versi yang diperluas dari program ini, dengan komentar:
Pada dasarnya, seperti kebanyakan solusi berulang, kode ini dapat dipahami sebagai penerapan perulangan
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
di mana b 0, j adalah bit input ke- j (untuk j ≥ 1), b k , j adalah bit keluaran ke- j , dan b i , 0 = 0 dengan asumsi. Perbedaannya adalah bahwa, sedangkan solusi iteratif, pada dasarnya, menghitung perulangan "baris demi baris" (yaitu pertama b 1, j untuk semua j , kemudian b 2, j , dll.), Solusi ini malah menghitungnya "kolom oleh kolom "(atau, lebih tepatnya," diagonal demi diagonal "), komputasi pertama b b i , i +1 i , i untuk 1 ≤ ≤ k , lalu i, lalu b i , i +2 , dll.
Satu keuntungan (teoretis) dari pendekatan ini adalah bahwa, pada prinsipnya, metode ini dapat memproses string input panjang yang sewenang-wenang hanya dengan menggunakan penyimpanan O ( k ). Tentu saja, interpreter GolfScript secara otomatis membaca semua input ke dalam memori sebelum menjalankan program, kebanyakan meniadakan keuntungan ini.
sumber
Python,
9478Akan dieksekusi setidaknya sekali dan dengan demikian memberikan hasil yang sama untuk
n=0
dann=1
Versi lama yang mengubah string menjadi array numerik dan "mengintegrasikan" modulo 2
sumber
Python 2, 68
Solusi yang sangat recusive. Lebih mudah dipahami jika dipecah menjadi dua fungsi
di mana
f
menghitung perbedaan berturut-turut dang
menyusunf
dengan sendirinya n kali.Fungsi
f
menghitung jumlah XOR kumulatifl
, yang merupakan operasi terbalik untuk perbedaan XOR berturut-turut. Karena input diberikan sebagai string, kita perlu mengekstraksiint(l[0])
, tetapi melakukannya lebih pendek dengan perbandingan stringl>='1'
.Python 2, 69
Solusi berulang menggunakan
exec
loop ternyata 1 char lebih lama.Mungkin ada cara yang lebih pendek untuk menangani string. Jika kita bisa memiliki input / output menjadi daftar angka, itu akan menghemat 5 karakter
sumber
Perl 5, 34
Parameter yang diberikan pada input standar dipisahkan oleh spasi.
sumber
Javascript ES6, 47 karakter
Omong-omong, tidak ada efek samping :)
sumber
C # -
178161115 karakterTidak diikat dengan tali kekang
sumber
CJam, 20 byte
Inputnya seperti
"111" 3
Cobalah online di sini
sumber