Jalankan pencetakan mundur

102

Tugas Anda adalah membalik urutan di mana beberapa printsdieksekusi.


Spesifikasi:
Kode Anda akan berada di formulir ini:

//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code

Anda harus print(atau echo, atau write, atau setara) string tersebut dari yang keempat ke yang pertama.

  • Anda memutuskan baris mana dari program Anda yang printharus diisi, tetapi harus berbatasan ;

  • Setiap baris hanya bisa berisi satu print, dan panjangnya tidak bisa lebih dari 60 byte ;

  • Karena ini adalah , jadilah kreatif dan hindari menulis hanya gotoatau sederhanafor(i){if(i=4)print"Line1";if(i=3)...}

  • Jawaban yang paling banyak dipilih dalam 2 minggu memenangkan ini.

  • Output Anda HARUS menjadi Line4 Line3 Line2 Line1 ATAU Line4Line3Line2Line1 ATAU Line4\nLine3\nLine2\nLine1 (di mana \nadalah baris baru), dan itu harus dihasilkan hanya dengan mengeksekusi mereka printsmundur.

Selamat coding!

PEMBARUAN: Kontes telah berakhir! Terima kasih semua :)

Vereos
sumber
15
Apakah bahasa Arab diperhitungkan? :)
Jika Anda dapat memenuhi spesifikasi, tentu saja: P
Vereos
Ingin mengklarifikasi satu aturan dengan cepat ... Ketika Anda mengatakan "Setiap suka hanya dapat berisi satu cetakan", apakah maksud Anda satu baris teks dalam file kode atau satu LOC / pernyataan?
Ruslan
Setiap baris kode hanya dapat berisi satu cetakan
Vereos
apakah harus lulus ulasan kode - cocok untuk kode produksi?
Lance

Jawaban:

183

Commodore 64 BASIC

40 print "Line 1"
30 print "Line 2"
20 print "Line 3"
10 print "Line 4"
Danko Durbić
sumber
83
Saya tidak pernah tahu mengapa nomor baris diperlukan, sampai sekarang.
ugoren
3
Saya akan mengusulkan, menyalin Character ROM ($ D000) ke RAM ($ 3000), menukar bitmap karakter untuk "1" <-> "4" dan "2" <-> "3", kemudian menjalankan program dengan urutan ke depan . Ini lebih manis.
Mark Lakata
Saya cukup yakin Anda tidak dapat benar-benar menyimpan / memuat atau mendaftar kode dalam urutan yang ditunjukkan menggunakan alat standar (tentunya tidak bisa di Apple II), semua yang bisa Anda lakukan adalah mengetikkan baris-baris itu di konsol dalam urutan itu. Dan jika itu diizinkan, bisakah Anda menggunakan mis. Pustaka C # SendKeys untuk mengetikkan kode dalam salah satu bahasa yang dijawab dengan urutan berbeda dengan tombol panah untuk bergerak.
Lance
109

PHP

Memprioritaskan penyalahgunaan ... :-)

!print "Line1\n".
!print "Line2\n".
!print "Line3\n".
!print "Line4\n";
bwoebi
sumber
3
Dalam PHP, printdapat digunakan sebagai ekspresi, karena mungkin dalam perl, nilai baliknya selalu 1. !1mengembalikan bool(false), yang ketika diketik sebagai string mengembalikan string kosong. Pembatasan yang lebih tepat untuk PHP mungkin untuk meminta echodaripada print; di atas benar-benar hanya satu pernyataan.
primo
1
@ kuldeep.kamboj Hanya dikelompokkan seperti itu: print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));- semua yang ada di sebelah kanan pernyataan cetak adalah bagian darinya.
bwoebi
4
Tampaknya berfungsi di setiap versi 3v4l.org/dpSpK sangat mengesankan!
eisberg
3
Butuh waktu beberapa saat untuk mengerti (Terima kasih @isberg untuk tautannya!) Tapi saya mengerti sekarang. Sementara yang pertama printdisebut pertama, itu tidak selesai mengevakuasi apa yang perlu dicetak sampai bagian dalam (bawah) printsudah dipanggil dan dievaluasi sepenuhnya. Dan !hanya menyembunyikan 1 yang akan mencetak sebaliknya. Cemerlang, @bwoebi!
sfarbota
1
Aturan membaca @sfarbota sulit. Tetap. Terima kasih :-)
bwoebi
76

C

Perilaku tidak terdefinisi adalah perilaku yang paling menarik!

f(){}
main()
{
   f(printf("Line 1\n"), 
     printf("Line 2\n"), 
     printf("Line 3\n"), 
     printf("Line 4\n"));
}

Output aktual dapat bervariasi tergantung pada kompiler, tautan, sistem operasi, dan prosesor Anda :)

Nick
sumber
22
Saya sama sekali tidak tahu mengapa ini benar-benar berfungsi, +1.
svick
7
@svick: untuk mendukung varargs, kebanyakan kompiler C meletakkan argumen fungsi pada stack dalam urutan terbalik (sehingga item teratas pada stack selalu argumen pertama), yang berarti mereka cenderung mengevaluasi argumen dengan cara yang sama. Tentu saja, ini mengasumsikan argumen yang disampaikan stack yang menjadi kurang dan kurang halnya dengan kompiler yang lebih baru.
Guntram Blohm
Seperti yang dikatakan @GuntramBlohm, ide dasarnya adalah bahwa parameter fungsi C sering (tetapi tidak selalu) didorong ke stack dalam urutan kanan-ke-kiri. Karena ini adalah panggilan fungsi, fungsi mungkin (tetapi tidak harus) dipanggil dari kanan ke kiri juga. Semua ini tidak didefinisikan oleh standar C, jadi sementara itu terjadi untuk menghasilkan hasil yang tepat di GCC 4 itu sepenuhnya tergantung pada kompiler dan memanggil konvensi apa yang sebenarnya terjadi.
Nick
1
@ Fluffy: Sayangnya, ini sebaliknya: C tidak memperlakukan koma arglist sebagai titik urutan, tidak seperti koma lainnya.
Williham Totland
6
@ WillihamTotland baik maka saya tahu beberapa kode yang saya benar - benar harus perbaiki ... terima kasih
lembut
74

Jawa

Menggunakan refleksi

public class ReversePrint {
    public static void main(String[]a) {
        System.out.println("Line1");
        System.out.println("Line2");
        System.out.println("Line3");
        System.out.println("Line4");
    }
    static {
        try{
            Field f=String.class.getDeclaredField("value");
            f.setAccessible(true);
            f.set("Line1","Line4".toCharArray());
            f.set("Line2","Line3".toCharArray());
            f.set("Line3","Line2 ".trim().toCharArray());
            f.set("Line4","Line1 ".trim().toCharArray());
        }catch(Exception e){}
    }
}

Keluaran:

Line4
Line3
Line2
Line1

Penjelasan mengapa ini bekerja dapat ditemukan di sini .

Danny
sumber
61
Mengerikan. Saya suka itu.
Roger Lindsjö
4
+1 Orang selalu mengatakan bahwa String java tidak dapat diubah. Anda membuktikan bahwa mereka tidak.
Victor Stafusa
16
Ini menyenangkan jahat, tetapi persyaratan eksekusi terbalik tidak terpenuhi.
Thorbjørn Ravn Andersen
4
@ ThorbjørnRavnAndersen shhhh ... Anda tidak seharusnya memberi tahu mereka tentang itu. : p
Danny
5
@ Viktor Di Jawa, String tidak dapat diubah. Di seluruh Stackoverflow, ada pertanyaan seperti "Saya pikir String tidak berubah". Mereka menggunakan refleksi dan itu membuat mereka tampak abadi. Janji-janji Java bekerja seperti ini: "Jika Anda menggunakan barang / kelas kami seperti yang kami maksudkan, maka kami berjanji bahwa klaim kami benar." Refleksi bukan cara kelas dimaksudkan untuk digunakan.
Justin
70

C (dan semacam-Python)

Versi baru, menggunakan makro agar sesuai dengan format pertanyaan dengan sempurna. Mengikuti komentar Quincunx, saya menambahkan returnuntuk membuatnya lebih bagus.

Ini juga bekerja dengan Python, tetapi mencetak dalam urutan yang benar.

#define print"\n",printf(
#define return"\n"))));}
#define def main(){0?

def main():
    print "Line 1"
    print "Line 2"
    print "Line 3"
    print "Line 4"
    return

main();

Versi asli - keduanya praktis sama, setelah substitusi makro:

main(){
    printf("Line 1\n",
    printf("Line 2\n",
    printf("Line 3\n",
    printf("Line 4\n",
    0))));
}
ugoren
sumber
1
+1 untuk makro. Mungkin termasuk yang lain; sesuatu seperti #define } 0))));(saya tidak tahu persis bagaimana makro bekerja di C). Dengan begitu Anda bisa memiliki pernyataan cetak dalam metode utama, tidak ada yang lain.
Justin
@ Quincunx, Anda tidak dapat menentukan }, tetapi Anda dapat menentukan return, yang sekarang saya lakukan. Ini hampir menjadi polyglot sekarang - printsintaksnya berfungsi dalam beberapa bahasa skrip, #definesering merupakan komentar, tetapi main(){..}tidak berfungsi dalam bahasa apa pun yang dapat saya temukan.
ugoren
1
@ Quincunx, dan sekarang ini benar-benar polyglot.
ugoren
bagaimana dua definisi pertama bekerja tanpa spasi? Apakah itu printakan diganti "\n",printf(?
phuclv
@ LưuVĩnhPhúc - Ruang ini opsional. Itu menggantikan seperti yang Anda katakan.
ugoren
61

ES6 (menggunakan mode mundur;)

Wow, sepertinya para desainer ECMAScript memiliki pandangan jauh ke depan yang luar biasa ketika mereka membuat mode bagian belakang dari spesifikasi:

// activate backwards mode:
'use backwardsˈ; \* mode backwards in now *\
code of lines some \
\*code*\ "Line1" print \*code*\
\*code*\ "Line2" print \*code*\
\*code*\ "Line3" print \*code*\
\*code*\ "Line4" print \*code*\
code of lines some \
⁏ˈforwards useˈ // back to ˈnormal'.

// So simple! No need to do anything this complicated:
split('"').reduce((L,o,l)=>(l%2?o:'')+L,'')

Keluaran (evaluasi, sungguh):

"Line4Line3Line2Line1"

Perhatikan bahwa itu persis dari formulir yang diminta, dengan hanya sedikit mundur ke belakang agar sesuai dengan sintaks mode . Perhatikan juga bahwa mode ini hanya didukung di Firefox versi terbaru saat ini .

Catatan akhir: Sebenarnya, tidak ada mode mundur. Tapi ini masih skrip yang valid yang berjalan di Firefox (salin semuanya). : D


ES6 "mode longgar"

BONUS : Berikut ini adalah versi terbaru yang tidak menggunakan mode mundur, tetapi menggunakan "mode longgar" yang baru ditentukan di mana mesin JS hanya akan mencoba menebak apa yang seharusnya dilakukan kode, terlepas dari kepatuhan pada sintaks JS yang ditentukan ( pada dasarnya kebalikan dari mode ketat):

// activate "lax" mode:
`use laxˋ; // also works: ˋuse relaxˋ, ˋuse guessingˋ, ˋuse whatevsˋ, etc.
//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code
ˋuse normalˋ; // same as ˋuse default`.

// Again, compare to inferior, illegible "traditional" ES6:
split('"').reduce((L,o,l)=>(l%2?o:'')+L,'')

Harap dicatat bahwa " mode longgar " saat ini hanya tersedia di Firefox> = 34.; P

Noyo
sumber
7
Semua 3 tautan yang Anda poskan mengarah ke 404. Apakah ini lelucon?
manatwork
8
Ah. Saya mengerti sekarang. Highlighter sintaks adalah kaki tangan Anda di sini.
manatwork
12
Ini adalah kontes- kombo popularitas dan kode-trolling , bukan? :) Aku menyukainya.
Bukan berarti Charles
8
Ini adalah penyalahgunaan Javascript yang fenomenal. Saya suka itu.
Seiyria
2
Sneaky. Soooo licik ....
David Conrad
59

C

main()
{
  int i = 0;
  for(; i == 0; printf("Line 1\n"))
    for(; i == 0; printf("Line 2\n"))
      for(; i == 0; printf("Line 3\n"))
        for(; i == 0; printf("Line 4\n"))
          i = 1;
}
David Yaw
sumber
56

Rubi

print 'Line1' unless
print 'Line2' unless
print 'Line3' unless
print 'Line4'

Edit: Atau,

def method_missing(meth,*)
  puts meth.to_s.sub('print'){}
end

printLine1(
printLine2(
printLine3(
printLine4)))
histokrat
sumber
38
Saya lebih suka ini karena memiliki meth
Ray
2
Tidakkah Anda biasanya mengirim dua jawaban jika Anda memiliki dua solusi?
TheConstructor
3
Bukankah ini terlihat lebih ruby-ish dengan blok kode? pastebin.com/LDWpxKx8
manatwork
2
@PacMani orang tua itu tidak menggunakan spasi, mereka menggunakan ruang putih.
corsiKa
@manatwork bagus! Saya pikir method_missingcukup Ruby-ish itu sendiri.
histokrat
49

PHP

Saya tahu, ini gila ...

goto d;
a: print "Line1\n"; goto end;
b: print "Line2\n"; goto a;
c: print "Line3\n"; goto b;
d: print "Line4\n"; goto c;
end: exit;
Florent
sumber
66
Suara yang Anda dengar adalah Dijkstra berputar di kuburnya. :-)
Gareth
24
Seseorang mengira "jadilah kreatif dan hindari menulis hanya goto" ;-)
TheConstructor
22
@TheConstructor Bagian kreatif menggunakan goto di PHP ;)
NikiC
1
Penuh kemenangan.
Nick T
41

Haskell

Ini hampir seperti Haskell, karena program sekarang terlihat seperti komposisi fungsi dari kanan ke kiri. Jika fungsi tidak dicetak, tetapi sesuatu yang akan mengembalikan nilai (berguna) deklarasi operator tidak perlu dan kode akan menjadi sesuatu yang Anda akan lihat di perpustakaan.

a << b = (const a =<< b)

main = putStrLn "Line1"
    << putStrLn "Line2"
    << putStrLn "Line3"
    << putStrLn "Line4"
shiona
sumber
5
tip:(<<) = flip (>>)
Bergi
@Bergi Itu cara lain untuk menulisnya, kurasa sedikit lebih elegan. Saya sebenarnya sedikit terkejut melihat hal itu tidak didefinisikan dalam pembukaan (atau Control.Monad)
shiona
@shiona: Ya, itu hal yang mengejutkan untuk dilewatkan. Untungnya, kami memiliki kedua operator untuk Pelamar: <*dan *>.
Tikhon Jelvis
@TikhonJelvis sebenarnya, <*operator aplikasi berbeda dari ini <<: a <* bsetara dengan do x<-a;b;return x, yaitu menjalankan aefek pertama
bangga haskeller
40

Perl

use threads;

$a=threads->create(sub {sleep(5); print("Line1\n");});
$b=threads->create(sub {sleep(4); print("Line2\n");});
$c=threads->create(sub {sleep(3); print("Line3\n");});
$d=threads->create(sub {sleep(2); print("Line4\n");});

$a->join();
$b->join();
$c->join();
$d->join();
Gareth
sumber
22
Ini secara teoritis tidak dijamin untuk mencetak dalam urutan terbalik yang tepat.
Cruncher
4
@Cruncher Saya tahu, tetapi dengan celah 1 detik kemungkinan untuk mencetak apa pun selain urutan terbalik cukup tipis.
Gareth
3
@ Gareth Itulah sebabnya saya cetak miring secara teoritis :)
Cruncher
3
@Cruncher Bukankah itu yang membuatnya sangat menyenangkan?
Pierre Arlaud
@Cruncher dengan cara yang sama yang secara teoritis atom saya bisa melewati tembok?
cdeange
37

HTML + CSS

<p>Line 1</p>
<p>Line 2</p>
<p>Line 3</p>
<p>Line 4</p>

CSS:

body {margin-top:7em}
p + p {margin-top:-4em}

Lihat jsFiddle .

Sunting:
Untuk menyesuaikan dengan aturan dengan lebih baik, berikut adalah varian dalam XML, yang sebenarnya digunakan print.

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="style.css"?>
<root>
  <print>Line 1</print>
  <print>Line 2</print>
  <print>Line 3</print>
  <print>Line 4</print>
</root>

di mana style.css seharusnya

* {display:block; margin-top:3em}
print + print {margin-top:-3em}

HTML tanpa CSS

Dan untuk itu, di sini ada satu tanpa CSS.

<table>
<tfoot><tr><td><table><tfoot><tr><td>Line 1</tr></tfoot>
<tbody><tr><td>                      Line 2</table></tfoot>
<tbody><tr><td><table><tfoot><tr><td>Line 3</tr></tfoot>
<tbody><tr><td>                      Line 4</table></tbody>
</table>

Biola .

Tuan Lister
sumber
2
Adakah yang bisa menjelaskan downvote? Ini berfungsi saat mencetak, Anda tahu.
Mr Lister
Anda juga bisa melakukannyap {float:right;}
Noyo
Tetapi hasilnya semua akan berada di satu baris!
Tn. Lister
... dan itu diizinkan. :]
Noyo
1
... dan itu tidak dilarang. : D Anda juga bisa membungkusnya dalam div dan menambahkan aturan CSS div {float:left}.
Noyo
23

C ++

#include <iostream>
#define Q(x,y) x ## y
#define P(x,y) Q(x, y)
#define print S P(s, __LINE__) =
struct S { const char *s; S(const char *s): s(s) {} ~S() { std::cout << s << std::endl; } };
int main() {
    print "Line1";
    print "Line2";
    print "Line3";
    print "Line4";
}

(Variabel lokal dihancurkan dalam urutan deklarasi terbalik.)

C ++ 11

#include <iostream>
int main() {
    struct S { void (*f)(); S(void (*f)()): f(f) {} ~S() { f(); } } s[] = {
        {[](){ std::cout << "Line1" << std::endl; }},
        {[](){ std::cout << "Line2" << std::endl; }},
        {[](){ std::cout << "Line3" << std::endl; }},
        {[](){ std::cout << "Line4" << std::endl; }},
    };
}

(Hampir sama, tetapi menggunakan lambdas dan anggota data array sebagai gantinya.)

ecatmur
sumber
Saya memposting solusi menggunakan std::function, dan saya mencoba untuk menyingkirkannya. Sekarang saya tidak perlu karena Anda mendapatkannya!
sergiol
21

Haskell

main = sequence_ $ reverse [
    putStr "Line1",
    putStr "Line2",
    putStr "Line3",
    putStr "Line4"]
mniip
sumber
21

Javascript

setTimeout(function(){console.log("Line 1");},900);
setTimeout(function(){console.log("Line 2");},800);
setTimeout(function(){console.log("Line 3");},700);
setTimeout(function(){console.log("Line 4");},600);
JoshWillik
sumber
Menggunakan 1,2,3,4sebagai batas waktu juga berfungsi untuk saya. (Namun, saya tidak tahu apakah perilaku ini distandarisasi dalam ECMAScript.)
ComFreek
1
@ComFreek: setTimeoutdistandarisasi dalam HTML5 / timer, bukan ES. Juga, ini menentukan batas waktu minimum 4 ms :-)
Bergi
1
@Bergi Yap, Anda benar, tentu saja! Standar HTML - Pengatur Waktu - jika ada yang tertarik.
ComFreek
1
Jalankan ini pada mesin yang cukup lambat (katakanlah, 8.086 menjalankan beberapa aplikasi lain?) Dan itu akan gagal. (Secara gagal, maksud saya urutan tidak akan dibalik, karena akan membutuhkan> = 100ms untuk menjalankan setiap pernyataan.
Jeff Davis
1
@ lastr2d2 Mensimulasikan komputer lambat dengan loop sementara cukup subyektif, tapi saya pikir ini akan lebih seperti itu: jsfiddle.net/7zbKw/1 . Catatan dari whatwg.org/specs/web-apps/current-work/multipage/… "API ini tidak menjamin bahwa penghitung waktu akan berjalan sesuai jadwal. Diperkirakan akan terjadi keterlambatan karena beban CPU, tugas lain, dll."
Jeff Davis
20

C

Berusaha menyimpang dari tips dalam pertanyaan sekreatif mungkin:

#include <stdio.h>
#define print if (i == __LINE__) puts
static unsigned i;
int main(void) {
  while (--i) {
    print("Line 1");
    print("Line 2");
    print("Line 3");
    print("Line 4");
  }
  return 0;
}
hvd
sumber
3
penyalahgunaan yang bagus dari #define: P +1
masterX244
15

BF

Menganggap pembungkus sel.

++++[->+
----[> (line 1) .[-]<]++++
---[> (line 2) .[-]<]+++
--[> (line 3) .[-]<]++
-[> (line 4) .[-]<]+
<]

Mengapa ini berhasil?

Baris pertama dan terakhir terdiri dari satu loop yang berulang empat kali (counter = cell0).

Di dalam loop, ada variabel penghitung ( cell1) yang meningkat setiap kali dijalankan.

Setiap baris memeriksa apakah berkurang empat, tiga, dua, atau satu sama dengan nol. Oleh karena itu, pada putaran pertama, penghitung adalah satu dan baris terakhir dieksekusi, pada putaran kedua, baris ketiga dieksekusi, dll.

The (line 1)menunjukkan di mana Anda harus membuat teks yang dicetak. Panah di loop mengalokasikan cell2untuk tujuan ini. The [-]membersihkan keluar cell2setelah Anda menggunakannya.

Timtech
sumber
14

Pesta

Dalam memori dari dihormati SleepSort dan SleepAdd , saya hadir untuk Anda ... SleepReverse :

#!/bin/bash

function print(){(sleep $((4-$1));echo "Line $1";)&}

print 1
print 2
print 3
print 4
Kerusuhan
sumber
Agar lebih mirip dengan spesifikasi, gunakan $1dan $2: function print(){(sleep $((4-$2));echo "$1 $2";)&}; print Line 1
ThinkChaos
13

Jawa

import java.io.PrintStream;
import java.util.concurrent.FutureTask;

public class Print {
  public static void main(String[] args) {
    new FutureTask<PrintStream>(new Runnable() {
      public void run() {
        new FutureTask<PrintStream>(new Runnable() {
          public void run() {
            new FutureTask<PrintStream>(new Runnable() {
              public void run() {
                System.out.append("Line1"); }
            }, System.out.append("Line2")).run(); }
        }, System.out.append("Line3")).run(); }
    }, System.out.append("Line4")).run();
  }
}

Semuanya dalam waktu yang tepat ... ;-)

Korektor
sumber
Garis harus berbatasan.
Timtech
Mereka tidak kurang berdekatan daripada misalnya dengan codegolf.stackexchange.com/a/20660/16293 tidak ada yang mengatakan mereka harus terlihat sama. Akan menghapus beberapa karakter baris baru ;-)
TheConstructor
Oke, bagus :-)
Timtech
12

Python 3

import atexit

atexit.register(print,"Line1")
atexit.register(print,"Line2")
atexit.register(print,"Line3")
atexit.register(print,"Line4")
Tandai Plotnick
sumber
12

Pesta

Inilah skrip berwajah ganda:

#!/bin/bash
s=1
if [ $s -ne 0 ]; then tac $0 | bash; exit; fi
s=0
echo "Line1"
echo "Line2"
echo "Line3"
echo "Line4"
Matteo Italia
sumber
2
Aku bahkan tidak pernah tahu tacada! Haha terima kasih.
Noyo
11

Gangguan Umum № 1

Sangat mudah untuk menulis ngorpmakro yang mengeksekusi formulirnya dalam urutan terbalik:

(macrolet ((ngorp (&body ydob) `(progn ,@(reverse ydob))))
  (ngorp
   (write-line "Line 1")
   (write-line "Line 2")
   (write-line "Line 3")
   (write-line "Line 4")))
Line 4
Line 3
Line 2
Line 1

Gangguan Umum № 2

Inilah salah satu yang menangani masalah dengan sangat harfiah; kode dari pertanyaan muncul di program tanpa modifikasi:

(macrolet ((execute-prints-backwards (&body body)
             `(progn 
                ,@(nreverse (mapcar (lambda (string)
                                      (list 'write-line string))
                                    (remove-if-not 'stringp body))))))
  (execute-prints-backwards

//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code

  ))
Line4
Line3
Line2
Line1
Joshua Taylor
sumber
10

PHP

evalVarian lain :

$lines=array_slice(file(__FILE__),-4); // get last 4 lines of current file
eval(implode('',array_reverse($lines)));exit; // eval lines reversed and exit
print "Line1\n";
print "Line2\n";
print "Line3\n";
print "Line4\n";
Dabbler yang Layak
sumber
1
Licin! Meskipun demikian, saya merasa harus menunjukkan bahwa ini adalah ide yang sangat buruk.
David Kryzaniak
9

F #

let inline (?) f g x = g x; f x

(printfn "Line1%s") ?
 (printfn "Line2%s") ?
  (printfn "Line3%s") ?
   (printfn "Line4%s") ""

Baru saja membuat operator khusus yang menjalankan fungsi dalam urutan terbalik.

pswg
sumber
3
Saya cukup yakin (?) F (g (x)) = g (x); f (x) adalah kalkulus dan bukan pemrograman.
Jeff Davis
2
@JeffDavis: Cukup pasti (?) f g xberbunyi kasar (?)(f, g, x), bukanf(g(x))
Eric
9

Go (Golang)

package main

import "fmt"

func main() {
    defer fmt.Println("Line 1")
    defer fmt.Println("Line 2")
    defer fmt.Println("Line 3")
    defer fmt.Println("Line 4")
}

Cobalah: http://play.golang.org/p/fjsJLwOFn2

cory.todd
sumber
Saya ingin memposting kode yang sama persis. Secara harfiah, byte-for-byte persis sama.
Seni
@ Art, luar biasa! Saya berharap dapat melihat lebih banyak Go yang digunakan di Code Golf.
cory.todd
Mungkin tidak akan terjadi. Go tidak benar-benar bagus dikompresi, mereka sengaja membatasi konstruksi aneh sehingga Anda tidak dapat membuat kekacauan yang tidak dapat dibaca. Tetapi dalam kasus ini (dan mungkin kontes popularitas lainnya) memiliki kesempatan.
Seni
8

Python3

print("Line1",
print("Line2",
print("Line3",
print("Line4") or '') or '') or '')

Bisa lebih pendek 6 byte dengan menghapus semua spasi di baris terakhir.

aragaer
sumber
7

Javascript

[
  "console.log('Line1')",
  "console.log('Line2')",
  "console.log('Line3')",
  "console.log('Line4')"
].reverse().forEach(function(e){eval(e)})

C ++ 11

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<std::function<void()>> functors;
    functors.push_back([] { std::cout << "Line1"; });
    functors.push_back([] { std::cout << "Line2"; });
    functors.push_back([] { std::cout << "Line3"; });
    functors.push_back([] { std::cout << "Line4"; });
    std::reverse(functors.begin(),functors.end());
    std::for_each (functors.begin(), functors.end(), [](std::function<void()> f) {f();});
    return 0;
}
Michael M.
sumber
Alih-alih std::reversedan std::for_each, cukup gunakanwhile (! functors.empty()) { functors.back()(); functors.pop_back(); }
David Hammen
7

Batch

echo off

call :revers ^
echo.line1 ^
echo.line2 ^
echo.line3 ^
echo.line4

:revers
if not "%2"=="" call :revers %2 %3 %4 %5 %6 %7 %8 %9
%1
hmilch
sumber
Selamat datang di codegolf! Pos yang bagus.
Cruncher
7

C #

Alih-alih langsung memanggil metode Run, saya membuat metode dinamis yang berisi salinan bytecode Run's Run, kecuali bahwa operand opcode load-string ditukar. Yang menyebabkan metode baru untuk menampilkan string dalam urutan terbalik.

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;

namespace TestApp
{
    class Program
    {
        public static void Run()
        {
            Console.WriteLine("Line 1");
            Console.WriteLine("Line 2");
            Console.WriteLine("Line 3");
            Console.WriteLine("Line 4");
        }


        static void Main(string[] args)
        {
            var method = typeof(Program).GetMethod("Run");
            var il = method.GetMethodBody().GetILAsByteArray();
            var loadStringOperands = new Stack<int>();
            for (int i = 0; i < il.Length; i++)
            {
                if (il[i] == OpCodes.Ldstr.Value)
                {
                    loadStringOperands.Push(BitConverter.ToInt32(il, i + 1));
                    i += 4;
                }
            }

            var run = new DynamicMethod("Run", typeof(void), null);
            var gen = run.GetILGenerator(il.Length);
            for (int i = 0; i < il.Length; i++)
            {
                if (il[i] == OpCodes.Ldstr.Value)
                {
                    var str = method.Module.ResolveString(loadStringOperands.Pop());
                    gen.Emit(OpCodes.Ldstr, str);
                    i += 4;
                }
                else if (il[i] == OpCodes.Call.Value)
                {
                    var mInfo = method.Module.ResolveMethod(BitConverter.ToInt32(il, i + 1)) as MethodInfo;
                    gen.Emit(OpCodes.Call, mInfo);
                    i += 4;
                }
                else if (il[i] == OpCodes.Ret.Value)
                {
                    gen.Emit(OpCodes.Ret);
                }
            }

            run.Invoke(null, null);
        }
    }
}
Pieter Witvoet
sumber
6

Python

solusi lain menggunakan eval()

a = [
"print('Line1')",
"print('Line2')",
"print('Line3')",
"print('Line4')"]

for line in reversed(a):
    eval(line)

ini tidak terlalu rumit, tetapi mudah dimengerti.

davidak
sumber
2
satu-satunya kode yang saya mengerti: D
moldovean