Ada beberapa tantangan yang melibatkan penggandaan kode sumber: di sini dan di sini . Tugas yang kami miliki di sini sedikit lebih sulit, tetapi harus dapat dilakukan di hampir setiap bahasa.
Dalam tantangan ini, Anda akan menerima bilangan bulat positif yang berubah-ubah. Program Anda harus menampilkan bilangan bulat itu dua kali lipat . Ketika kode sumber Anda digandakan, itu akan mengambil bilangan bulat positif, dan mengeluarkannya kuadrat .
Bagaimana kode sumber Anda digandakan? Nah, Anda bisa mendapatkannya dengan cara Anda . Artinya, Anda dapat membagi kode sumber Anda menjadi string byte atau karakter (atau token di langs tokenized) dari setiap sama panjang yang Anda inginkan , dan ulangi setiap potongan dua kali berturut-turut.
Untuk program awal ABCDEFGHIJKL
, (panjang 12) di sini adalah semua program yang mungkin digandakan:
Chunk length | Doubled source code
-------------+-------------------------
1 | AABBCCDDEEFFGGHHIIJJKKLL
2 | ABABCDCDEFEFGHGHIJIJKLKL
3 | ABCABCDEFDEFGHIGHIJKLJKL
4 | ABCDABCDEFGHEFGHIJKLIJKL
6 | ABCDEFABCDEFGHIJKLGHIJKL
12 | ABCDEFGHIJKLABCDEFGHIJKL
Perhatikan bahwa ini berarti program dengan panjang prime hanya dapat digandakan dua cara: setiap karakter digandakan, atau program penuh diulang dua kali.
Aturan:
- Kode harus merupakan program atau fungsi lengkap.
- Celah standar dilarang.
- Metode I / O standar diizinkan.
- Semua karakter / byte, termasuk spasi dan baris baru, dihitung dalam panjang kode dan berkontribusi pada potongan.
- Anda dapat mengasumsikan bahwa input dan kuadratnya dapat diwakili oleh tipe int / integer bahasa Anda.
- Anda tidak boleh menganggap baris baru atau karakter lain tertinggal.
- Berikan ukuran chunk Anda di pos setelah hitungan byte.
- Ini kode-golf , jadi program yang lebih pendek lebih baik! Jika dua program memiliki panjang yang sama, yang menggunakan panjang chunk yang lebih kecil akan menang. (Jika Anda memiliki program yang lebih panjang yang menggunakan panjang chunk yang lebih kecil, itu juga layak diposkan!)
- Jika program Anda membutuhkan input / jalur kedua, Anda tidak boleh membuat asumsi tentang nilainya. Secara khusus, program Anda harus bekerja jika input kedua kosong, sama dengan yang pertama, atau integer yang berbeda. Jika program Anda tidak membutuhkan input / saluran kedua, Anda dapat mengabaikan pembatasan ini.
sumber
.0
di akhir)?5 -> 10
; kode ganda:5 -> 25 25
.Jawaban:
Perl 5 , 8 byte (ukuran chunk 4)
Cobalah online , atau coba versi yang berlipat ganda .
Unary
~
adalah bitwise negate, jadi menerapkannya dua kali adalah noop. Dengan demikian, program dasar hanya mengalikan$_
(variabel input-output implisit) dengan 2.Binary
~~
adalah smartmatch, yang mengembalikan boolean.~~+2~~+2
mem-parsing sebagai(~~+2) ~~ (+2)
. Karena 2 sama dengan 2, ini menghasilkan true (1). Dengan demikian, program yang digandakan pertama kali mengalikan$_
dengan 1, kemudian mengalikan$_
dengan sendirinya.sumber
05AB1E , 4 byte (ukuran chunk 2 atau 4)
Cobalah secara online atau digandakan sebagai potongan 4-byte tunggal atau digandakan sebagai dua potongan 2-byte .
sumber
Python 3 , 26 byte (ukuran potongan 13)
Cobalah online!
Dua kali lipat:
Solusi ini disediakan oleh @Grimy.
Python 3 ,
323028 byte (ukuran chunk161514)Cobalah online!
-4 byte terima kasih kepada @negativeSeven
Dua kali lipat:
Cobalah online!
Fungsi mengambil keuntungan dari aturan potongan unik dari tantangan ini.
sumber
Befunge-98 (FBBI) , 8 byte (panjang chunk 2)
Cobalah online!
Cobalah online! (berlipat ganda)
Tidak termasuk aliran kontrol, program pertama dieksekusi
&:+q
(input, duplikat puncak stack, tambahkan, keluar dengan kode kembali), dan dijalankan kedua&:*+q
(input, duplikat atas tumpukan, multiply, tambah (jumlah dengan 0 implisit), keluar dengan kembali kode)sumber
Hexagony , 14 byte (ukuran bongkahan 14)
Diperluas:
Cobalah online!
Dua kali lipat
Diperluas:
Coba gandakan secara online!
Hexagony berada dalam posisi yang agak aneh dalam tantangan ini, dalam hal benar-benar mencapai tugas tidak jauh lebih sulit daripada hanya mampu menulis dua program individu. Namun, solusi golf terbukti agak sulit.
Solusi ini adalah ide sepele dalam bentuk terpendek yang dapat saya masukkan, tetapi saya curiga ada jawaban yang lebih pendek dan lebih pintar. Versi ini dengan sangat naif menetapkan dua nilai ke input dan menjumlahkannya atau mengalikannya, tergantung pada apakah sumbernya digandakan. Satu-satunya kode yang digunakan kembali adalah
"+
yang membuat membuat kode salin untuk program ganda cukup pendek agar sesuai dengan ruang yang tidak digunakan dari program asli.Saya menduga menggunakan instruksi perubahan IP
[]
akan membuat mengisolasi bagian-bagian lebih mudah, tetapi solusi yang benar-benar ideal akan menggunakan kembali banyak kode di antara keduanya. Saya membuat program pembantu untuk menggandakan kode sumber hexagony. Perhatikan bahwa ini menghilangkan trailing no-op jadi jika Anda ingin memiliki no-op pengganti di akhir, cukup isi beberapa karakter lain dan ubah kembali setelahnya. Itu dapat menangani ukuran chunk yang berbeda, meskipun saya belum menulis kode untuk menampilkan setiap program yang mungkin (Hexagony tampaknya meminjamkan dirinya untuk menggunakan ukuran chunk penuh).sumber
Hexagony , 12 byte (ukuran chunk 4)
Cobalah online!
Diformat:
Dan dua kali lipat , lalu diformat:
Pada dasarnya, ini menetapkan tepi pertama ke input, lalu tepi kedua ke salah satu
2
atau salinan input, kemudian mengalikan kedua tepi ke tepi ketiga, mencetak itu dan berakhir. Daftar instruksi yang dijalankan adalah adildan
Dengan satu-satunya perbedaan adalah
+
menimpa2
pada program kedua.sumber
JavaScript (ES6),
2422 byteMeskipun formatnya tidak biasa, ini adalah definisi fungsi anonim, yang dapat dipanggil secara langsung atau ditugaskan ke variabel.
Cobalah online!
Coba online dua kali lipat!
Bagaimana?
Menerapkan unary
+
ke suatu fungsi ditafsirkan sebagai upaya untuk memaksanya ke nomor dan menghasilkan NaN . Oleh karena itu, yang terdepan+(g=x=>x*x)
salah di kedua versi.Di sisi lain, menerapkan biner
+
antara 2 fungsi menghasilkan sebuah string. Oleh karena itu,(x=>x*2)+(g=x=>x*x)
kebenaran dalam versi berlipat ganda.sumber
Perl 6 , 8 byte (ukuran chunk 1)
Cobalah online! Coba dua kali lipat!
Apapun / Hyper Apa pun lambda yang mengambil nomor dan mengembalikan nomor untuk program pertama dan daftar tunggal untuk program kedua. Pada dasarnya ini menyimpan logika yang sama persis, kecuali bahwa operator perkalian (
*
) digantikan oleh yang eksponensial (**
).Apa pun literal (membingungkan juga diwakili oleh a
*
) digandakan hingga HyperWhthing (**
) yang pada dasarnya sama kecuali memetakan daftar. Ruang diperlukan untuk memisahkan apa pun yang literal dari perkalian dan diabaikan ketika digandakan. Alih-alih hanya2
(yang akan digandakan ke22
) kami menggunakan daftar yang berisi dua elemen, yang mengevaluasi ke 2 dalam konteks numerik). The<>
dapat dua kali lipat untuk daftar dengan interpolasi, dan dua elemen dalam yang dua kali lipat, tapi tak satu pun dari perubahan yang panjang daftar.sumber
Pesona Runic , 9 byte (ukuran chunk 3)
Cobalah online!
Coba dua kali lipat!
The
3?
melompat 3 petunjuk berikutnya, mengakibatkan (dieksekusi)i3?...:+@
. Ketika dua kali lipat hasil dalam dieksekusii3?...:*@
mana.
mewakili 3 petunjuk NOP'd.@
adalah "cetak seluruh tumpukan dan akhiri."sumber
C # (Visual C # Interactive Compiler) / Javascript, 22 byte, ukuran chunk 11
Cobalah online!
sumber
=
ke-
. Jawaban bagus!Brain-Flak ,
4830 byte (ukuran chunk 10)Cobalah online! Coba dua kali lipat!
Ini pada dasarnya mengambil tiga langkah, kemudian ketika digandakan mengeksekusi langkah-langkah itu dua kali masing-masing. Program awal adalah:
Untuk input
n
ke program yang tidak digandakan, ini menghasilkan:Untuk program yang digandakan:
sumber
Brain-Flak , 76 byte, potongan 76 byte
Cobalah online!
Gandakan (dengan baris baru untuk kejelasan)
Cobalah online!
Berikut adalah versi yang menggunakan prosedur penggandaan yang lebih kompleks. Itu 5 potongan ukuran 15. Kode di sini adalah 46 byte namun karena padding yang diperlukan secara substansial lebih lama.
10590 byte, potongan 15 byteCobalah online!
Gandakan (dengan baris baru untuk kejelasan)
Cobalah online!
sumber
Cubix ,
1814 byte (panjang potong97)Perhatikan ruang trailing. Cobalah online!
Dua kali lipat:
Sekali lagi, ada satu ruang trailing. Cobalah online!
Penjelasan
Gagasan utamanya adalah menggandakan kode menyebabkan kubus menjadi lebih besar, sehingga penunjuk instruksi dimulai pada simbol yang berbeda. Karena program penambahan tidak dapat diletakkan pada kubus dengan panjang sisi 1, panjang sisi akan menjadi 2. Selain itu, kode yang digandakan harus berada pada kubus dengan panjang sisi 3, sehingga kode yang digandakan harus setidaknya 25 byte . Ini berarti kode harus sepanjang minimal 13 byte. Dengan demikian, paling banyak 1 byte lagi dapat disimpan.
Sekarang ke kode aktual. Pengamatan pertama adalah bahwa wajah atas (yaitu, 4 karakter pertama) tidak digunakan oleh program penambahan. Selanjutnya, jika kita membuat karakter ke-5 mencerminkan IP di sekitar kubus, kita dapat membebaskan 2 karakter lebih banyak. Kami akan menggunakan karakter ini untuk meletakkan program kuadrat.
sumber
Mornington Crescent , 656 Bytes (Ukuran bongkahan 328)
Hanya untuk menambah bobot pada teori bahwa ini dapat diselesaikan di hampir semua bahasa ...
(Baris baru yang tertinggal penting)
Coba versi tunggal! ... atau ... Coba versi yang berlipat ganda!
Ini adalah tantangan yang sangat sulit di Mornington Crescent karena program tersebut harus memiliki struktur yang kaku. Penting juga untuk menonton di mana penggandaan akan terjadi, karena teleportasi antar stasiun ilegal di London.
Teorinya di sini sederhana: Dalam versi tunggal, 'Batas Hijau' diisi dengan string acak, tetapi dalam versi dua kali akan diisi dengan input kuadrat. Setelah potongan berakhir, kedua versi menggandakan 'input', tetapi dalam versi kode yang dua kali lipat, input telah diganti dengan 0.
Hasil ini dikembalikan ke Batas Hijau, yang melakukan operasi maks () dua kali, sebelum membawa hasilnya ke output. Dalam versi tunggal ini membuat penggandaan tidak diubah (int dan string hanya beralih bolak-balik), tetapi dalam versi digandakan ini menggantikan 0 dengan hasil kuadrat yang sudah disimpan dalam Bounds Green.
Jika penjelasan saya tidak cukup baik, saya sarankan Anda mengunjungi London dan mencoba dua rute sendiri.
sumber
JavaScript (Node.js) ,
1512 byte (ukuran chunk: 6)Cobalah online!
Kasus tunggal:
Kasus ganda:
Tampaknya juga berfungsi di C #, dan Java jika berubah
=>
menjadi->
?sumber
R ,
423528 byte (ukuran chunk 4)Sekarang dengan bongkahan yang lebih kecil dan tidak ada kesalahan. Saya juga punya solusi yang lebih panjang dengan ukuran chunk 3; Lihat di bawah.
Saya rasa tidak mungkin untuk menulis jawaban R dengan ukuran chunk 1 atau 2; Saya akan dengan senang hati memberikan hadiah kepada siapa pun yang membuktikan saya salah.
Cobalah online!
The
#
adalah untuk komentar di R. 3 baris hanya spasi, membuat sepotong newline + 2 ruang + baris baru, sehingga potongan sebelumnya dan berikutnya dapat memiliki baris baru.Menggandakan, menjadi:
Cobalah online!
Versi tunggal menghitungn2× 4 = 2 n ; versi ganda menghitungn2× n2× 4 = n2 .
Berikut ini solusi yang sedikit lebih lama, tetapi dengan ukuran chunk 3:
R , 39 byte (ukuran chunk 3)
Cobalah online!
Dua kali lipat:
Cobalah online!
Perhatikan bahwa Giuseppe memiliki jawaban R lain , dengan satu potongan 30 byte.
sumber
R ,
5930 byte (ukuran chunk5930)Cobalah online!
Penghargaan untuk Robin Ryder karena menginspirasi ini; bertambah
F
setiap kali, dan fungsif
memilih output yang sesuai.Ini tidak terlalu menarik, tetapi pasti sesuatu yang pintar memanipulasi ukuran chunk akan diimpikan.Seperti yang diharapkan, Robin Ryder datang dengan ini yang lebih pendek dan memiliki beberapa manipulasi potongan rapi.sumber
PowerShell , 22 byte (ukuran chunk 11)
Cobalah online .
Dua kali lipat:
Solusi ini didasarkan pada solusi @ ShieruAsakoto .
Solusi @Grimy yang telah dikonversi ke PowerShell, 26 byte (ukuran chunk 13)
Cobalah online .
Dua kali lipat:
sumber
Perl 5 (
-p
),2215 byte-7 byte terima kasih kepada Grimy
TIO
sumber
$_*=/@F/?2:$_/4;
Arang , 13 byte
Cobalah online! Penjelasan: Daftar kosong yang telah ditentukan adalah falsey sehingga inputnya dikalikan dengan 2. Ketika digandakan pass kedua melihat string kosong telah didorong ke daftar sehingga ia mengalikan input dengan sendirinya. Cobalah online! Dalam sintaksis verbose ini sesuai dengan
Multiprint(Cast(Times(Cast(q), Ternary(u, Cast(q), 2)))); Push(u, w);
.sumber
Python 3,
5653 byteKeterampilan python saya agak payah, jadi pasti bisa bermain golf .. Berdasarkan jawaban Python di tantangan " Saya gandakan sumbernya, Anda gandakan hasilnya! " .
Panjang chunk 53.
Coba online atau coba online dua kali lipat .
sumber
Java 8, 62 byte
Panjang potongan 62.
Coba online atau coba online dua kali lipat .
Penjelasan:
Di Jawa, komentar yang tersedia adalah
// comment
dan/* comment */
. Yang digabungkan di sini untuk menimpa bagian-bagian tertentu. Lihat cara kerja komentar ini berkat penyorotan Java:Program ganda menciptakan
Byte
kelas khusus dan nilainyaSIZE=9
, yang menimpajava.lang.Byte
kelas default dan nilainyaSIZE=8
.sumber
Japt ,
75 byteCobalah | Dua kali lipat
²
mendorong 2 ke array inputN
kemudianj
menghapus & mengembalikan elemen pada indeksJ=-1
(yaitu, yang baru saja dimasukkan2
) dan mengalikan input dengan itu.Ketika digandakan hasilnya
J
dikalikan dengan2
, jadi elemen pada indeks-2
(yaitu, input) dikembalikan olehj
dan digunakan sebagai pengali.sumber
Jelly ,
86 byte (panjang chunk 3)Cobalah online!
Dua kali lipat
sumber
Solusi yang bagus: Lua , 66 byte (ukuran chunk 66 byte)
Cobalah online! (double it yourself, it is not so hard)
Oh ya, cukup yakin bahwa ada solusi yang lebih pendek untuk ini, tapi itu yang terbaik yang bisa saya lakukan dengan cara ini. Ambil masukan sebagai argumen pertama.
Penjelasan singkat: seluruh bisnis dengan
a
cukup jelas untuk semua orang, sedangkan bagian kedua denganx
lebih menarik. Pada dasarnya, saya membuat tabel (atau memperbarui yang sudah ada pada pass kedua) dengan finalizer (__gc
metamethod) which gets called when program exits.Solusi lumpuh: Lua , 60 byte (ukuran chunk 30 byte)
Cobalah online! atau Coba dua kali lipat!
Lebih kecil dan dengan chunking yang lebih baik, tetapi pada akhirnya membosankan dan lumpuh tanpa trik pintar. Saya cukup yakin tidak ada komentar yang diperlukan untuk ini.
sumber
J,
15109 bytesTry it online!
Doubled version: Try it online!
f : g
creates a verb that executesf
when called with one argument, andg
when called with 2 arguments. So ours executes double+:
with the original source and*-:
when the source is doubled.This works because a train of two verbs in J becomes a hook, and thus
f f
is executed asy f (f y)
where y is the original input. Additionally,*-:
is itself a "dyadic hook" which works by multiplying*
the left arg by half-:
the right arg. The left arg will be the original input, and the right arg will be the input doubled, so this will produce the square of the original input.original answer
J, 15 bytes
Try it online!
Doubled version: Try it online!
In the single version, we have a single verb which uses Agenda
@.
to do the if... then logic: If the argument is equal to itself=~
, then take the argument and double it(+:@[)
.However, when we double the code, we get a J hook. Call the verb
f
and the inputy
. Then the hookf f
executes like this:Which means that now the original input is the left arg, and the right arg is the doubled input. Since these will not be equal,
=~
will return false this time, and now we'll execute the other fork of the Agenda, ie,*:@]
, which means "square the right arg." And since~
reverses the inputs of a dyadic verb, the right arg will be the original input.sumber
Python 3 , 60 byte
Ukuran chunk 6.
Bukan solusi yang bagus, tetapi berhasil. Ini adalah tantangan yang unik, itu benar-benar membuat Anda berpikir dari sudut pandang yang berbeda.
Cobalah online!
Dua kali lipat:
Cobalah online!
sumber
Cascade , 13 byte (ukuran chunk 13)
Cobalah online!
Coba dua kali lipat!
Ini cukup sulit. Inti dasar dari ini adalah untuk mencetak input yang dikalikan dengan
2
untuk program pertama, dan menggantikannya2
dengan salinan input untuk yang kedua.Penjelasan:
Bagian yang dieksekusi dari program pertama terlihat seperti
Program yang digandakan pada dasarnya menambahkan yang pertama
]
ke akhir baris terakhir, sehingga program membungkus untuk itu daripada&
. Ini mengubahnya menjadisumber
Zsh , 30 byte (ukuran chunk 10)
Cobalah online! Coba dua kali lipat!
Menyalahgunakan fakta bahwa
$var
dalam$[$var]
diperluas terlebih dahulu, kemudian dievaluasi dalam konteks aritmatika.Jika ada yang ingin celah dalam menurunkan ini, inilah
24/8
solusi terdekat yang saya dapatkan (keluaranx^2+2
ketika digandakan)sumber