Ubah Kode, Ubah Urutan: Perampok

15

Ini adalah tantangan . Untuk utas polisi, buka di sini .

Tantangan ini melibatkan dua sekuens OEIS yang dipilih oleh polisi - S 1 , S 2 - dan seberapa baik sekuens-sekuens tersebut dapat di-golf dan dikaburkan.

Polisi sedang membangun kode A yang menghasilkan S 1 dan memberikan angka X yang mereka klaim adalah jarak Levenshtein terbaik (dalam karakter) untuk membuat B yang menghasilkan S 2 .

Tantangan Perampok

Untuk memecahkan pengajuan polisi tertentu, perampok harus membuat program C dalam bahasa yang sama (dan versi) karena jawaban yang menghasilkan S 2 (n) dan karakter Y berubah dari A (dengan Y <= X). Perampok tidak perlu menemukan kode B yang sama persis dengan yang dihasilkan oleh polisi (secara diam-diam). Pengajuan para perampok harus mematuhi indeks-0 atau indeks-1 yang sama seperti yang ditentukan oleh pengajuan polisi.

Jika Anda mengelola ini, posting jawaban dengan solusi, tautkan ke jawaban polisi, dan tinggalkan komentar pada jawaban polisi yang menghubungkan kembali ke jawaban Anda.

Setiap jawaban polisi hanya dapat di-crack satu kali, dan tentu saja, Anda tidak diizinkan untuk memecahkan jawaban Anda sendiri. Jika jawaban polisi ternyata tidak valid sebelum atau setelah retak, itu tidak dihitung terhadap skor perampok.

Menang dan Mencetak Gol

Perampok dicetak oleh (X - Y)*5 + 5 untuk setiap retakan mereka, dan perampok dengan skor keseluruhan tertinggi menang.

Aturan selanjutnya

  • Anda tidak boleh menggunakan built-in apa pun untuk hashing, enkripsi, atau pembuatan nomor acak (bahkan jika Anda menyemai generator nomor acak ke nilai tetap).
  • Program atau fungsi diizinkan, tetapi kode tidak boleh berupa cuplikan dan Anda tidak boleh menganggap lingkungan REPL.
  • Anda dapat mengambil input dan memberikan output dalam format apa pun yang nyaman . Metode input / output harus sama untuk kedua urutan.
  • Kalkulator definitif untuk jarak Levenshtein untuk tantangan ini adalah yang ini di Planet Calc.
  • Selain menjadi tantangan CnR, ini adalah sehingga semua aturan golf biasa berlaku.
AdmBorkBork
sumber

Jawaban:

7

Pyke, Levenshtein jarak 1, A036487 , A135628 - skor 5

Crack dari suatu entri dengan muddyfish

wX*e

Coba di sini!

Kode asli X*e,, kuadrat input X,, dikalikan dengan input *, dan membagi dua kemudian lantai hasil,e ,.

Kuncinya adalah bahwa 'X'56 di representasi basis 96 w, jadi wXhasilkan 56, kalikan dengan input lalu turunkan dan belah dua dan Anda mendapatkan 28 kali input sesuai kebutuhan.

Jonathan Allan
sumber
Persis seperti yang saya miliki. Berlangsung sedikit lebih lama dari yang saya harapkan
Blue
Begitu saya melihatnya, saya tahu itu adalah solusi yang dimaksudkan.
Jonathan Allan
4

Brain-Flak , 28 byte, Jarak 4, A002817 , A090809

(({(({})[()])}{}){{({}[()])}{}})

Jawaban ini ditemukan dengan bantuan brute-forcer, yang menghasilkan 35.000 program yang mungkin (banyak di antaranya tidak seimbang, dan dengan demikian kode antipeluru otak tidak valid, tetapi saya tetap menggunakan bug dan menemukan jawabannya). Ini adalah sekitar program 20 ribu diuji, dan butuh sekitar satu jam untuk menemukan (meskipun saya tidak tahu persis berapa lama sejak saya pergi ketika selesai).

Saya agak tidak ingin mengirim jawaban ini, karena saya belum memiliki pemahaman penuh tentang cara kerja program ini. Namun, jawabannya sudah aman jadi saya tidak ingin kedaluwarsa. Saya berharap untuk memperbarui jawaban ini lebih banyak setelah saya sepenuhnya memahaminya, serta memposting kode yang saya gunakan untuk menemukan jawaban ini. Tetapi untuk sekarang, saya hanya akan memposting penjelasan parsial.

#Push the sum of:
(

    #The (n-1)th triangular number, and the range [1, n] (The range doesn't count towards the sum I believe)
    ({(({})[()])}{})

    #Triangulate every number on the stack
    {{({}[()])}{}}

)

Ini masuk akal karena OEIS menyatakan:

Untuk n> 0, ketentuan urutan ini terkait dengan A000124 dengan a (n) = jumlah (i * A000124 (i), i = 0..n-1). [Bruno Berselli, 20 Des 2013]

Dan A000124 adalah angka segitiga + 1. Namun, saya tidak tahu persis apa itu forumla, jadi saya tidak bisa sepenuhnya menjelaskan cara kerjanya.

DJMcMayhem
sumber
3

Perl 6, 19 byte, X = 1, A000045 → A000035

{(0,1,*+<*...*)[$_]}

+>di tempat +<juga akan bekerja.

Cobalah online!

Bagaimana itu bekerja

infix ... cukup berguna untuk urutan rekursif sederhana. Bagian (0,1,*+*...*)dari kode asli, yang merupakan singkatan untuk

(0, 1, -> $x, $y { $x + $y } ... *)

menentukan urutan yang dimulai dengan 0 dan 1 , lalu menambahkan item dengan menghitung jumlah dari dua item sebelumnya dari urutan.

Sebaliknya, (0,1,*+<*...*)gunakan bit-shift kiri ( +>, bit-shift kanan juga berfungsi) untuk membangun urutan paritas. Karena menggeser 1 nol unit ke kiri adalah 1 , dan menggeser 0 satu unit ke kiri adalah 0 , kita mendapatkan pola bolak-balik satu dan nol yang diinginkan.

Dennis
sumber
2

Perl 6 , 10 byte, jarak 1 - skor 5

Retak entri oleh seseorang

*[0]o 1***

Menjadi:

*[0]o 1*+*

Cobalah secara Online!

Jonathan Allan
sumber
Kerja bagus! Saya tidak memikirkan solusi ini, milik saya sedikit lebih rumit dan sebenarnya mengharuskan *[0]o untuk berada di sana. Saya kira itu berarti saya bisa datang dengan tantangan lain berdasarkan "trik" saya ... :)
smls
Saya tidak benar-benar tahu Perl, hanya melihat ***dan berpikir sepertinya bisa membuka operasi perkalian diad *, dengan argumen sebelumnya, saya benar-benar tidak tahu apa kode sebenarnya. Jangan ragu untuk mengedit dalam beberapa penjelasan!
Jonathan Allan
2
1***diuraikan sebagai 1 ** *, yaitu lambda yang melakukan "1 pangkat x". 1*+*diuraikan sebagai 1 * (+*), yaitu lambda yang melakukan "1 dikalikan dengan (x dikonversi ke angka)".
smls
2

Perl 6 , jarak 2, smls

Asli:

+(*%%2)

Retak:

+(*+0%2)

Cobalah online!

Joey Marianer
sumber
Sial, sekali lagi solusi sederhana yang tidak saya pertimbangkan ... (Milik saya jauh lebih dikaburkan +(^*Z%2). Saya kira saya tidak pandai merancang tantangan ini.
smls
2

WolframAlpha, Jarak 1, Greg Martin , A002378 , A000537

(sum1to#of n^1)^2&

Bagaimana itu bekerja

Saya menyadari bahwa yang menarik, (n * (n + 1) / 2) ^ 2 adalah formula untuk urutan kedua. Karena jumlah (1 ke n) sama dengan n * (n + 1) / 2, saya hanya perlu mengganti * ke a ^.

pecandu matematika
sumber
Anda harus memberi tahu dia bahwa Anda telah memecahkan jawabannya
Post Rock Garf Hunter
Terlihat dengan baik! :)
Greg Martin
2

Brain-Flak , 20 byte, DJMcMayhem

({({})({}[()])()}{})

Cobalah online!

Menambahkan a ({})di awal loop untuk menggandakan nilai di setiap iterasi.

Martin Ender
sumber
Bagus! FWIW, solusi 18 byte yang saya miliki adalah({(({}[()])){}}{})
DJMcMayhem
1

JavaScript, Jarak 4, LliwTelracs

Asli:

f=x=>{return x?2*x-1+f(x-1):0}

Retak:

f=x=>{return x?2*(-0+f(x-1)):1}

Cobalah online!

Kritixi Lithos
sumber
1

JavaScript (ES6), Jarak 1, Lebih Lanjut

Asli:

as=function(){ return 2*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Retak:

as=function(){ return 0*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Cobalah online!

atau

as=function(){ return 2*1**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Cobalah secara Online!

Entah bagaimana saya bisa membuatnya berperilaku berbeda antara TIO dan repl.it (sama sekali tidak tahu mengapa 2 * 1 ^ ... akan sama dengan 0 sesuai dengan repl.it)

fəˈnɛtɪk
sumber
Aku terlalu bodoh, saya tidak berpikir tentang mengubah 2 ke 0. Berikut adalah fungsi B: as=function(){ return 2*2**((1^1)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}.
1

Jawa, Jarak 4, Peech , A094683 , A000290

Asli:

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%2==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)r:k;}

Retak:

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%1==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)n*n:k;}
                                                                                                                                                          ^                                                         ^^^

mengembalikan n * n

fəˈnɛtɪk
sumber
1

Javascript, Advancid , jarak 2, A059841 dan A000004

Hanya meninggalkan kode di belakang tautan TIO karena sepertinya akan merusak situs.

Berkat @nderscore, yang kodenya saya gunakan untuk mendekripsi kode awal

Ada beberapa kode yang berlebihan seperti menggunakan !! [] + [] + [] bukannya !! [] + [].

Penambahan! + [] - (! + []) (+ 1-1) awalnya mencegah dekripsi.

Cobalah secara Online

fəˈnɛtɪk
sumber
1

Pyke, Levenshtein jarak 2, A008788, A007526

'SS^

Coba di sini!

Bagaimana itu bekerja

Ini melakukan konversi basis campuran.

'Sambil input n dan terapkan, mendorong [1, ..., n] pada stack. Selanjutnya Smengambil input n dan mendorong array yang sama sekali lagi. 'tampaknya menyebabkan perintah berikutnya diterapkan ke atas sebelumnya di stack; Saya agak kabur pada detailnya.

Akhirnya, ^terapkan konversi basis campuran, jadi [1, ..., n] [1, ..., n] f menghitung
a (n): = [1] n + n + (n) (n-1) .. . + [n!] 1 di mana tanda kurung menunjukkan nilai tempat dan nomor di sebelah kanan digitnya.

Sekarang, a (n) = (1 + (1) (n-1) + (n-1) (n-2) (n-3) + ... + (n-1)!) N = n ( a (n) + 1) , yang merupakan rumus rekursif yang sama yang mendefinisikan a (n) dalam [A007526]. Karena jumlah kosong adalah nol, a (0) = 0 dan case dasar juga cocok.

Dennis
sumber
Bagaimana Anda mendapatkannya dengan begitu sedikit upaya? Saya tertarik dengan proses pemikiran Anda
Biru
Konversi base campuran adalah trik golf yang agak umum. Ini bukan pertama kalinya saya menggunakannya.
Dennis