後方に印刷を実行


102

あなたの仕事は、いくつかprintsが実行される順序を逆にすることです。


仕様:
コードは次の形式になります。

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

あなたはする必要がありますprint(またはecho、またはwriteそれらの文字列、または同等の)第四から最初にします。

  • プログラムのどの行をprint文字列にする必要があるかを決定しますが、それらは隣接している必要があります。

  • すべての行に含めることができるのは1つだけで、長さは60バイトprint超えることはできません。

  • これはであるため、創造的であり、単にgotoまたは単純なfor(i){if(i=4)print"Line1";if(i=3)...}

  • 2週間で最も支持された回答がこれに勝ちます。

  • あなたの出力はしなければならないことがLine4 Line3 Line2 Line1 OR Line4Line3Line2Line1 OR Line4\nLine3\nLine2\nLine1\n改行)であり、それがのみを実行することによって生成されなければならないprints後方。

ハッピーコーディング!

更新:コンテストは終了しました!皆さん、ありがとうございました :)


15
アラビア語はカウントされますか?:)

もちろん、仕様を満たすことができる場合:P
Vereos 14

1つのルールをすぐに明確にしたかった...「すべてに1つの印刷物しか含めることができない」と言うとき、コードファイルの1つのテキスト行または1つのLOC /ステートメントを意味しますか?
ルスラン14

コードのすべての行が一つだけの印刷を含めることができます
Vereos

コードレビューに合格する必要がありますか?実稼働コードに適していますか?
ランス14

回答:


183

Commodore 64 BASIC

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

83
今まで、行番号が必要な理由を理解できませんでした。
ウゴレン14

3
私は、キャラクターROM($ D000)をRAM($ 3000)にコピーし、文字ビットマップを "1" <-> "4"と "2" <-> "3"に交換してから、プログラムを順方向に実行することを提案しました。 。これはかわいいです。
マークラカタ

標準ツールを使用して示された順序でコードを実際に保存/ロードまたはリストすることはできません(間違いなくApple IIではできません)、あなたができることはコンソールにこれらの行を入力するだけですその順序で。それが許可されている場合、たとえばC#SendKeysライブラリを使用して、答えられた言語のいずれかでコードを別の順序で入力し、矢印キーで移動することはできません。
ランス14

109

PHP

虐待の優先順位... :-)

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

3
PHPではprint、perlのように式として使用できます。perlの戻り値は常に1です。!1戻りbool(false)文字列が空の文字列を返すとして入力、。PHPのより適切な制限echoは、print; ではなくを要求することです。上記は実際には1つのステートメントにすぎません。
プリモ

1
@ kuldeep.kambojこのようにグループ化されているだけprint ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));です。印刷文の右側にあるものはすべてその一部です。
bwoebi 14

4
それはすべてのバージョン3v4l.org/dpSpKで非常に印象的です!
アイスバーグ14

3
理解するまでしばらくかかりました(リンクを@eisbergに感謝します!)最初のprint関数が最初に呼び出されますが、内側(下位)printが既に呼び出されて完全に評価されるまで、印刷する必要があるものの評価を終了しません。そして、!sがそうでない場合は印刷し1つのを非表示にするだけです。素晴らしい、@ bwoebi!
sfarbota 14

1
@sfarbota読書ルールは難しい。一定。ありがとう:-)
bwoebi 14

76

C

未定義の動作は最も刺激的な動作です!

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

実際の出力は、コンパイラ、リンカ、オペレーティングシステム、およびプロセッサによって異なる場合があります。


22
これが実際にどのように機能するのか、まったくわからない+1。
svick 14

7
@svick:可変引数をサポートするために、ほとんどのCコンパイラーは関数引数を逆順にスタックに配置します(したがって、スタックの一番上の項目は常に最初の引数です)。つまり、同じ方法で引数を評価する可能性があります。もちろん、これは引数スタックに渡されることを前提としているため、新しいコンパイラではますます少なくなります。
Guntram Blohm 14

@GuntramBlohmが言ったように、基本的な考え方は、C関数パラメーターが右から左の順序でスタックにプッシュされることが多いということです(常にではありません)。これらは関数呼び出しであるため、関数はおそらく(必ずしもではありませんが)右から左にも呼び出されます。ただし、これはすべてC標準では定義されていないため、GCC 4では正しい結果が得られますが、実際の処理はコンパイラーと呼び出し規約に完全に委ねられています。
ニック

1
@fluffy:悲しいことに、それは他の方法です:Cは他のコンマとは異なり、arglistコンマをシーケンスポイントとして扱いませ
ウィリハムトットランド

6
@WillihamTotlandそれなら、私は本当に修正する必要があるコードを知っています...ありがとう
ふわふわ

74

Java

リフレクションを使用する

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

出力:

Line4
Line3
Line2
Line1

これがなぜ働くかの説明はここで見つけることができます


61
恐ろしい。私はそれが好きです。
ロジャーリンジョ14

4
+1人々は常に、java文字列は不変であると言っています。あなたは彼らがそうではないことを証明します。
ビクターStafusa 14

16
これはうれしいことですが、逆実行の要件は満たされていません。
トールビョーンラヴンアンデルセン

4
@ThorbjørnRavnAndersenshhhh ...あなたは彼らにそれを伝えることになっていない。:p
ダニー

5
@Victor Javaでは、文字列不変です。Stackoverflow全体に、「文字列は不変だと思った」などの質問があります。それらはリフレクションを使用し、不変に見えるようにします。Javaの約束は次のように機能します:「あなたが私たちのものを意図した方法で使うなら、私たちの主張は正しいと約束します。」リフレクションは、クラスの使用方法ではありません。
ジャスティン14

70

C(および並べ替えのPython)

質問形式に完全に適合するマクロを使用した新しいバージョン。Quincunxのコメントに続いreturnて、より良いものにするために追加しました。

Pythonでも動作しますが、正しい順序で印刷されます。

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

オリジナルバージョン-マクロ置換後の2つは実質的に同じです。

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

1
マクロの場合は+1。別のものを含めることもできます。次のようなものです#define } 0))));(Cでマクロがどのように機能するか正確にはわかりません)。そうすれば、mainメソッドにprintステートメントのみを含めることができます。
ジャスティン

@Quincunx、定義することはできませんが、定義する}ことはできますreturn。今ではほとんどポリグロットです- print構文はいくつかのスクリプト言語で動作し、#define多くの場合コメントですが、main(){..}見つけることができるどの言語でも動作しません。
ウゴレン14

1
@Quincunx、そして今では本当に多言語です。
ウゴレン14

最初の2つはスペースなしの作業をどのように定義しますか?それはなるだろうprintによって交換しますか"\n",printf(
phuclv 14年

@LưuVĩnhPhúc-スペースはオプションです。あなたが言うように置き換えます。
ウゴレン14年

61

ES6(後方モードを使用;)

うわー、ECMAScriptの設計者が後方モードを仕様の一部にしたとき、いくつかの驚くべき先見性を持っていたようです

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

出力(実際に評価):

"Line4Line3Line2Line1"

modeの構文に適合するためわずかな後方修正のみで、それはまさに要求された形式であることに注意してください。また、このモードは現時点で最新バージョンのFirefox のみサポートされていることに注意してください。

最後のメモ:実際には、後方モードはありません。しかし、これはまだFirefoxで実行される有効なスクリプトです(すべてをコピーします)。:D


ES6「緩いモード」

ボーナス:これは、後方モードを使用しないが、指定されたJS構文の順守に関係なく、JSエンジンがコードの動作を推測しようとする新しく指定された「緩いモード」を使用する更新バージョンです。基本的に厳密モードのアンチテーゼ):

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

現在、「緩いモード」はFirefox> = 34でのみ利用可能です。; P


7
投稿した3つのリンクはすべて404につながっています。この種の冗談ですか?
マナトワーク14

8
あ。なるほど。ここで構文ハイライターはあなたの共犯者でした。
マナトワーク14

12
これは、コンボ人気コンテストコードトローリングです。:) 大好きです。
チャールズではない

8
これはJavascriptの驚異的な乱用です。私はそれが好きです。
セイリア

2
こっそり。Soooo sneaky ....
デビッドコンラッド14

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

ルビー

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

編集:または、

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

printLine1(
printLine2(
printLine3(
printLine4)))

38
メタがあるのでこれが好きです
レイ

2
2つの解決策があった場合、通常は2つの回答を投稿しませんか?
TheConstructor 14

3
これrubyはコードブロックのように見えますか?pastebin.com/LDWpxKx8
manatwork

2
@PacManiこれらの括弧は空白を使用せず、空白を使用します。
corsiKa 14

@manatworkいいね!とはmethod_missingいえ、かなりRubyっぽいのだと思います。
histocrat

49

PHP

私は知っています、これは狂気です...

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
聞こえるのは、ダイクストラが墓の中で回転している音です。:
ガレス14

24
誰かが「創造的で、ただ書くのを避ける」と言ったと思ったgoto;-)
TheConstructor 14

22
@TheConstructorクリエイティブな部分はPHPで goto 使用しています ;)
NikiC 14

1
勝利でいっぱいです。
ニックT 14

41

ハスケル

プログラムは右から左への関数構成のように見えるため、これはほとんど慣用的なHaskellです。関数が出力されなかったが、(有用な)値を返すものであれば、演算子宣言は不要になり、コードはライブラリに表示されるものになります。

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

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

5
ヒント:(<<) = flip (>>)
ベルギ14

@Bergiそれはそれを書くもう一つの方法です。私は実際にプレリュードで定義されていなかったものを見て少し驚きました(またはControl.Monad)
shiona

@shiona:ええ、見逃すのは驚くべきことです。幸いなことに、Applicativesには両方の演算子があります:<**>
Tikhon Jelvis

@TikhonJelvis実際には、<*適用演算子はこれとは異なります<<a <* bと同等ですdo x<-a;b;return x。つまり、a効果が最初に実行されます
誇り高いhaskeller 14

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
これは、理論的に正確な逆の順序で印刷することは保証されません。
ランチャー14

4
@Cruncherは知っていますが、1秒のギャップがあるので、逆順以外で印刷する可能性は非常にわずかです。
ガレス14

3
私は理論的にはイタリック理由です@Gareth :)
たけ

3
@Cruncherそれがそんなに楽しいのではないですか?
ピエールアラード14

理論的には私の原子が壁を通過できるのと同じ方法で@Cruncher ?
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}

jsFiddleを参照してください。

編集:
より良いルールに準拠するように、ここで実際に使用していることを、XMLでの変異体です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>

style.cssはどこにあるべきか

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

CSSなしのHTML

そして、それのために、ここにCSSなしの1つがあります。

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

フィドル


2
誰もダウンボートを説明できますか?これは、印刷時に機能します。
ミスターリスター

また、できることp {float:right;}
Noyo

しかし、結果はすべて1行になります!
ミスターリスター

...それは許可されています。:]
ノヨ

1
...それは禁止されていません。:D divにラップしてCSSルールを追加することもできdiv {float:left}ます。
ノヨ

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

(ローカル変数は宣言の逆の順序で破棄されます。)

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

(ほぼ同じですが、代わりにラムダと配列データメンバーを使用します。)


を使用してソリューションを投稿しましたが、解決std::functionしようとしました。あなたはそれを手に入れたので、今は必要ありません!
-sergiol

21

ハスケル

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

1,2,3,4タイムアウトとして使用することもできます。(ただし、この動作がECMAScriptで標準化されているかどうかはわかりません。)
ComFreek 14

1
@ComFreek:setTimeoutESではなく、HTML5 /タイマーで標準化されています。また、4msの最小タイムアウトを指定します:
Bergi 14

1
@Bergiうん、もちろん正しい!HTML標準-タイマー -誰かが興味を持っている場合。
ComFreek 14

1
これを十分に遅いマシン(たとえば、他のいくつかのアプリケーションを実行している8086?)で実行すると、失敗します。(フェイルことで、私はそれが各ステートメントを実行する> = 100ミリ秒かかりますので、順序は、逆転されないという意味で。
ジェフ・デイビス

1
@ lastr2d2 whileループで遅いコンピューターをシミュレートすることはかなり主観的ですが、これはもっと似ていると思います:jsfiddle.net/7zbKw/1whatwg.org/specs/web-apps/current-work/multipage / ...からのメモ「このAPIは、タイマーがスケジュール通りに正確に実行されることを保証しません。CPU負荷、他のタスクなどによる遅延が予想されます。」
ジェフデイビス

20

C

可能な限り創造的な質問のヒントを無視しようとする:

#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
#defineの悪用:P +1
masterX244 14

15

BF

セルの折り返しを想定しています。

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

なぜ機能するのか

最初と最後の行は、4回繰り返されるループで構成されます(counter = cell0)。

ループ内には、cell1実行ごとに増加するカウンター変数()があります。

各行は、4、3、2、または1ずつ減少してゼロに等しいかどうかをチェックします。したがって、最初の実行ではカウンターは1で最後の行が実行され、2回目の実行では3番目の行が実行されます。

(line 1)あなたが印刷されたテキストを作成する必要があります示しています。ループ内の矢印は、cell2この目的のために割り当てられます。[-]一掃cell2あなたがそれを使用した後。


14

バッシュ

尊敬されるSleepSortSleepAddを記念して、私はあなたにプレゼントを... SleepReverse

#!/bin/bash

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

print 1
print 2
print 3
print 4

それはより多くのスペックに見えるようにするために、使用$1して$2function 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();
  }
}

それはすべて正しいタイミングです... ;-)


行は隣接している必要があります。
ティムテック14

それらは、codegolf.stackexchange.com / a / 20660/16293などと同じように隣接しているため、同じように見えると言う人はいません。いくつかの改行文字を削除します;-)
TheConstructor 14

わかりました、すばらしい:
ティムテック


12

バッシュ

ここに両面スクリプトがあります。

#!/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
tac存在すら知らなかった!ハハ、ありがとう。
ノヨ

11

Common Lisp№1

ngorpフォームを逆順で実行するマクロを書くのは簡単です:

(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

Common Lisp№2

これは文字通り非常に問題が多いものです。質問のコードは修正なしでプログラムに表示されます。

(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

別のevalバリアント:

$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
スリック!それにもかかわらず、私はこれが本当に悪い考えであることを指摘せざるを得ない気がします。
デビッドクリザニアック14

9

F#

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

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

関数を逆順に実行するカスタム演算子を作成しました。


3
私はかなり確信しています(?)f(g(x))= g(x); f(x)は計算であり、プログラミングではありません。
ジェフデイビス

2
@JeffDavis:かなり確信(?) f g xとほぼ読み込み(?)(f, g, x)、ないf(g(x))
エリック・

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

試してみてください:http : //play.golang.org/p/fjsJLwOFn2


まったく同じコードを投稿したかった。文字通り、バイトごとにまったく同じです。
アート

@アート、素晴らしい!コードゴルフでもっと多くの囲usedが使用されることを期待しています。
cory.todd 14

おそらく起こらないでしょう。Goは圧縮されたものとしてはあまり良くありません。それらは奇妙な構造を意図的に制限しているので、読みにくい混乱を作成することはできません。ただし、この場合(および他の人気コンテスト)にはチャンスがあります。
アート

8

Python3

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

最後の行のすべてのスペースを削除することにより、6バイト短くすることができます。


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

std::reverseandの代わりにstd::for_each、単に使用しますwhile (! functors.empty()) { functors.back()(); functors.pop_back(); }
デビッドハンメン

7

バッチ

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

codegolfへようこそ!素敵な投稿。
ランチャー

7

C#

Runメソッドを直接呼び出す代わりに、ロード文字列オペコードオペランドがスワップされることを除いて、RunのILバイトコードのコピーを含む動的メソッドを作成しています。これにより、新しいメソッドは文字列を逆順に表示します。

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

Python

さらに別のソリューションを使用して eval()

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

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

それほど複雑ではありませんが、理解しやすいです。


2
私が理解できる唯一のコード:D
モルドベアン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.