Ini adalah tantangan Polisi dan Perampok. Ini adalah utas perampok. The benang polisi di sini .
Polisi akan memilih urutan apa pun dari OEIS , dan menulis program p yang mencetak bilangan bulat pertama dari urutan itu. Mereka juga akan menemukan beberapa string yang s . Jika Anda memasukkan s di suatu tempat ke p , program ini harus mencetak bilangan bulat kedua dari urutan. Jika Anda memasukkan s + s ke lokasi yang sama di p , program ini harus mencetak bilangan bulat ketiga dari urutan. s + s + s di lokasi yang sama akan mencetak yang keempat, dan seterusnya dan seterusnya. Ini sebuah contoh:
Python 3, urutan A000027
print(1)
String tersembunyi adalah dua byte .
Untaiannya adalah +1
, karena program print(1+1)
akan mencetak bilangan bulat kedua di A000027, program print(1+1+1)
akan mencetak bilangan bulat ketiga, dll.
Polisi harus mengungkapkan urutan, p program asli , dan panjang string yang tersembunyi s . Perampok memecahkan kiriman dengan menemukan string apa pun hingga panjang itu dan lokasi untuk memasukkannya untuk membuat urutan. String tidak perlu cocok dengan solusi yang dimaksudkan untuk menjadi celah yang valid, juga tidak lokasi di mana dimasukkan.
Jika Anda memecahkan salah satu jawaban polisi, posting solusi Anda (dengan string dan lokasi tersembunyi terungkap) dan tautan ke jawabannya. Kemudian komentari jawaban polisi dengan tautan ke celah Anda di sini.
Aturan
Solusi Anda harus berfungsi untuk nomor apa pun dalam urutan, atau setidaknya hingga batas yang wajar jika gagal karena batasan memori, integer / stack overflow, dll.
Perampok yang menang adalah pengguna yang memecahkan sebagian besar pengiriman, dengan tiebreak yang mencapai jumlah celah pertama.
Polisi menang adalah polisi dengan string terpendek s yang tak retak. Tiebreak adalah terpendek p . Jika tidak ada pengiriman yang tidak terputus, polisi yang memiliki solusi tidak terpecahkan untuk kemenangan terlama.
Agar dinyatakan aman, solusi Anda harus tetap tidak retak selama 1 minggu dan kemudian memiliki string tersembunyi (dan lokasi untuk memasukkannya) terungkap.
s mungkin tidak bersarang, itu harus digabungkan ujung ke ujung. Sebagai contoh, jika s adalah
10
, setiap iterasi akan pergi10, 1010, 101010, 10101010...
daripada10, 1100, 111000, 11110000...
Semua solusi kriptografi (misalnya, memeriksa hash dari substring) dilarang.
Jika s berisi karakter non-ASCII, Anda juga harus menentukan penyandian yang digunakan.
sumber
%
rekan kiri itu.Brain-Flak , A000984 oleh Nitrodon
Ini hanya 30 byte, tidak yakin apa yang ada dalam benak Nitrodon.
Cobalah online!
Penjelasan
Saya mencoba banyak hal tetapi inilah yang berhasil. Istilah A000984 adalah elemen utama dari segitiga Pascal.
Sekarang saya tahu bahwa saya bisa mendapatkannya dengan menjumlahkan diagonal di atas mereka:
Sebagai contoh:
Dan karena tindakan terakhir dalam program Nitrodon adalah untuk meringkas semua ini tampak seperti kandidat yang baik (lebih seperti saya mencoba banyak hal tetapi yang ini akhirnya berhasil).
Jadi kami menginginkan program yang mengambil satu jumlah parsial dan menghasilkan yang berikutnya. Untungnya ada cara yang cukup rapi untuk beralih dari yang satu ke yang berikutnya. Setiap baris adalah delta dari baris berikutnya. Itu adalahn th istilah berturut-turut adalah perbedaan antara n th dan n - 1 th istilah dalam baris berikutnya.
Masalahnya adalah kita tidak memiliki cukup baris terakhir untuk menghitung baris yang kita inginkan. Karena setiap baris lebih panjang daripada yang terakhir jika kita memiliki baris, kita tidak bisa mendapatkan anggota terakhir dari baris berikutnya dengan metode ini. Namun di sini kita memiliki trik lain, anggota terakhir dari setiap baris sama dengan semua anggota sebelumnya dari baris itu!
Dan jika Anda terbiasa dengan Brain-Flak yang seharusnya mencuat Anda sebagai sesuatu yang akan sangat mudah dilakukan.
Sekarang untuk kode:
Untuk memulai kita lakukan perhitungan baris berikutnya di mana setiap anggota baru adalah jumlah dari dua anggota lama yang berdekatan. Itu bisa dilakukan dengan:
Yang pada dasarnya memindahkan elemen dan menambahkan (tanpa penghapusan) apa yang sudah ada di atasnya. Namun ini membalikkan semuanya jadi untuk kali berikutnya kita mendapatkan baris kita harus mengembalikannya.
Sekarang kita perlu menghitung anggota baris terakhir. Seperti yang saya katakan sebelumnya ini sangat mudah. Karena kami memiliki loop di atas semua elemen baris, kami bisa mengambil jumlah itu dan mendorongnya. Kami mendorongnya sebelum loop kedua sehingga berakhir di bagian bawah.
Dan itu saja.
sumber
Brain-Flak, A000290 , oleh Sriotchilism O'Zaic
Asli:
Retak:
Cobalah online!
Kalau tidak:
Cobalah online!
sumber
MATL , urutan A005206 oleh Luis Mendo
Asli:
Cobalah online!
Retak:
Saya bukan ahli MATL, tetapi dari apa yang saya mengerti, dokumen asli
voOdoO
membuat dua array kosong dan sebuah array[0]
di stack. inilah[0]
yang dicetak tanpa tanda kurung sebagai elemen pertama dari urutan. Retak / solusi kemudian melakukan hal berikut:d
mengambil elemen dari stack dan (dengan asumsi itu angka atau array ukuran 1) mengubahnya menjadi array kosong. Array kosong ini tidak bisa dicetak, tetapi berkontribusi pada ukuran tumpukanNq
menghitung ukuran tumpukan dan mengurangi satu. Ini adalahn+1
istilah ketika mengevaluasi fungsi (karena dimulai pada 2 dan meningkat satu iterasi setiap karenad
menambahkan hal-hal yang tidak terlihat ke stack)17L
ini adalah konstantaPhi = (1+sqrt(5))/2
/k
ini melakukanfloor((n+1)/Phi)
yang merupakan salah satu formula yang menghitung unsur-unsur urutan. Formula ini terdaftar di OEISa(n) = floor(sigma*(n+1)) where sigma = (sqrt(5)-1)/2
kecuali kami menggunakan identitas(sqrt(5)-1)/2 = 1/Phi
sumber
\N17L/k&
(perhatikan dua penggunaan berbeda&
di tengah dan di akhir kode), tetapi solusi Anda lebih sederhana dan lebih anggunPython 3 - A__
Cobalah online!
100 botol bir, tambahkan
-1
untuk mendapatkan nomor berikutnya99
, dll.sumber
-1
saja. Saya akan membuatnya lebih eksplisit.Tong , urutan A000045 , oleh A__
Asli:
Retak:
Perhatikan bahwa tantangannya adalah menemukan substring panjang <= 6, tetapi string yang ditemukan memiliki panjang 5.
Definisi perintah untuk mereka yang terlalu malas untuk mencari spesifikasi Tong:
0
dan1
mendorong nomor masing-masing ke tumpukan;"
memindahkan tumpukan bagian atas ke bagian bawah tumpukan (roll);&
muncul tumpukan bagian atas ke register jika kosong, jika tidak mengosongkan register ke tumpukan;+
menambahkan dua nilai tumpukan teratas.Awal
1"
hanya menyisipkan 1 di bagian bawah tumpukan. Daftar 1 yang terus bertambah ini hanya berperan dalam iterasi pertama, di mana ia memungkinkan kita untuk menganggap tumpukan dimulai sebagai1 0
bukan hanya0
. Memang, program10:&+.
, di mana:&+
bagian itu diulang, memiliki perilaku yang sama persis dengan solusi di atas, kecuali bahwa ia tidak memiliki daftar 1 yang tumbuh di bagian bawah.Karena
&
digunakan hanya sekali di bagian berulang dan memiliki perilaku bergantian, perilaku1":&+
tergantung pada paritas iterasi.Sekarang, program ini tidak benar-benar mencetak urutan Fibonacci yang dimulai dengan 0, 1 dari awal; sebenarnya mencetak urutan Fibonacci 1, 0 dari tempat kedua, yaitu dari angka 0. (Ini menghasilkan urutan yang sama.) Mengetahui hal ini, program ini mudah dianalisis:
[a, b]
dan berakhir sebagaia+b (&=b)
.[b] (&=a)
dan berakhir sebagai[b, b+a]
.Ini memang menghitung urutan yang diperlukan.
sumber
:
perintah di awal string.Java 8+, urutan A010686 oleh Benjamin Urquhart
sumber
Brain-Flak, A000578 oleh Sriotchilism O'Zaic
Asli:
Cobalah online!
Retak:
Cobalah online!
sumber
Pyret , urutan A083420 , oleh MLavrentyev
Anda dapat menjalankannya di sini, tetapi saya belum menemukan cara menautkan ke kode. Anda harus menyalin-menempel.
Fungsi yang disediakan mengabaikan argumen kedua. Ini menggandakan yang pertama dan menambahkan satu, yang akan menghasilkan
2^n - 1
urutan yang diperlukan diperlukan di sini — yang perlu saya lakukan adalah mengatakan berapa kali untuk melakukan operasi itu, dilakukan dengan mengubah panjang daftar yang dilipat. Untungnya, Pyret tidak mengeluh tentang koma yang tertinggal itu.sumber
Python 3 , urut A268575 oleh NieDzejkob
Asli:
Retak (100 byte):
Cobalah online!
Dari apa yang saya dapat kumpulkan, kode asli menyiapkan definisi untuk membuat string tersembunyi disingkat mungkin dan kemudian mendefinisikan pola awal Game of Life. String tersembunyi kemudian setara dengan menulis iterasi Game Kehidupan Conway dalam 102 byte.
Untuk keperluan crack ini,
S
adalah fungsi yang menjumlahkan elemen-elemen dalam argumennya (yang merupakan iterables) danF
menerapkan fungsi yang mengembalikan iterable ke setiap elemen daftar dan menghancurkan semua hasil bersama-sama.;A=-1,1,0;
mengakhiri pernyataan sebelumnya dan menyingkat tupel (-1,1,0) dengan A, yang digunakan sebagaiproduct(A,A)
yang memberikan semua tetangga relatif terhadap sel yang diberikan serta sel itu sendiri.*X,=F(lambda a:(S(a,x)for x in product(A,A)),W);
membuat daftar baru yangX
menampung semua tetangga selW
dan sel dalamW
diri mereka sendiri dengan menambahkan posisi relatif tetangga ke setiap sel dan menghancurkannya bersama menjadi daftar.W={p for p in X if 2<X.count(p)<4+({p}<W)}
X
memeriksa daftar ini dan menentukan apakah masing-masing sel dalamX
termasuk dalam set sel dalam iterasi berikutnya. Ini diambil hampir kata demi kata dari golf Game of Life ini .sumber
Haskell, A014675 oleh Khuldraeseth na'Barya
Kode asli
Dengan substring
Cobalah online!
sumber
flip take[1,2]
bukannya lambda batin itu. Kalau tidak identik.(`take`[2,1])
bahkan satu byte lebih pendek(`take`)
bertemu kesalahan kompilasi, jadi saya pikir(`take`[2,1])
juga. :(Kalkulator Desktop, A006125 , oleh A__
Asli:
Retak:
Cobalah online!
Implementasi langsung.
sumber
Sa2Lad1-*2/^
, siapa tahu ada yang bertanya tentang itu.cQuents , urutan A003617 oleh Stephen
Cobalah online!
Mulailah dengan angka n + 1 digit terendah, yang diikuti oleh n nol. Yang
#2
menentukan bahwa hanya istilah kedua dari urutan, yang merupakan definisi urutan yang diterapkan satu kali untuk benih, akan dicetak; definisi urutan ini hanya menemukan dan mengembalikan prime berikutnya.sumber
Python 3 - agtoever
Cobalah online!
sumber
MATL , urutan A000796 oleh Luis Mendo
Asli:
Cobalah online!
Retak:
Penulis asli secara diam-diam menciptakan array
[-7:-1]
dan kemudian mengekstraksi dan meniadakan elemen pertama untuk mendapatkannya7
. Dia kemudian menggunakannya untuk mendapatkan digit pi ke-7 yang bulat (yang merupakan3
) dan menyajikannya sebagai digit pertama dari pi. Menambahkan menambahkan|SQ
membuat array asli semuanya positif, mengurutkannya, dan menambahkan satu ke semuanya. Ini berarti bahwa setelah semuanya bukannya mendapatkan indeks7
itu mendapatkan indeks-2
setelah satu aplikasi,-3
setelah dua aplikasi, dan seterusnya. Ini-
penting karena memberitahuY$
fungsi untuk tidak membulatkan angka.sumber
Keempat (gforth) , A000042 , oleh NieDzejkob
Cobalah online!
1-byter yang sepele hanya memperluas literal. Masalahnya adalah, itu meluap 64 bit sedini digit kesembilan. Perbaikan yang mudah adalah dengan mencetak satu digit berulang kali, bukan? Ya, tapi itu tidak semudah itu. Meskipun menempel
1 .
ke ujung memang akan mencetak angka tambahan yang kami butuhkan, mereka akan dipisahkan oleh spasi. Itu tidak akan berhasil.Sekarang, menurut Wikipedia, "
.(
(dot-paren) adalah kata langsung yang mem-parsing string yang dibatasi tanda kurung dan menampilkannya." Untungnya, tampilan itu tidak memiliki karakter aneh lainnya, jadi menggunakan.(
untuk mencetak satu 1 sudah cukup. Dan itu benar. Tidak diperlukan spasi setelah paren dekat, jadi lima karakter ini (ada spasi setelah paren terbuka) dapat diulang sesuai dengan isi hati kami. Untuk menunjukkan, saya telah memasukkan dalam TIO contoh yang akan meluap int 64-bit beberapa kali lipat. Bekerja seperti pesona.sumber
Unefunge-98 (PyFunge) , urutan A000108 , oleh NieDzejkob
Cobalah online!
Diulang enam kali
Dua byte untuk cadangan dari sembilan belas diizinkan! Apa yang tampak sebagai spasi sebenarnya adalah 0x01 karakter Start Of Header.
Penjelasan:
Tantangan ini adalah tentang menghasilkan
a(n)
daria(n-1)
dan mungkinn
. OEIS menyediakan rumus eksplisita(n) = (2n)!/(n!(n+1)!)
, yang cukup mudah dikonversia(n) = a(n-1) * (4n-6) / n
. Sekarang untuk mengimplementasikan ini di Funge.Saya harus memasukkan kode antara
1
dan.
. Itu setengah dari teka-teki yang sudah dilakukan. Yang tersisa hanyalah kode apa yang akan dimasukkan? Funge terutama kurang dalam alat manipulasi tumpukan, sehingga bagian bawah tumpukan tidak dibatasi; Saya perlu melacak keduanyan
dana(n)
tanpa menumbuhkan tumpukan. Dan bagaimana lebih baik melakukannya daripada dengan ruang Funge?Karakter 0x01 itu adalah counter saya
n
. Saya tetapa(n)
di stack, karena harus di stack setelah bit saya selesai dieksekusi.sumber
Python 3 , A008574 oleh tsh
Cobalah online!
sumber
V, A000290 , oleh DJMcMayhem
menghasilkan kuadrat dari 1.
Cobalah online!
Basis
é*
memasukkan*
danØ.
menghitung jumlah karakter non-baris baru di seluruh buffer. PenyisipanÄ
menduplikasi baris teratas ke barisnya sendiri, yang2é*
disisipkan**
. Rangkaian penyisipan menghasilkan angka ganjil berturut-turut dengan yang terbesar di atas. Yang terakhirØ.
berlaku menjumlahkan n angka ganjil pertama, karenanya menghasilkan kuadrat ke-n.sumber
ÄÎé*<CR>
AsciiDots , urutan A019523 oleh Alion
Sekali!
Dua kali!
Sepuluh kali!
Ketika mencoba mencari tahu bagaimana kode / bahasa bekerja, saya belajar bahwa dua baris pertama dari kode yang ada melakukan semua pekerjaan menghasilkan urutan Fibonacci tanpa batas. Kode berakhir ketika titik apa pun mengenai
&
, jadi saya hanya perlu menambahkan penundaan lebih lanjut di baris yang tersisa untuk memungkinkan jumlah entri yang sesuai untuk output.Setelah beberapa percobaan, kesalahan, dan pengamatan, saya menemukan bahwa interval penundaan yang benar adalah 16 unit waktu per angka. Memasukkan karakter yang cukup dalam satu baris sepertinya tidak mungkin, jadi saya harus meletakkan penundaan dalam 2 baris, meninggalkan 10 karakter untuk penundaan yang sebenarnya. Agar pola cocok dengan dirinya sendiri, kedua baris harus memiliki 5 karakter, dan karena tiga karakter tengah berturut-turut dapat dilalui dua kali, ini memberikan 16 unit waktu yang diinginkan.
Persyaratan untuk mencocokkan ini dengan yang ada
&
di kolom kedelapan sepertinya membuat ini tidak mungkin, sampai saya menyadari bahwa saya bisa mulai dengan baris baru di bagian dalam baris ketiga. Ini membuat baris kedua dari belakang panjang yang tepat, dan menghilangkan ujung baris ketiga yang sekarang-redundan.sumber
\v
/v>-----)
Brachylog , urutan A114018 oleh Unrelated String
Program asli:
String untuk disisipkan:
Cobalah online!
Penjelasan
Berikut adalah penjelasan pertama dari program aslinya (mengetahui bahwa urutan yang digunakan adalah "prime paling sedikit n-digit yang pembalikan digitnya juga prima")
Seperti yang Anda lihat, program ini cukup mudah kecuali untuk satu hal: ada yang sama sekali tidak berguna
b - behead
panggilan predikat yang , yang menghilangkan elemen pertama dari kebalikan dari nomor kami, yang dengannya kami tidak melakukan apa pun.Ini adalah petunjuk yang pasti tentang bagaimana kita dapat menemukan string. Idenya adalah bahwa, karena kita ingin menambah panjang angka dengan 1 digit setiap kali kita menambahkan string, kita membutuhkan string yang "mengevaluasi" panjang angka itu, menggunakan itu tidak berguna
b
.Solusinya adalah dengan menggunakan
ẹb
: pertama,ẹ - elements
akan mengubah angka menjadi daftar angka; lalu,b - behead
akan menghapus elemen pertamanya. Kuncinya adalah itub
akan gagal jika daftar digit kosong. Jadi setiap kali kita menambahkan ab
, kita akan menambah panjang angka yang dibutuhkan sebesar 1 (karena akan gagal sampai nilai yang ditentukan?
cukup tinggi untuk memuat cukup banyak digit sehingga angka terakhirb
diterapkan pada daftar satu digit).Pengaplikasian ulang
ẹ
setiap waktu tidak memiliki efek karena sudah merupakan daftar angka. Kita hanya perlu sekali di awal karena jika kita memenggal angka seperti9001
bukan daftar digit-nya, kita akan mendapatkan001 = 1
yang kehilangan informasi tentang jumlah digit.sumber
9001b1
masalah ini, sebenarnya hanya ternyata meskipunb
akan gagal jika daftar digit kosong, itu tidak akan gagal jika Anda tidak pernah benar-benar memiliki daftar, karena angka satu digit dipenggal ke 0, termasuk 0 sendiri .b
anehVDM-SL , A000312 , oleh Data Kedaluwarsa
Karena VDM-
let
SL'sexpressions dapat mengikat kembali variabel yang sudah terikat dalam lingkup terlampir,x**x
dapat dievaluasi secara sewenang-wenang bersarang dalam lingkup di manax
satu lebih dari dalam lingkup sebelumnya, sedangkan yang aslix
masih kurang dari kardinalitasm(1)
.sumber
If you insert s somewhere into p, this program must print the second integer from the sequence. If you insert s + s into the same location in p, this program must print the third integer from the sequence.
Perhatikan perilaku contohprint(1)
.++
untuk memetakan overrideHaskell, A083318 oleh xnor
Cobalah online!
sumber
show
.Haskell , A000045 (Fibonacci) , oleh transformasi Fourier milik Rin
Cobalah online!
Tepatnya 23 byte.
Yang ini menyenangkan dan sedikit rumit. 0 dan 1 terbalik membuat saya sedikit sebelum saya menyadari bahwa itu bukan masalah. Kurangnya
$
dalam aslinya membuat saya mencoba hal-hal samar seperti$...$id
(satu byte terlalu lama) sebelum saya sadar bahwa saya bisa membungkus semuanya dalam tanda kurung. Semua dalam semua, puzzle kecil yang bagus.H.PWiz menunjukkan bahwa pencocokan pola bisa menyelamatkan saya setidaknya lima byte:
$(\[x,y]->[y,x+y])
. Tantangan pointfree sialan itu membuat saya berpikir pointfree di mana-mana.sumber