For
loop digunakan secara luas dalam banyak bahasa, tetapi apa yang akan Anda lakukan jika tidak ada bahasa yang mendukungnya?
Menciptakan cara untuk mengeksekusi dasar for
lingkaran tanpa menggunakan struktur pengulangan ( for
, foreach
, while
, do
, dll).
Dasar untuk loop yang harus Anda tiru diatur seperti ini
for(i=0;i<1000;i++)
Anda harus dapat mereplikasi ini tanpa menggunakan struktur pengulangan. Itu juga harus mengeksekusi kode dalam bahasa Anda yang akan berada di tubuh loop. Segala bentuk eval
diizinkan, meskipun tidak dapat menjalankan for
loop itu sendiri.
Anda dapat menguji kode Anda dengan mencetaknya i
sebanyak 100 kali, tambahkan case tes ini di akhir jawaban Anda untuk memverifikasi kode Anda dengan orang lain.
Tidak ada batasan apa yang harus dilakukan, yang perlu dilakukan hanyalah mereplikasi for
loop.
Pemenang akan ditentukan berdasarkan upvote pada saat itu dipilih.
sumber
Jawaban:
C, 45 karakter tanpa goto, jika, untuk, ...
Bukan solusi terkecil, tapi menurut saya cara ini cukup menarik di C :)
Tidak menggunakan
goto
,if
,for
, atau jenis lain dari struktur kontrol.Fungsi dengan sendirinya (45 karakter):
Program kerja yang dapat dikompilasi:
sumber
while
,do
,for
,if
...int (*a[])()={m,exit}
adalah array fungsi pointer.m
disebut kenaikan dan cetakan manai
(diatur ke 1, 2, 3, ...) dan memanggil fungsi dari array pointer fungsi. Panggilan(*a[i>999])();
akan diperluas ke(*a[0])();
atau(*a[1])();
karena C akan menggunakan nilaii>999
sebagai integer tergantung pada apakah itu benar atau salah (1 atau 0). Itu akan memanggilm
sampaii>999
benar, lalu memanggil keluar. Penggunaan pointer fungsi yang bagus.Haskell, 33 karakter
Ini lebih seperti menciptakan for for loop, karena tidak ada omong kosong seperti itu di Haskell: P.
sumber
forM_
hanyamapM_
dengan argumen terbalik, jadi ini mungkin curang. ;)GCC -
10695 karakterTidak seperti solusi C lain di mana Anda harus menyatakan panggilan balik, solusi ini melakukannya untuk Anda secara otomatis:
Ini bekerja dengan menggunakan ekstensi fungsi bersarang GCC . Yaitu, ini meneruskan-mendeklarasikan fungsi bersarang
F
, meneruskannya ke fungsi loopingL
, dan kemudian memulai definisiF
, meninggalkan kawat gigi untuk ditambahkan oleh pengguna.Satu hal yang indah tentang fungsi bersarang di GCC adalah mereka mendukung funargs ke bawah, yang berarti ilusi itu hampir lengkap:
Ada satu peringatan utama: jika Anda menggunakan
FOR
dua kali dalam lingkup yang sama, Anda akan mendapatkan konflik (yaitu, ia akan dikompilasi, tetapi semuaFOR
loop akan berbagi satu loop body). Untuk mengizinkan beberapa loop FOR dalam lingkup yang sama, kami membutuhkan6965 karakter lainnya:175160 karakter:sumber
C, 21 karakter
Sebagai contoh:
Output:
sumber
main()
di blok pertama, kode tidak akan ditautkan. Karena itu saya pikir itu harus dimasukkan dalam entri.main()
dalam kasus ini karena pertanyaannya mengatakan "Buat cara untuk mengeksekusi" tidak "membuat program lengkap" seperti dalam masalah lain.void
maka itu akan menjadi26
karakter saja.C # - tidak ada rekursi, tidak ada kebagian
(menggunakan kombinasi Y dari kalkulus lambda)
sumber
perakitan x86, instruksi senilai
1211 bytesumber
loop
instruksi:mov cx, 1000\nx: ... loop x
Namun varian Scala lainnya
Karena Scala memungkinkan untuk menggunakan karakter non-ASCII, kami dapat mengimplementasikan nyata untuk :) (
o
bersifat cyrillic).Uji:
sumber
JavaScript, 34 karakter
Ini mengasumsikan fungsi pencetakan yang sebenarnya tidak bagian dari
for
loop.rekursi berparameter (43) :
rekursi terbalik (36) :
mengasumsikan
max >= 0
operator ternary (34)
sumber
function f(m,c){m&&c()&f(--m,c)}
- Anda dapat membuat 32 byte :)Ruby 1,9 - 51 karakter
Ini jauh lebih besar daripada entri lain, tapi saya pikir ini menangkap esensi dari pertanyaan dengan lebih baik. Akibatnya ini memungkinkan Anda untuk menulis kode hampir persis seperti contoh:
sumber
C #,
7057 karakterC # bukan senjata pilihan untuk kode golf, tapi saya pikir saya akan mencobanya:
Ini tidak hanya melakukan tugas menghitung hingga 1000; melainkan mencoba mereplikasi
for
perilaku loop untuk tugas apa pun. Itu sepertinya agak dekat dengan maksud tantangan, tapi mungkin itu hanya aku.Diperluas:
Penggunaannya sangat dekat dengan sintaks for-loop:
sumber
Python
Kasus khusus:
Dan secara umum:
di mana 'f' adalah kode Anda. Kemungkinan tidak bekerja untuk semua kasus.
sumber
for
kerja loop.;i=+1
setelah koma. Saya memang mengatakan itu tidak akan bekerja dengan semua kasus.exec 'i=0;'+1000*'print i;i+=1;'
akan melakukan pekerjaan itu.C: 33 karakter untuk basis untuk loop (dengan asumsi goto diperbolehkan)
sumber
Saya akan menanggung malu untuk ini, tapi ini dia di Linux shell:
40 karakter.
sumber
Inilah loop Anda menggunakan Brainfuck, yang mungkin curang:
sumber
JavaScript - 39 karakter dalam test case
Chrome, Opera, dan IE:
eval(s="i<1e3&&eval(s,print(i++))",i=0)
. Ini gagal dengan "ukuran tumpukan panggilan terlampaui" di Safari dan "terlalu banyak rekursi" di Firefox.Firefox:
(function f()i<1e3&&f(print(i++)))(i=0)
. Ini menggunakan fitur "penutupan ekspresi" non-standar Mozilla untuk menghilangkan sepasang kurung kurawal.Catatan: Ubah
print(i++)
kealert(i++)
jika Anda perlu. Anda dapat mengubah1e3
ke100
untuk mengurangi jumlah iterasi untuk Safari.sumber
print
panggilan di dalameval
panggilan itu benar-benar pintar.QBasic (24 karakter)
memperluas ke:
Catatan: Ini mengasumsikan bahwa
i
masih memiliki nilai aslinya 0.sumber
J,? <10 karakter
Di J ada (hampir) tidak ada loop; sebaliknya, orang biasanya menggunakan array dan loop implisit melalui mereka. Misalnya, untuk menjumlahkan bilangan bulat 1..100, Anda menerapkan (/) kata kerja "plus (+) ke array 1..100 (i.101)
Untuk menampilkan angka 0..99, kami hanya membuat array:
^:
adalah kata kerja "power";f^:1000
adalah sesuatu sepertiexec()*1000
di python.sumber
C #, 58 karakter
Pembaruan: D'oh ... tampaknya ini adalah jawaban yang hampir identik dengan Eelvex yang mengalahkan saya beberapa menit.
Tidak terlalu pintar - hanya rekursi sederhana dalam .NET.
Atau mengeluarkan badan "for loop" (35 karakter):
Memungkinkan untuk menyemai nilai awal dan nilai maksimal.
sumber
Scala
Terinspirasi dari jawaban Nemo157 :
Dan ini bisa digunakan seperti ini:
Golf (62):
Atau:
sumber
PowerShell 18
1 - 10
Ya, itu sama sekali tidak berguna dan Anda harus menulis ulang fungsi untuk melakukan sesuatu yang bermanfaat. Tapi bukankah itu intinya? :)
sumber
foreach
.Clojure
(map #(print (str % " ")) (range 1 (inc 100)))
Ganti cetak dengan fungsi untuk dijalankan.
Gunakan (termasuk 100) atau 101 untuk nilai terakhir.
sumber
Perl, 21 karakter
sumber
Perl paling sederhana - 18 karakter (ok, curang)
output: 0 1 2 3 ... 998 999
tapi:
Perl regex / goatse op (real pseudoloop) - 39 (16) karakter
'loop dasar' menjadi 16 karakter
output: 0 1 2 3 ... 998 999
Salam
rbo
sumber
Javascript - 86 karakter
Mungkin bukan solusi javascript terpendek, tetapi itu mereplikasi pernyataan iterator, manipulasi iterator serta kondisi perulangan.
Contoh use case:
sumber
C (Tanpa rekursi, tidak ada kebotakan)
Sepenuhnya sesuai dengan definisi, bukan?
sumber
sumber
LISP, 91 karakter
Bisa lebih pendek dengan label.
Contoh penggunaan:
sumber
pesta:
14 karakter.
sumber
Python3 - 27 karakter
sumber
print(" ".join(map(str,range(1000))))
File Batch Windows, 65
File uji:
Dapat menyimpan dua byte jika loop selalu dimulai pada 0.
sumber