Drucke rückwärts ausführen


102

Ihre Aufgabe ist es, die Reihenfolge umzukehren, in der einige printsausgeführt werden.


Specs:
Ihr Code wird in dieser Form sein:

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

Sie müssen diese Zeichenfolgen von der vierten bis zur ersten Zeichenfolge print(oder echooder writeoder eine gleichwertige Zeichenfolge) eingeben .

  • Sie entscheiden, welche Zeilen Ihres Programms printdie Zeichenfolgen enthalten müssen, aber sie müssen benachbart sein .

  • Jede Zeile kann nur eine enthalten printund darf nicht länger als 60 Byte sein .

  • Da dies ein , sei kreativ und vermeide es, nur ein gotooder ein einfaches zu schreibenfor(i){if(i=4)print"Line1";if(i=3)...}

  • Die am besten bewertete Antwort in 2 Wochen gewinnt dies.

  • Ihre Ausgabe MUST seine Line4 Line3 Line2 Line1 OR Line4Line3Line2Line1 OR Line4\nLine3\nLine2\nLine1 (wobei \neine Neue - Zeile ist), und es muß nur die erzeugt wird durch die Ausführung printsnach hinten.

Viel Spaß beim Codieren!

UPDATE: Wettbewerb ist vorbei! Danke euch allen :)


15
Zählt Arabisch? :)

Wenn Sie in der Lage sind, die Spezifikationen zu erfüllen, natürlich: P
Vereos

Wollten Sie schnell eine Regel klarstellen ... Wenn Sie sagen "Jedes Like kann nur einen Ausdruck enthalten", meinen Sie dann eine Textzeile in der Codedatei oder eine LOC / Anweisung?
Ruslan

Jede Codezeile kann nur einen Abdruck enthalten
Vereos

Muss es eine Codeüberprüfung bestehen - passend zum Seriencode?
Lance

Antworten:


183

Commodore 64 BASIC

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

83
Ich habe bis jetzt nie herausgefunden, warum Zeilennummern benötigt werden.
Ugoren

3
Ich wollte vorschlagen, Zeichen-ROM ($ D000) in RAM ($ 3000) zu kopieren, Zeichen-Bitmaps gegen "1" <-> "4" und "2" <-> "3" auszutauschen und dann das Programm in Vorwärtsreihenfolge auszuführen . Das ist niedlicher.
Mark Lakata

Ich bin mir ziemlich sicher, dass Sie den Code nicht in der angegebenen Reihenfolge mit den Standardtools speichern / laden oder anderweitig auflisten können (auf jeden Fall nicht mit Apple II). Sie könnten nur diese Zeilen in die Konsole eingeben in dieser Reihenfolge. Und wenn das erlaubt ist, können Sie nicht einfach die C # SendKeys-Bibliothek verwenden, um Code in einer der beantworteten Sprachen in einer anderen Reihenfolge mit Pfeiltasten einzugeben.
Lance

108

PHP

Vorrang missbrauchen ... :-)

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

3
printKann in PHP wie in Perl als Ausdruck verwendet werden, dessen Rückgabewert immer ist 1. !1Rückgabe bool(false), die bei Eingabe als Zeichenfolge die leere Zeichenfolge zurückgibt. Eine geeignetere Einschränkung für PHP könnte darin bestehen, echoeher zu verlangen als print; das obige ist wirklich nur eine Aussage.
Primo

1
@ kuldeep.kamboj Es ist einfach so gruppiert: print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));- Alles, was auf der rechten Seite einer Print-Anweisung steht, ist Teil davon.
bwoebi

4
Es scheint in jeder Version zu arbeiten 3v4l.org/dpSpK sehr beeindruckend!
Eisberg

3
Ich habe eine Weile gebraucht, um zu verstehen (Danke @eisberg für den Link!), Aber ich verstehe es jetzt. Während der erste zuerst printaufgerufen wird, wird das Drucken erst beendet, wenn die inneren (unteren) Werte printbereits aufgerufen und vollständig ausgewertet wurden. Und die !s sollen nur die Einsen verbergen, die sonst gedruckt würden. Genial, @bwoebi!
Farbota

1
@sfarbota Leseregeln sind schwer. Fest. Vielen Dank :-)
bwoebi

76

C

Undefiniertes Verhalten ist die aufregendste Art von Verhalten!

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

Die tatsächliche Ausgabe kann je nach Compiler, Linker, Betriebssystem und Prozessor variieren :)


22
Ich habe absolut keine Ahnung, wie das eigentlich funktioniert, +1.
Svick

7
@svick: Um varargs zu unterstützen, setzen die meisten C-Compiler Funktionsargumente in umgekehrter Reihenfolge auf den Stapel (das oberste Element auf dem Stapel ist also immer das erste Argument), was bedeutet, dass sie Argumente wahrscheinlich auf dieselbe Weise auswerten. Natürlich setzt dies voraus , Argumente sind auf dem Stack übergeben , die mit neueren Compiler immer weniger der Fall wird.
Guntram Blohm

Wie @GuntramBlohm sagte, besteht die Grundidee darin, dass C-Funktionsparameter häufig (aber nicht immer) in einer Reihenfolge von rechts nach links auf den Stapel geschoben werden. Da es sich um Funktionsaufrufe handelt, werden die Funktionen wahrscheinlich (aber nicht unbedingt) auch von rechts nach links aufgerufen. All dies ist jedoch nicht durch den C-Standard definiert, so dass es zwar das richtige Ergebnis in GCC 4 liefert, es jedoch ganz dem Compiler und der Aufrufkonvention überlassen bleibt, was tatsächlich passiert.
Nick

1
@fluffy: Ach, ist es umgekehrt: C nicht nicht behandeln arglist Kommas als Sequenzpunkte, im Gegensatz zu anderen Kommas.
Williham Totland

6
@ WillihamTotland Nun, dann kenne ich einen Code, den ich wirklich reparieren muss ... Danke
flauschig

74

Java

Reflexion verwenden

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

Ausgabe:

Line4
Line3
Line2
Line1

Eine Erklärung, warum dies funktioniert, finden Sie hier .


61
Schrecklich. Ich mag das.
Roger Lindsjö

4
+1 Die Leute sagen immer, dass Java-Strings unveränderlich sind. Sie beweisen, dass sie nicht sind.
Victor Stafusa

16
Dies ist erfreulich böse, aber die Anforderung der umgekehrten Ausführung ist nicht erfüllt.
Thorbjørn Ravn Andersen

4
@ ThorbjørnRavnAndersen shhhh ... du sollst ihnen das nicht sagen. : p
Danny

5
@Victor In Java Strings sind unveränderlich. Überall im Stackoverflow gibt es Fragen wie "Ich dachte, Strings wären unveränderlich". Sie benutzen Reflexion und es lässt sie unveränderlich erscheinen. Javas Versprechen funktionieren folgendermaßen: "Wenn Sie unsere Sachen / Klassen so verwenden, wie wir es beabsichtigt haben, dann versprechen wir, dass unsere Behauptungen korrekt sind." Reflexion ist nicht die Art und Weise, wie Klassen verwendet werden sollen.
Justin

70

C (und eine Art Python)

Neue Version mit einem Makro, das perfekt zum Fragenformat passt. Nach dem Kommentar von Quincunx fügte ich hinzu return, um es schöner zu machen.

Es funktioniert auch in Python, wird jedoch in der richtigen Reihenfolge gedruckt.

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

Originalversion - die beiden sind nach Makrosubstitution praktisch gleich:

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

1
+1 für das Makro. Möglicherweise schließen Sie ein anderes mit ein; so etwas wie #define } 0))));(ich weiß nicht genau, wie Makros in C funktionieren). Auf diese Weise könnten Sie nur die print-Anweisungen in der main-Methode haben, sonst nichts.
Justin

@Quincunx, du kannst nicht definieren }, aber du kannst definieren return, was ich jetzt getan habe. Es ist jetzt fast printmehrsprachig - die Syntax funktioniert in mehreren Skriptsprachen, #defineist oft ein Kommentar, main(){..}funktioniert aber in keiner Sprache, die ich finden könnte.
Ugoren

1
@Quincunx, und jetzt ist es wirklich ein Polyglott.
Ugoren

Wie funktionieren die ersten beiden Definitionen ohne Leerzeichen? Würde es machen print, ersetzt zu werden durch "\n",printf(?
Phuclv

@ LưuVĩnhPhúc - Das Leerzeichen ist optional. Es ersetzt, wie Sie sagen.
Ugoren

61

ES6 (im Rückwärtsmodus;)

Wow, es sieht so aus, als ob die Designer von ECMAScript eine unglaubliche Voraussicht hatten, als sie den Rückwärtsmodus zu einem Teil der Spezifikation machten :

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

Ausgabe (Bewertung, wirklich):

"Line4Line3Line2Line1"

Beachten Sie, dass es genau der gewünschten Form entspricht und nur eine geringfügige Rückwärtsbewegung vorliegt, um der Syntax des Modus zu entsprechen . Beachten Sie auch, dass dieser Modus derzeit nur in neueren Versionen von Firefox unterstützt wird .

Letzte Anmerkung: Eigentlich gibt es keinen Rückwärtsmodus. Dies ist jedoch immer noch ein gültiges Skript, das in Firefox ausgeführt wird (kopieren Sie das Ganze). : D


ES6 "lax mode"

BONUS : Hier ist eine aktualisierte Version, die nicht den Rückwärtsmodus verwendet, sondern den neu festgelegten "Lax-Modus", in dem die JS-Engine nur versucht, zu erraten, was der Code tun soll, unabhängig von der Einhaltung der angegebenen JS-Syntax ( im Grunde das Gegenteil von Strict Mode):

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

Bitte beachten Sie, dass " lax mode " derzeit nur in Firefox> = 34 verfügbar ist.; P


7
Alle 3 Links, die Sie gepostet haben, führen zu 404. Ist das ein Witz?
Manatwork

8
Ah. Ich sehe jetzt. Der Syntax-Textmarker war hier Ihr Komplize.
Manatwork

12
Dies ist ein Combo- Popularitätswettbewerb und Code-Trolling , oder? :) Ich liebe es.
Nicht dass Charles

8
Dies ist ein phänomenaler Missbrauch von Javascript. Ich mag das.
Seiyria

2
Hinterhältig. Soooo hinterhältig ...
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

Rubin

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

Bearbeiten: Alternativ

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

printLine1(
printLine2(
printLine3(
printLine4)))

38
Ich bevorzuge diese , weil es Meth
Ray

2
Würdest du nicht normalerweise zwei Antworten posten, wenn du zwei Lösungen hättest?
TheConstructor

3
Würde das rubymit Codeblöcken nicht mehr aussehen? pastebin.com/LDWpxKx8
Manatwork

2
@ PacMani diese Parens verwenden keinen Leerraum, sie verwenden Leerraum.
corsiKa

@manatwork schön! Ich finde method_missinges allerdings ziemlich rubinrot.
Histokrat

49

PHP

Ich weiß, das ist Wahnsinn ...

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
Das Geräusch, das Sie hören, ist, dass Dijkstra sich in seinem Grab dreht. :-)
Gareth

24
Dachte, jemand sagte: "Sei kreativ und vermeide es, nur einen zu schreiben goto" ;-)
TheConstructor

22
@TheConstructor Der kreative Teil verwendet goto in PHP ;)
NikiC

1
So voller Siege.
Nick T

41

Haskell

Dies ist beinahe idiomatisch für Haskell, da das Programm jetzt wie eine Komposition von rechts nach links aussieht. Wenn die Funktion nicht print wäre, aber einen (nützlichen) Wert zurückgeben würde, wäre die Operatordeklaration unnötig und der Code wäre etwas, das Sie in Bibliotheken sehen würden.

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

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

5
Tipp:(<<) = flip (>>)
Bergi

@Bergi Das ist eine andere Art, es zu schreiben, ich denke sogar ein bisschen eleganter. Ich war tatsächlich ein wenig überrascht zu sehen, dass das Ding nicht im Vorspiel (oder Control.Monad) definiert war
Shiona

@shiona: Ja, es ist eine überraschende Sache, die man verpassen sollte. Glücklicherweise haben wir beide Operatoren für Applicatives: <*und *>.
Tikhon Jelvis

@TikhonJelvis tatsächlich ist der anwendende <*Operator anders als dieser <<: a <* bentspricht do x<-a;b;return x, dh es läuft ader Effekt zuerst
stolzer 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();

22
Es wird theoretisch nicht garantiert, dass der Ausdruck in genau umgekehrter Reihenfolge erfolgt.
Cruncher

4
@Cruncher Ich weiß, aber mit 1 Sekunde Abstand sind die Chancen, dass es in etwas anderem als der umgekehrten Reihenfolge gedruckt wird, ziemlich gering.
Gareth

3
@ Gareth Deshalb habe ich theoretisch kursiv geschrieben :)
Cruncher

3
@Cruncher Macht das nicht so viel Spaß?
Pierre Arlaud

@Cruncher auf die gleiche Weise, wie theoretisch meine Atome eine Wand passieren könnten?
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}

Siehe jsFiddle .

Bearbeiten:
Um den Regeln besser zu entsprechen, gibt es hier eine Variante in XML, die tatsächlich verwendet wird 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>

wo style.css sein sollte

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

HTML ohne CSS

Und zum Teufel, hier ist eine ohne 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>

Geige .


2
Kann jemand die Ablehnung erklären? Das funktioniert beim Drucken, wissen Sie.
Mr Lister

Sie können auch nur tunp {float:right;}
Noyo

Aber dann werden die Ergebnisse alle in einer Zeile sein!
Mr Lister

... und das ist erlaubt. :]
Noyo

1
... und das ist nicht verboten. : D Sie können es auch in ein div einschließen und die CSS-Regel hinzufügen 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";
}

(Lokale Variablen werden in umgekehrter Reihenfolge der Deklaration zerstört.)

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

(Ähnlich, aber mit Lambdas und einem Array-Datenelement.)


Ich habe eine Lösung mit gepostet std::functionund versucht, sie loszuwerden. Jetzt brauche ich nicht, weil du es hast!
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);

Die Verwendung 1,2,3,4als Timeout funktioniert auch bei mir. (Allerdings weiß ich nicht, ob dieses Verhalten in ECMAScript standardisiert ist.)
ComFreek

1
@ComFreek: setTimeoutist in HTML5 / Timern standardisiert, nicht in ES. Außerdem gibt es eine minimale Zeitüberschreitung von 4 ms :-)
Bergi

1
@Bergi Ja, du hast natürlich recht! HTML Standard - Timer - wenn jemand interessiert ist.
ComFreek

1
Führen Sie dies auf einem ausreichend langsamen Computer aus (z. B. einem 8086, auf dem mehrere andere Anwendungen ausgeführt werden?), Und es wird fehlschlagen. (Ich meine, die Reihenfolge wird nicht rückgängig gemacht, da die Ausführung jeder Anweisung> = 100 ms dauert.
Jeff Davis,

1
@ lastr2d2 Einen langsamen Computer mit while-Schleifen zu simulieren ist ziemlich subjektiv, aber ich denke, das wäre eher so: jsfiddle.net/7zbKw/1 . Hinweis von whatwg.org/specs/web-apps/current-work/multipage/… "Diese API garantiert nicht, dass die Timer exakt nach Zeitplan ausgeführt werden. Verzögerungen aufgrund von CPU-Auslastung, anderen Aufgaben usw. sind zu erwarten."
Jeff Davis

20

C

Der Versuch, den Tipps in der Frage so kreativ wie möglich zu trotzen:

#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
netter Missbrauch eines #define: P +1
masterX244

15

BF

Übernimmt die Zellenumhüllung.

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

Warum es funktioniert

Die erste und die letzte Zeile bestehen aus einer Schleife, die sich viermal wiederholt (counter = cell0).

Innerhalb der Schleife gibt es eine Zählervariable ( cell1), die bei jedem Durchlauf erhöht wird.

Jede Zeile prüft, ob eine Verringerung um vier, drei, zwei oder eins gleich Null ist. Daher ist der Zähler beim ersten Durchlauf eins und die letzte Zeile wird ausgeführt, beim zweiten Durchlauf wird die dritte Zeile usw. ausgeführt.

Das (line 1)zeigt, wo Sie den Text machen sollen, der gedruckt wird. Die Pfeile in den Schleifen weisen cell2diesem Zweck zu. Das [-]Gerät wird cell2nach Gebrauch gereinigt.


14

Bash

In Erinnerung an die verehrten SleepSort und SleepAdd präsentiere ich Ihnen ... SleepReverse :

#!/bin/bash

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

print 1
print 2
print 3
print 4

Verwenden Sie $1und , um den Spezifikationen $2function print(){(sleep $((4-$2));echo "$1 $2";)&}; print Line 1
näher zu kommen

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

Es ist alles zum richtigen Zeitpunkt ... ;-)


Die Linien müssen nebeneinander liegen.
Timtech

Sie sind nicht weniger benachbart als zB bei codegolf.stackexchange.com/a/20660/16293. Niemand hat gesagt, sie sollten gleich aussehen. Entfernt ein paar Zeilenumbrüche ;-)
TheConstructor

Okay, großartig :-)
Timtech

12

Python 3

import atexit

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

12

Bash

Hier kommt das doppelseitige Skript:

#!/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
Ich wusste gar nicht, dass es tacexistiert! Haha danke.
Noyo

11

Common Lisp № 1

Es ist einfach, ein ngorpMakro zu schreiben , das seine Formulare in umgekehrter Reihenfolge ausführt:

(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

Hier ist eine, die das Problem sehr wörtlich nimmt; Der Code aus der Frage erscheint im Programm ohne Änderung:

(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

Eine andere evalVariante:

$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
Glatt! Dennoch bin ich gezwungen, darauf hinzuweisen, dass dies eine wirklich schlechte Idee ist.
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") ""

Soeben wurde ein benutzerdefinierter Operator erstellt, der Funktionen in umgekehrter Reihenfolge ausführt.


3
Ich bin mir ziemlich sicher (?) F (g (x)) = g (x); f (x) ist Kalkül und keine Programmierung.
Jeff Davis

2
@ JeffDavis: Ziemlich sicher (?) f g xliest sich ungefähr so (?)(f, g, x), nichtf(g(x))
Eric

9

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

Probieren Sie es aus: http://play.golang.org/p/fjsJLwOFn2


Ich wollte genau den gleichen Code posten. Buchstäblich Byte für Byte genau das gleiche.
Kunst

@Art, großartig! Ich hoffe, mehr Go in Code Golf zu sehen.
cory.todd

Wird wahrscheinlich nicht passieren. Go ist nicht wirklich gut, wenn es komprimiert ist. Sie begrenzen absichtlich seltsame Konstruktionen, sodass Sie kein unlesbares Durcheinander schaffen können. Aber in diesem Fall (und vielleicht bei anderen Beliebtheitswettbewerben) hat es eine Chance.
Art

8

Python3

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

Kann durch Entfernen aller Leerzeichen in der letzten Zeile um 6 Byte kürzer sein.


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

Verwenden Sie anstelle von std::reverseund std::for_eacheinfachwhile (! functors.empty()) { functors.back()(); functors.pop_back(); }
David Hammen

7

Stapel

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

Willkommen bei Codegolf! Netter Post.
Cruncher

7

C #

Anstatt die Run-Methode direkt aufzurufen, erstelle ich eine dynamische Methode, die eine Kopie des IL-Bytecodes von Run enthält, mit der Ausnahme, dass die Opcode-Operanden der Ladezeichenfolge ausgetauscht werden. Dadurch zeigt die neue Methode die Zeichenfolgen in umgekehrter Reihenfolge an.

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

noch eine andere lösung mit eval()

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

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

es ist nicht sehr komplex, aber leicht zu verstehen.


2
Der einzige Code, den ich verstehe: D
Moldauische
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.