Thực hiện in ngược


102

Nhiệm vụ của bạn là đảo ngược thứ tự mà một số printsđược thực thi.


Thông số kỹ thuật:
Mã của bạn sẽ ở dạng này:

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

Bạn sẽ phải print(hoặc echo, hoặc write, hoặc tương đương) các chuỗi từ thứ tư đến thứ nhất.

  • Bạn quyết định dòng nào trong chương trình của bạn phải có printchuỗi, nhưng chúng phải liền kề ;

  • Mỗi dòng chỉ có thể chứa một printvà không thể vượt quá 60 byte chiều dài;

  • Vì đây là , hãy sáng tạo và tránh viết chỉ một gotohoặc đơn giảnfor(i){if(i=4)print"Line1";if(i=3)...}

  • Câu trả lời được đánh giá cao nhất trong 2 tuần sẽ chiến thắng điều này.

  • Đầu ra của bạn PHẢILine4 Line3 Line2 Line1 HOẶC Line4Line3Line2Line1 HOẶC Line4\nLine3\nLine2\nLine1 (nơi \nlà một dòng mới), và nó phải được tạo ra chỉ bằng cách thực hiện những printsngược.

Chúc mừng mã hóa!

CẬP NHẬT: Cuộc thi đã kết thúc! Cảm ơn tất cả :)


15
Ả Rập có tính không? :)

Nếu bạn có thể đáp ứng các thông số kỹ thuật, tất nhiên: P
Vereos

Muốn nhanh chóng làm rõ một quy tắc ... Khi bạn nói "Mỗi lượt thích chỉ có thể chứa một bản in", bạn có nghĩa là một dòng văn bản trong tệp mã hoặc một LỘC / câu lệnh?
Ruslan

Mỗi dòng mã chỉ có thể chứa một bản in
Vereos

nó có phải vượt qua đánh giá mã - phù hợp với mã sản xuất không?
Lance

Câu trả lời:


183

Hàng hóa 64 CƠ BẢN

40 print "Line 1"
30 print "Line 2"
20 print "Line 3"
10 print "Line 4"

83
Tôi không bao giờ có thể hiểu tại sao số dòng là cần thiết, cho đến bây giờ.
ugoren

3
Tôi sẽ đề xuất, sao chép ROM nhân vật ($ D000) vào RAM ($ 3000), hoán đổi bitmap nhân vật cho "1" <-> "4" và "2" <-> "3", sau đó chạy chương trình theo thứ tự chuyển tiếp . Đây là dễ thương hơn.
Đánh dấu Lakata

Tôi khá chắc chắn rằng bạn thực sự không thể lưu / tải hoặc liệt kê mã theo thứ tự được hiển thị bằng các công cụ tiêu chuẩn (dù sao chắc chắn không thể có trên Apple II), tất cả những gì bạn có thể làm là nhập những dòng đó vào bảng điều khiển theo thứ tự đó. Và nếu điều đó được cho phép, bạn không thể sử dụng thư viện C # SendKeys để nhập mã bằng bất kỳ ngôn ngữ nào được trả lời theo thứ tự khác với các phím mũi tên để di chuyển.
Lance

109

PHP

Lạm dụng ưu tiên ... :-)

!print "Line1\n".
!print "Line2\n".
!print "Line3\n".
!print "Line4\n";

3
Trong PHP, printcó thể được sử dụng như một biểu thức, vì nó có thể là perl, giá trị trả về luôn luôn là 1. !1trả về bool(false), khi được gõ dưới dạng chuỗi trả về chuỗi trống. Một hạn chế thích hợp hơn cho PHP có thể là yêu cầu echohơn là print; Trên đây thực sự chỉ là một tuyên bố.
primo

1
@ kuldeep.kamboj Nó chỉ được nhóm theo cách đó: print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));- mọi thứ ở bên phải của bản in là một phần của nó.
bwoebi

4
Nó dường như hoạt động trong mọi phiên bản 3v4l.org/dpSpK rất ấn tượng!
eisberg

3
Mất một lúc để hiểu (Cảm ơn @eisberg về liên kết!) Nhưng tôi hiểu ngay bây giờ. Mặc dù cái đầu tiên printđược gọi đầu tiên, nhưng nó không hoàn thành việc lấy ra những gì nó cần in cho đến khi các phần bên trong (thấp hơn) printđã được gọi và được đánh giá đầy đủ. Và các !s chỉ để ẩn số 1 sẽ in khác. Rực rỡ, @bwoebi!
sfarbota

1
@sfarbota Đọc quy tắc là khó. Đã sửa. Cảm ơn bạn :-)
bwoebi

76

C

Hành vi không xác định là loại hành vi thú vị nhất!

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

Đầu ra thực tế có thể thay đổi tùy thuộc vào trình biên dịch, trình liên kết, hệ điều hành và bộ xử lý của bạn :)


22
Tôi hoàn toàn không biết làm thế nào điều này thực sự hoạt động, +1.
Svick

7
@svick: để hỗ trợ các varargs, hầu hết các trình biên dịch C đặt các đối số hàm trên ngăn xếp theo thứ tự ngược lại (vì vậy mục trên cùng của ngăn xếp luôn là đối số thứ nhất), có nghĩa là chúng có khả năng đánh giá các đối số theo cùng một cách. Tất nhiên, điều này giả định rằng các đối số được truyền vào ngăn xếp ngày càng ít xảy ra với các trình biên dịch mới hơn.
Guntram Blohm

Như @GuntramBlohm đã nói, ý tưởng cơ bản là các tham số hàm C thường (nhưng không phải luôn luôn) được đẩy lên ngăn xếp theo thứ tự từ phải sang trái. Vì đây là các lệnh gọi hàm, nên các hàm có thể (nhưng không nhất thiết) được gọi từ phải sang trái. Tuy nhiên, tất cả điều này không được xác định bởi tiêu chuẩn C, do đó, trong khi nó mang lại kết quả đúng trong GCC 4, nó hoàn toàn phụ thuộc vào trình biên dịch và gọi quy ước những gì thực sự xảy ra.
Nick

1
@fluffy: Than ôi, đó là cách khác: C không coi dấu phẩy arglist là điểm chuỗi, không giống như các dấu phẩy khác.
Williham Totland

6
@WillihamTotland thì tôi biết một số mã mà tôi thực sự cần sửa ... cảm ơn
fluffy

74

Java

Sử dụng sự phản chiếu

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){}
    }
}

Đầu ra:

Line4
Line3
Line2
Line1

Một lời giải thích tại sao công trình này có thể được tìm thấy ở đây .


61
Kinh khủng. Tôi thích nó.
Roger Lindsjö

4
+1 Mọi người luôn nói rằng java String là bất biến. Bạn chứng minh rằng họ không.
Victor Stafusa

16
Điều này thật khó chịu, nhưng yêu cầu thực hiện ngược lại không được đáp ứng.
Thorbjørn Ravn Andersen

4
@ ThorbjørnRavnAndersen shhhh ... bạn không cần phải nói với họ điều đó. : p
Danny

5
@Victor Trong Java, Chuỗi bất biến. Trên khắp Stackoverflow, có những câu hỏi như "Tôi nghĩ rằng Chuỗi là bất biến". Họ sử dụng sự phản chiếu và nó làm cho chúng dường như bất biến. Các lời hứa của Java hoạt động như thế này: "Nếu bạn sử dụng các thứ / lớp của chúng tôi theo cách chúng tôi dự định, thì chúng tôi hứa rằng các khiếu nại của chúng tôi là chính xác." Phản ánh không phải là cách các lớp dự định sử dụng.
Justin

70

C (và sắp xếp của Python)

Phiên bản mới, sử dụng macro để phù hợp với định dạng câu hỏi một cách hoàn hảo. Theo nhận xét của Quincunx, tôi đã thêm vào returnđể làm cho nó đẹp hơn.

Nó cũng hoạt động trong Python, nhưng nó in đúng thứ tự.

#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();

Phiên bản gốc - cả hai thực tế giống nhau, sau khi thay thế macro:

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

1
+1 cho macro. Có thể bao gồm một cái khác; đại loại như #define } 0))));(tôi không biết chính xác cách thức hoạt động của macro trong C). Bằng cách đó, bạn có thể có các câu lệnh in trong phương thức chính, không có gì khác.
Justin

@Quincunx, bạn không thể xác định }, nhưng bạn có thể xác định return, điều mà bây giờ tôi đã làm. Bây giờ nó gần như là một polyglot - printcú pháp hoạt động trong một số ngôn ngữ script, #definethường là một nhận xét, nhưng main(){..}không hoạt động trong bất kỳ ngôn ngữ nào tôi có thể tìm thấy.
ugoren

1
@Quincunx, và bây giờ nó thực sự là một polyglot.
ugoren

Làm thế nào là hai định nghĩa đầu tiên làm việc không có không gian? Nó sẽ làm printcho được thay thế bởi "\n",printf(?
phuclv

@ LưuViênPhúc - Không gian là tùy chọn. Nó thay thế như bạn nói.
xấu xí

61

ES6 (sử dụng chế độ lùi;)

Ồ, có vẻ như các nhà thiết kế của ECMAScript đã có một tầm nhìn xa đáng kinh ngạc khi họ thực hiện một phần chế độ ngược của thông số kỹ thuật:

// 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,'')

Đầu ra (đánh giá, thực sự):

"Line4Line3Line2Line1"

Lưu ý rằng đó chính xác là hình thức được yêu cầu, chỉ lùi một chút để phù hợp với cú pháp của chế độ . Cũng lưu ý rằng chế độ này chỉ được hỗ trợ trong các phiên bản gần đây của Firefox vào lúc này .

Lưu ý cuối cùng: Trên thực tế, không có chế độ lùi. Nhưng đây vẫn là một tập lệnh hợp lệ chạy trong Firefox (sao chép toàn bộ). :CƯỜI MỞ MIỆNG


ES6 "chế độ lỏng lẻo"

THƯỞNG : Đây là phiên bản cập nhật không sử dụng chế độ lùi, nhưng sử dụng "chế độ lỏng lẻo" mới được chỉ định trong đó công cụ JS sẽ chỉ cố đoán xem mã phải làm gì, bất kể tuân thủ bất kỳ cú pháp JS được chỉ định nào ( về cơ bản là phản đề của chế độ nghiêm ngặt):

// 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,'')

Xin lưu ý rằng " chế độ lỏng lẻo " hiện chỉ khả dụng trong Firefox> = 34 .; P


7
Tất cả 3 liên kết bạn đã đăng đều dẫn đến 404. Đây có phải là trò đùa không?
manatwork

8
Ah. Tôi thấy bây giờ Cú pháp tô sáng là đồng phạm của bạn ở đây.
manatwork

12
Đây là một kết hợp cuộc thi phổ biếntrolling mã , không? :) Tôi thích nó.
Không phải Charles

8
Đây là một sự lạm dụng phi thường của Javascript. Tôi thích nó.
Seiyria

2
Lén lút. Soooo lén lút ....
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;
}

56

Hồng ngọc

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

Chỉnh sửa: Hoặc,

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

printLine1(
printLine2(
printLine3(
printLine4)))

38
Tôi thích điều này bởi vì nó có meth
Ray

2
Bạn sẽ không đăng hai câu trả lời nếu bạn có hai giải pháp?
TheConstructor

3
Điều này sẽ không giống rubyvới các khối mã hơn? pastebin.com/LDWpxKx8
manatwork

2
@PacMani những parens không sử dụng khoảng trắng, họ sử dụng khoảng trắng.
corsiKa

@manatwork đẹp một! method_missingMặc dù vậy, tôi nghĩ là khá Ruby-ish.
lịch sử

49

PHP

Tôi biết, đây là sự điên rồ ...

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;

66
Tiếng ồn mà bạn nghe thấy là Dijkstra quay cuồng trong mộ anh. :-)
Gareth

24
Nghĩ rằng ai đó đã nói "hãy sáng tạo và tránh viết chỉ là goto" ;-)
TheConstructor

22
@TheConstructor Phần sáng tạo đang sử dụng goto trong PHP ;)
NikiC

1
Vì vậy, đầy chiến thắng.
Nick T

41

Haskell

Đây là Haskell gần như thành ngữ, vì chương trình bây giờ trông giống như một thành phần chức năng từ phải sang trái. Nếu hàm không được in, nhưng thứ gì đó sẽ trả về giá trị (hữu ích) thì khai báo toán tử sẽ không cần thiết và mã sẽ là thứ bạn thấy trong các thư viện.

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

main = putStrLn "Line1"
    << putStrLn "Line2"
    << putStrLn "Line3"
    << putStrLn "Line4"

5
mẹo:(<<) = flip (>>)
Bergi

@Bergi Đó là một cách khác để viết nó, tôi đoán thậm chí thanh lịch hơn một chút. Tôi thực sự hơi ngạc nhiên khi thấy điều không được xác định trong khúc dạo đầu (hoặc Control.Monad)
shiona

@shiona: Vâng, đó là một điều đáng ngạc nhiên để bỏ lỡ. Hạnh phúc, chúng tôi có cả hai nhà khai thác cho Ứng dụng: <**>.
Tikhon Jelvis

@TikhonJelvis thực sự, <*toán tử ứng dụng khác với điều này <<: a <* btương đương với do x<-a;b;return x, tức là nó chạy ahiệu ứng đầu tiên
tự hào

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();

22
Điều này về mặt lý thuyết không được đảm bảo để in theo thứ tự ngược chính xác.
Cruncher

4
@Cruncher Tôi biết, nhưng với khoảng cách 1 giây, cơ hội in nó ở bất cứ thứ gì ngoài thứ tự ngược lại là khá mỏng.
Gareth

3
@Gareth Đó là lý do tại sao tôi in nghiêng về mặt lý thuyết :)
Cruncher

3
@Cruncher Không phải điều đó làm cho nó rất vui sao?
Pierre Arlaud

@Cruncher giống như lý thuyết mà các nguyên tử của tôi có thể xuyên qua tường?
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}

Xem jsFiddle .

Chỉnh sửa:
Để tuân thủ các quy tắc tốt hơn, đây là một biến thể trong XML, thực sự sử dụng 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>

nơi style.css nên

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

HTML không có CSS

Và cho cái quái gì đó, đây là một cái không có 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>

Fiddle .


2
Bất cứ ai có thể giải thích các downvote? Điều này không hoạt động khi in, bạn biết.
Ông Lister

Bạn cũng có thể làmp {float:right;}
Noyo

Nhưng sau đó tất cả các kết quả sẽ nằm trên một dòng!
Ông Lister

... và điều đó được cho phép. :]
Noyo

1
... và điều đó không được phép. : D Bạn cũng có thể gói nó trong div và thêm quy tắc 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";
}

(Biến cục bộ bị hủy theo thứ tự ngược lại của khai báo.)

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; }},
    };
}

(Rất giống nhau, nhưng sử dụng lambdas và một thành viên dữ liệu mảng thay thế.)


Tôi đã đăng một giải pháp bằng cách sử dụng std::function, và tôi đã cố gắng để thoát khỏi nó. Bây giờ tôi không cần vì bạn đã có nó!
sergiol

21

Haskell

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

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);

Sử dụng 1,2,3,4như thời gian chờ cũng làm việc cho tôi. (Tuy nhiên, tôi không biết liệu hành vi này có được chuẩn hóa trong ECMAScript hay không.)
ComFalet

1
@ComFalet: setTimeoutđược chuẩn hóa trong HTML5 / bộ hẹn giờ, không phải trong ES. Ngoài ra, nó chỉ định thời gian chờ tối thiểu là 4ms :-)
Bergi

1
@Bergi Yep, bạn đúng, tất nhiên! Tiêu chuẩn HTML - Bộ hẹn giờ - nếu có ai quan tâm.
ComFalet

1
Chạy cái này trên một máy đủ chậm (giả sử, 8086 chạy một số ứng dụng khác?) Và nó sẽ thất bại. (Do thất bại, ý tôi là trật tự sẽ không bị đảo ngược, vì sẽ mất> = 100ms để thực hiện mỗi câu lệnh.
Jeff Davis

1
@ lastr2d2 Mô phỏng một máy tính chậm với các vòng lặp trong khi khá chủ quan, nhưng tôi nghĩ nó sẽ giống như nó hơn: jsfiddle.net/7zbKw/1 . Lưu ý từ whatwg.org/specs/web-apps/civerse-work/multipage/ Khăn "API này không đảm bảo rằng bộ định thời sẽ chạy chính xác theo lịch trình. Sự chậm trễ do tải CPU, các tác vụ khác, v.v., sẽ được dự kiến."
Jeff Davis

20

C

Cố gắng làm cho bất chấp các mẹo trong câu hỏi sáng tạo nhất có thể:

#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;
}

3
lạm dụng tốt #define: P +1
masterX244

15

BF

Giả sử bọc tế bào.

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

Tại sao nó hoạt động

Các dòng đầu tiên và cuối cùng bao gồm một vòng lặp lặp lại bốn lần (counter = cell0).

Trong vòng lặp, có một biến đếm ( cell1) được tăng lên mỗi lần chạy.

Mỗi dòng kiểm tra nếu giảm bốn, ba, hai hoặc một bằng không. Do đó, ở lần chạy đầu tiên, bộ đếm là một và dòng cuối cùng được thực thi, ở lần chạy thứ hai, dòng thứ ba được thực thi, v.v.

Các (line 1)chương trình mà bạn nên làm cho văn bản được in. Các mũi tên trong các vòng lặp phân bổ cell2cho mục đích này. Làm [-]sạch cell2sau khi bạn sử dụng nó.


14

Bash

Trong ký ức của những tôn kính SleepSortSleepAdd , tôi trình bày cho bạn ... SleepReverse :

#!/bin/bash

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

print 1
print 2
print 3
print 4

Để nó trông giống thông số kỹ thuật hơn, hãy sử dụng $1$2: function print(){(sleep $((4-$2));echo "$1 $2";)&}; print Line 1
ThinkChaos

13

Java

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();
  }
}

Đó là tất cả trong thời gian thích hợp ... ;-)


Các đường phải liền kề nhau.
TimTech

Chúng không kém cạnh nhau, ví dụ như với codegolf.stackexchange.com/a/20660/16293 không ai nói rằng chúng nên trông giống nhau. Sẽ xóa một số ký tự dòng mới ;-)
TheConstructor

Được rồi, tuyệt vời :-)
Timtech

12

Con trăn 3

import atexit

atexit.register(print,"Line1")
atexit.register(print,"Line2")
atexit.register(print,"Line3")
atexit.register(print,"Line4")

12

Bash

Đây là kịch bản hai mặt:

#!/bin/bash
s=1
if [ $s -ne 0 ]; then tac $0 | bash; exit; fi
s=0
echo "Line1"
echo "Line2"
echo "Line3"
echo "Line4"

2
Tôi thậm chí không bao giờ biết tactồn tại! Cảm ơn.
Noyo

11

Lisp thường gặp 1

Thật dễ dàng để viết một ngorpmacro thực thi các biểu mẫu của nó theo thứ tự ngược lại:

(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

Lisp thường gặp 2

Đây là một vấn đề rất đúng theo nghĩa đen; mã từ câu hỏi xuất hiện trong chương trình mà không sửa đổi:

(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

10

PHP

Một evalbiến thể khác :

$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";

1
Nhếch nhác! Tuy nhiên, tôi cảm thấy buộc phải chỉ ra đây là một ý tưởng thực sự tồi tệ.
David Kryzaniak

9

ĐỤ#

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

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

Chỉ cần tạo một toán tử tùy chỉnh thực hiện các chức năng theo thứ tự ngược lại.


3
Tôi khá chắc chắn (?) F (g (x)) = g (x); f (x) là phép tính và không lập trình.
Jeff Davis

2
@JeffDavis: Khá chắc chắn (?) f g xđọc đại khái là (?)(f, g, x), khôngf(g(x))
Eric

9

Đi (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")
}

Dùng thử: http://play.golang.org/p/fjsJLwOFn2


Tôi muốn gửi mã chính xác. Theo nghĩa đen, byte cho byte chính xác như nhau.
Nghệ thuật

@Art, tuyệt vời! Tôi hy vọng sẽ thấy nhiều Go được sử dụng trong Code Golf.
cory.todd

Có lẽ sẽ không xảy ra. Go không thực sự tốt khi bị nén, họ cố tình hạn chế các cấu trúc kỳ lạ để bạn không thể tạo ra một mớ hỗn độn không thể đọc được. Nhưng trong trường hợp này (và có thể các cuộc thi phổ biến khác) nó có cơ hội.
Nghệ thuật

8

Python3

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

Có thể ngắn hơn 6 byte bằng cách loại bỏ tất cả các khoảng trắng ở dòng cuối cùng.


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;
}

Thay vì std::reversestd::for_each, chỉ cần sử dụngwhile (! functors.empty()) { functors.back()(); functors.pop_back(); }
David Hammen

7

Mẻ

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

Chào mừng bạn đến với codegolf! Bài đăng hay.
Cruncher

7

C #

Thay vì gọi trực tiếp phương thức Run, tôi đang tạo một phương thức động có chứa một bản sao mã byte IL của Run, ngoại trừ các toán hạng opcode chuỗi tải được hoán đổi. Điều này làm cho phương thức mới hiển thị các chuỗi theo thứ tự ngược lại.

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);
        }
    }
}

6

Con trăn

một giải pháp khác sử dụng eval()

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

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

nó không phức tạp lắm, nhưng dễ hiểu


2
mã duy nhất tôi hiểu: D
moldovean
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.