Mari kita lihat loop khas, yang biasanya melakukan 8 iterasi:
for (int x=0; x<8; ++x);
Anda harus membuatnya tak terbatas!
Ini adalah kontes popularitas untuk semua bahasa yang mendukung bentuk for
loop seperti itu. Jadi solusi dengan skor tertinggi (upvotes minus downvotes) menang.
Jika bahasa Anda memiliki bentuk for
lingkaran lain, tetapi Anda yakin, Anda dapat membuat sesuatu yang keren dengan itu, jangan ragu untuk mengirim jawabannya dan menandainya sebagai tidak bersaing. Saya berhak memperbesar ruang lingkup konstruksi dan bahasa yang tersedia, tetapi tidak akan pernah menyusut, jadi jangan takut menjatuhkan solusi yang sebelumnya benar.
Apa solusinya?
Solusi terdiri dari dua program.
Program pertama adalah program bersih . Ini adalah program khas dalam bahasa Anda dengan for
loop membuat 8 iterasi. Seharusnya program yang normal, yang bisa ditulis oleh pengembang. Tidak ada peretasan khusus untuk tujuan persiapan. Sebagai contoh:
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
Program kedua ditambah. Program ini harus berisi semua kode dari program bersih dan beberapa kode tambahan. Ada beberapa titik ekstensi, lihat bagian aturan lengkap untuk detailnya. Program augmented untuk yang bersih di atas bisa
inline bool operator < (const int &a, const int &b)
{
return true;
}
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
Itu hanya sebuah contoh (tidak dapat dikompilasi dalam C ++) untuk menunjukkan ide. Program augmented benar benar harus dapat dikompilasi, bekerja dan memiliki loop tak terbatas.
Aturan lengkap
Kedua program:
- Bahasa apa pun dengan dukungan
for
loop seperti itu ok. - Badan loop harus kosong. Lebih tepatnya, Anda dapat menempatkan beberapa output atau kode lain ke dalam loop, tetapi perilaku loop harus sama jika loop kosong.
Program bersih:
Loop menggunakan bilangan bulat atau numerik dan melakukan 8 iterasi:
for (int x=0; x<8; ++x); // C, C++, C# for (var x=0; x<8; ++x); // C#, Javascript for (auto x=0; x<8; ++x); // C, C++ for (auto signed x=0; x<8; ++x); // C, C++ for (register int x=0; x<8; ++x); // C, C++
Jenis yang ditentukan pengguna tidak diizinkan.
- Penggunaan properti (kecuali variabel global) sebagai ganti variabel loop tidak diizinkan.
Deklarasi variabel bisa di dalam atau di luar loop. Kode berikut ok:
int x; for(x=0; x<8; ++x);
Baik kenaikan awalan atau postfix dapat digunakan.
Batas lingkaran
8
harus ditulis sebagai literal konstan tanpa menyimpan ke konstanta bernama atau variabel. Itu dibuat untuk mencegah solusi berdasarkan mendeklarasikan variabel atau konstanta sama dengan 8, dan kemudian menugaskan kembali, menimpa atau membayangi dengan nilai lain:const double n = 8; int main() { const double n = 9007199254740992; for (double x=0; x<n; ++x); return 0; }
Program augmented:
- Harus mengandung semua kode dari kode yang bersih.
- Harus memperluas program bersih dalam jumlah terbatas poin ekstensi.
- Harus mengeksekusi loop yang sama
for
dengan infinite loop itu sendiri.
Menempatkan loop ke dalam konstruksi tak terbatas lain tidak ok. - Runtime atau kompilasi waktu tambalan kode diizinkan selama representasi tekstual tidak berubah.
- Menempatkan konstruksi ke dalam string dan meneruskannya
eval
tidak diizinkan.
Poin ekstensi:
- Di mana saja di luar fragmen dengan kode bersih, termasuk file lain atau rakitan lainnya.
for
pernyataan (sebagai bagian tunggal -for
konstruksi dan tubuhnya) harus dijaga tidak berubah.- Deklarasi variabel harus tetap sama.
- Setiap tempat di antara pernyataan sederhana dapat digunakan sebagai titik ekstensi.
- Jika dan hanya jika variabel dinyatakan di luar loop dan tanpa penugasan langsung dari nilai, penugasan tersebut dapat ditambahkan.
/* extension point here */
int main()
/* extension point here */
{
/* extension point here */
int x /* extension point for assignment here */;
/* extension point here */
for (x=0; x<8; ++x);
/* extension point here */
return 0;
/* extension point here */
}
/* extension point here */
int main()
{
/* BEGIN: No changes allowed */ int x = 0; /* END */
/* extension point here */
/* BEGIN: No changes allowed */ for (x=0; x<8; ++x); /* END */
return 0;
}
PS: Jika memungkinkan, berikan tautan ke IDE online.
java.lang.Integer
? 2. Ini akan lebih baik dengan kriteria kemenangan yang tepat.Jawaban:
Python3
Program Bersih:
Ini hanya hitungan mundur standar saat loop.
Program Augmented:
Ia menggunakan int cache mendefinisikan kembali
8
sebagai9
yang secara efektif membuatn -= 1
no-op, karena9-1 = 8
yang hanya menetapkann
kembali ke9
lagi, menyebabkan loop tak terbatas.Anda dapat melihat cache int beraksi online di sini (meskipun jelas tanpa loop tanpa batas karena online).
sumber
8
ke9
Python 3.5.2 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux
Python 3
Program Bersih:
Cara standar untuk melakukan sesuatu 8 kali dalam python adalah:
Program Augmented:
Namun, jika kita mengesampingkan fungsi rentang generator untuk menghasilkan 1, itu menjadi loop tak terbatas ...
Kita dapat mengambil ini lebih jauh dan membuat fungsi generator yang, bukannya menghasilkan 1, menghitung selamanya:
Uji pada repl.it
sumber
Perl
Bersih
Diperbesar
Ideone .
sumber
$i
alias untuk menjadi alias untuk variabel khusus yang hanya mampu menahan boolean, jadi setelah mencapai 1, ia menjadi kebal dari penambahan.ES5 + (Javascript)
EDIT : Dihapus deklarasi variabel eksplisit, karena jika tidak diangkat dan properti window.x tidak dapat dikonfigurasi dibuat (kecuali dijalankan baris demi baris di konsol REPL).
Penjelasan:
Manfaatkan fakta bahwa setiap variabel yang dicakup secara global juga merupakan properti dari objek jendela , dan mendefinisikan ulang properti "window.x" untuk memiliki nilai konstan 1.
Bersih
Diperbesar
CATATAN : Untuk membuat ini berfungsi di Node.js, cukup ganti "window" dengan "global" (diuji dalam Node.js 6.8.0)
sumber
var
di Crome. Tetapi Anda dapat menghapusvar
dari kedua program - itu akan baik-baik saja.var
kerekan, jadi pada saat menggunakannyadefineProperty
sudah keluar. Tetapi jika Anda menempatkan 2 baris ini dalam skrip yang berbeda (omong-omong, diizinkan), itu akan berhasil, karena properti akan dibuat terlebih dahulu danvar
kemudian akan diabaikan. Bukti: i.stack.imgur.com/lSwbE.pngC
Program bersih
Program augmented
sumber
Must execute same for loop as an infinite loop itself. Placing of the loop into another infinite construction is not ok.
Jawa
Program bersih:
Program augmented:
Menyetel Integer dalam cache Integer yang harus berisi 1 hingga 0, secara efektif
i++
tidak melakukan apa-apa (seti
ke Integer yang di-cache yang seharusnya berisi 1, tetapi karena Integer itu benar-benar berisi 0, tidak ada perubahan).sumber
int
daripada yang relatif beratInteger
.C ++
bool
hanya bisa 0 atau 1. Terinspirasi oleh jawaban Perl primo .sumber
Python 3 (3.5.0)
Program Bersih:
Diperbesar
Solusi ini tidak seperti yang lain yang ditulis dalam Python dalam hal itu benar-benar mengubah kode sumber dengan cepat. Semua hal dalam for loop dapat diubah menjadi kode apa pun yang diinginkan.
Kode mengubah opcode kedua menjadi terakhir menjadi
113
atau lebih mudah dibaca -JUMP_ABSOLUTE
. Ini mengubah operan ke160
- instruksi di mana for loop dimulai, yang pada dasarnya menciptakan pernyataan GOTO di akhir program.Program yang diperbesar mencetak angka-angka
0..7
tanpa batas berkali-kali tanpa tumpukan-tumpah atau serupa.sumber
PHP
Saya pikir ini mengikuti aturan titik perpanjangan; Saya tidak sepenuhnya jelas pada poin 4. Ini sangat mirip dengan jawaban perl @ primo jadi saya pikir itu penting.
Bersih
Diperbesar
PHP memungkinkan Anda menambahkan string tertentu, seperti:
Semua string ini bernilai 0, jadi ini akan berulang secara praktis selamanya (kecuali kehabisan memori).
sumber
Perl
Kode bersih
Kode augmented
Kebanyakan variabel Perl hanyalah variabel. Namun, bahasa ini juga memiliki
tie
fitur, yang memungkinkan Anda untuk secara efektif memberikan variabel getter dan setter. Dalam program ini, saya membuat paket utama (yang namanya adalah string nol) menjadi setara dengan kelas dari bahasa berorientasi objek, sementara juga menjadikannya sebuah program. Itu memungkinkan saya untuk mengikatfor
loop counter ke program itu sendiri. ImplementingTIESCALAR
memungkinkan tidak berpengaruh, dan upaya untuk membacanya selalu kembali , yang jumlahnya kurang dari 8.tie
untuk berhasil; nilai pengembalianTIESCALAR
dimaksudkan untuk menjadi referensi ke keadaan internal apa pun yang perlu kita pertahankan terkait dengan variabel, tetapi karena kita tidak memerlukannya, kita mengembalikan referensi array kosong sebagai pengganti. Kami kemudian memberikan implementasi yang paling sederhana dari pengambil dan penyetel; tak satu pun dari mereka melakukan apa pun, jadi upaya untuk menetapkan$x
undef
sumber
WinDbg
Bersih
Diperbesar
Pendekatan ini menciptakan alias untuk
<
as|
, jadi ketika<
ditemui dalam kode alias diperluas ke|
dan bitwise-atau dilakukan bukannya kurang dari. Di WinDbg semua nilai bukan nolanything | 8
adalah benar sehingga selalu benar.Catatan: Ini
.block
tidak benar-benar diperlukan jikaaS
dan.for
benar-benar dimasukkan sebagai dua baris berbeda seperti yang ditunjukkan di sini, itu hanya diperlukan ketikaaS
dan.for
berada di baris yang sama.sumber
Mathematica
Bersih
Diperbesar
sumber
Gangguan umum
Kode bersih
Diperbesar
Makro bernama
keyword:dotimes
, alias:dotimes
(lihat 11.1.2.3 Paket KEYWORD ) didefinisikan yang mengembang sebagai loop tak terbatas. Thedefmacro
pengembalian makro nama makro yang ditetapkan, yang dapat diumpankan keshadowing-import
. Jadi, ini barudotimes
simbol simbol membayangi simbol standar (yang tidak boleh didefinisikan ulang atau secara leksikal terikat dengan makro lain dalam program portabel).Bertambah (2)
Ketika kita membaca karakter 8, kita menggantinya dengan
(loop)
. Itu berarti bahwa di atas dibaca sebagai(dotimes (i (loop)))
dan kode tidak pernah berhenti menghitung batas atas. Ini berdampak pada semua kejadian 8, tidak hanya yang ada di loop. Dengan kata lain, 8 adalah singkatan dari infinity. Jika Anda penasaran, ketika tabel dibaca diubah seperti di atas, maka karakter 8 menjadi "terminating", dan melepaskan diri dari angka / simbol lain yang sedang dibaca:... dibaca sebagai:
Anda dapat menjalankan tes di Ideone: https://ideone.com/sR3AiU .
sumber
Rubi
Bersih
Semacam ini untuk loop tidak banyak digunakan di Ruby, tetapi tutorial khas akan memberi tahu Anda bahwa ini adalah cara untuk melakukannya:
Diperbesar
Untuk loop hanya memanggil
(1..8).each
dengan blok kode yang diberikan, jadi kami mengubah metode itu:sumber
Haskell
Versi bersih:
Versi augmented:
Ini cukup mendasar, sungguh: kita hanya mendefinisikan tipe kita sendiri
T
sehinggaenumFromTo
instansnya adalah urutan yang tak terbatas, kemudian gunakan jenis defaulting sehingga nilai-nilai yang tidak di-anotasi0
dan8
diambil sebagai tipeT
.sumber
///
Tidak ada yang eksplisit
for
loop di ///, tetapi dapat disimulasikan (setelah semua selesai).Bersih:
Diperbesar:
Apa yang sedang terjadi?
Sementara mantan Program menghitung mundur 8-0, yang terakhir itu
/0/0/
aturan akan menggantikan0
oleh0
sampai kekekalan.sumber
/0/1//1/2/.../7/8//8/8/8
menghitung.Javascript ES6
OK, inilah versi yang berfungsi menggunakan ES6 untuk ... dari konstruk loop. Saya bahkan akan memberi Anda array yang bersih sehingga kami yakin tidak ada bisnis yang lucu:
Bersih
Tentu saja, itu tidak menghentikan seseorang dari mengacaukan prototipe Array ...
Diperbesar
Ini berfungsi dengan menulis-ulang iterator default sehingga tidak pernah berakhir, oleh karena itu mengunci semuanya menjadi loop tak terbatas. Kode bahkan tidak memiliki kesempatan untuk menjalankan hal-hal di dalam loop.
sumber
var
dalam loop.C ++
Menggunakan 2 titik ekstensi:
Program bersih sama seperti dalam deskripsi.
sumber
Brainfuck
Saya mencetak '0' setiap iterasi, hanya untuk memudahkan penghitungan iterasi. Tetapi kode apa pun bisa dimasukkan di sana tanpa mengubah cara kerja loop.
Bersih
Cobalah online
Versi augmented bergantung pada implementasi Brainfuck yang umum dengan sel 8 bit. Pada implementasi ini, "increment" sebenarnya "increment (mod 256)". Dengan demikian untuk menemukan loop yang akan mengulangi persis 8 kali dalam versi bersih dan tanpa akhir dalam versi augmented, kita dapat dengan mudah menemukan solusi untuk sistem ketidaksetaraan berikut.
Dalam kasus ini, kita membiarkan a = 128, b = 16, dan c = 1. Jelas 128 + 16 * 8 = 256 (dan 256 (mod 256) = 0) dan 128> 0, dan karena b adalah genap, c + a + b * n ganjil untuk a + c aneh, dan dengan demikian tidak akan pernah ada kelipatan 256 dari kasus-kasus seperti itu. Kami memilih c = 1 demi kesederhanaan. Jadi satu-satunya perubahan yang kita butuhkan adalah satu
+
di awal program.Diperbesar
Cobalah online
Saya serahkan pada OP untuk menentukan apakah entri ini bersaing. Brainfuck tidak memiliki perulangan eksplisit, tetapi bentuk perulangan yang saya gunakan sedekat mungkin.
++++++++
juga dekat dengan literal8
yang bisa Anda dapatkan; Saya sudah memasukkan beberapa di antaranya.Versi bersih hampir pasti merupakan program tipikal yang ditulis dalam bahasa ini, karena Brainfuck Hello World yang terpendek pun diketahui tergantung pada hubungan pengulangan modular untuk bekerja.
sumber
Haskell
Bersih
Diperbesar
Mengganti operator aplikasi fungsi yang biasa
$
dengan yang mengulang loop lagi setiap kali selesai. Menjalankan versi bersih akan mencetak 0 hingga 8 lalu berhenti; versi yang ditambah mencetak 0 hingga 8 dan kemudian 0 hingga 8 lagi, dan seterusnya.Saya sedikit curang, karena
forM_ [0..8] $ \i -> print i
itu belum tentu cara "terbersih" untuk menulis loop itu di Haskell; banyak Haskellers akan mengurangi-loop body untuk mendapatkanforM_ [0..8] print
dan kemudian tidak ada$
untuk menimpanya. Dalam pembelaan saya, saya menyalin kode bersih dari jawaban Cactus , yang tidak membutuhkan properti itu, jadi setidaknya satu programmer Haskell benar-benar menulis kode itu tanpa motivasi untuk menambahkan kode yang tidak perlu.$
!sumber
C ++
Mari kita
x
evaluasi ke 7. Tidak bekerja di C karena itu membutuhkan nilai lebih pada penugasan dan kenaikan.sumber
Nim
Versi idiomatik, menggunakan
countup
:Bersih
Diperbesar
Sederhana, dan sangat mirip dengan jawaban Python yang mengubah
range
. Kami mendefinisikan ulangcountup
, cara Nim idiomatik untuk beralih dari satu int (inklusif) ke int lain, untuk memberikan 8s tanpa batas.Versi yang lebih menarik, menggunakan operator jangkauan
..
:Bersih
Diperbesar
Sangat mirip dengan solusi sebelumnya, kecuali kami mendefinisikan ulang operator jangkauan
..
, yang biasanya akan memberikan array[1, 2, 3, 4, 5, 6, 7, 8]
, ke iterator dari sebelumnya.sumber
GolfScript
Bersih
Diperbesar
Ini menetapkan fungsi mengembalikan n +1 ke variabel 8
sumber
tcl
Normal:
Diperbesar:
Idenya adalah untuk mendefinisikan kembali
incr
perintah yang digunakan untuk menambah variabeli
, untuk benar-benar tidak menambah!Dapat diuji di: http://rextester.com/live/QSKZPQ49822
sumber
x86_64 Majelis
Program bersih:
Jenis loop yang akan digunakan oleh programmer Majelis, diikuti oleh syscall keluar agar tidak mengaktifkan menambahkan
jmp loop_start
instruksi sesudahnya.Program augmented:
Juga, maaf jika buruk bahwa program bersih tidak memiliki entrypoint atau a
section .text
sumber
JavaScript
Bersih:
Diperbesar:
sumber
C ++
Program Bersih
Lingkaran yang bagus dan normal, berputar dari angka 0 hingga 7.
Program Augmented
Preprosesor C ++ adalah fitur yang cukup berbahaya ...
Satu-satunya baris yang harus kami tambahkan adalah
#define short bool
. Ini membuati
boolean bukan bilangan bulat pendek, sehingga operator kenaikan (i++
) tidak melakukan apa pun setelahi
mencapai 1. Output kemudian terlihat seperti ini:sumber