Wykonywanie wydruków wstecz

102

Twoim zadaniem jest odwrócenie kolejności printswykonywania niektórych .


Specyfikacja:
Twój kod będzie w tej formie:

//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ędziesz musiał print(lub echo, lub writerównoważny) te ciągi znaków od czwartego do pierwszego.

  • Ty decydujesz, które wiersze twojego programu muszą printbyć łańcuchami, ale muszą być one przyległe ;

  • Każda linia może zawierać tylko jeden printi nie może przekraczać 60 bajtów ;

  • Ponieważ jest to , bądź kreatywny i unikaj pisania gotoprostych lub prostych rzeczyfor(i){if(i=4)print"Line1";if(i=3)...}

  • Wygrywa to najbardziej pozytywna odpowiedź za 2 tygodnie.

  • Twój wynik MUSI być Line4 Line3 Line2 Line1 OR Line4Line3Line2Line1 LUB Line4\nLine3\nLine2\nLine1 (gdzie \njest nowy wiersz) i musi być wygenerowany tylko przez wykonanie go printswstecz.

Miłego kodowania!

AKTUALIZACJA: Konkurs się zakończył! Dziękuję wam wszystkim :)

Vereos
źródło
15
Czy arabski się liczy? :)
Jeśli jesteś w stanie spełnić specyfikacje, oczywiście: P
Vereos
Czy chciałeś szybko wyjaśnić jedną zasadę ... Kiedy mówisz „Każdy taki może zawierać tylko jeden wydruk”, czy masz na myśli jedną linię tekstową w pliku kodu lub jedną instrukcję LOC /?
Ruslan
Każdy wiersz kodu może zawierać tylko jeden wydruk
Vereos
czy musi przejść przegląd kodu - odpowiedni dla kodu produkcyjnego?
Lance

Odpowiedzi:

183

Commodore 64 BASIC

40 print "Line 1"
30 print "Line 2"
20 print "Line 3"
10 print "Line 4"
Danko Durbić
źródło
83
Do tej pory nie mogłem zrozumieć, dlaczego potrzebne są numery linii.
ugoren
3
Zamierzałem zaproponować, skopiowanie ROM postaci ($ D000) do RAM (3000 $), zamianę bitmap znakowych na „1” <-> „4” i „2” <-> „3”, a następnie uruchomienie programu w kolejności do przodu . To jest ładniejsze.
Mark Lakata
Jestem prawie pewien, że nie możesz zapisać / załadować lub w inny sposób wyświetlić kodu w kolejności pokazanej przy użyciu standardowych narzędzi (na pewno i tak nie można tego zrobić w Apple II), wszystko co możesz zrobić, to wpisać te wiersze w konsoli w tej kolejności. A jeśli jest to dozwolone, nie możesz po prostu użyć np. Biblioteki C # SendKeys do wpisania kodu w jednym z odpowiedzi na języki w innej kolejności, używając klawiszy strzałek do poruszania się.
Lance
108

PHP

Nadużywanie pierwszeństwa ... :-)

!print "Line1\n".
!print "Line2\n".
!print "Line3\n".
!print "Line4\n";
Bwoebi
źródło
3
W PHP printmoże być użyte jako wyrażenie, ponieważ może być w perlu, którego wartością zwracaną jest zawsze 1. !1zwraca bool(false), który po wpisaniu jako ciąg zwraca pusty ciąg. Bardziej właściwym ograniczeniem dla PHP może być wymaganie echozamiast print; powyższe tak naprawdę jest tylko jednym stwierdzeniem.
primo
1
@ kuldeep.kamboj Po prostu zgrupowano w ten sposób: print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));- wszystko, co jest po prawej stronie instrukcji print, jest jej częścią.
bwoebi
4
Wydaje się, że działa w każdej wersji 3v4l.org/dpSpK bardzo imponujące!
eisberg
3
Zajęło mi trochę czasu, aby zrozumieć (dzięki @eisberg za link!), Ale teraz rozumiem. Chociaż pierwszy printjest nazywany pierwszym, nie kończy ewaluacji tego, co musi wydrukować, dopóki wewnętrzne (niższe) prints nie zostaną już wywołane i w pełni ocenione. I !są tylko po to, aby ukryć jedynki, które wydrukowałyby inaczej. Genialne, @bwoebi!
sfarbota
1
@sfarbota Zasady czytania są trudne. Naprawiony. Dziękuję :-)
bwoebi
76

do

Nieokreślone zachowanie jest najbardziej ekscytującym rodzajem zachowania!

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

Rzeczywista wydajność może się różnić w zależności od kompilatora, konsolidatora, systemu operacyjnego i procesora :)

Nacięcie
źródło
22
Nie mam absolutnie pojęcia, jak to właściwie działa, +1.
svick
7
@svick: w celu obsługi varargs większość kompilatorów C umieszcza argumenty funkcji na stosie w odwrotnej kolejności (więc najwyższy element na stosie jest zawsze pierwszym argumentem), co oznacza, że ​​prawdopodobnie będą one oceniać argumenty w ten sam sposób. Oczywiście zakłada to, że argumenty przekazywane na stos, co staje się coraz rzadsze w przypadku nowszych kompilatorów.
Guntram Blohm
Jak powiedział @GuntramBlohm, podstawową ideą jest to, że parametry funkcji C są często (ale nie zawsze) wypychane na stos w kolejności od prawej do lewej. Ponieważ są to wywołania funkcji, funkcje są prawdopodobnie (ale niekoniecznie) wywoływane również od prawej do lewej. Wszystko to nie jest zdefiniowane przez standard C, więc choć zdarza się, że daje to właściwy wynik w GCC 4, to całkowicie zależy od kompilatora i konwencji wywoływania, co się właściwie dzieje.
Nick
1
@fluffy: Niestety, jest na odwrót: C nie traktuje przecinków arglist jako punktów sekwencji, w przeciwieństwie do innych przecinków.
Williham Totland
6
@WillihamTotland dobrze, więc znam kod, który naprawdę muszę naprawić ... dzięki
puszysty
74

Jawa

Korzystanie z odbicia

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

Wynik:

Line4
Line3
Line2
Line1

Wyjaśnienie, dlaczego to działa, można znaleźć tutaj .

Danny
źródło
61
Okropny. Lubię to.
Roger Lindsjö,
4
+1 Ludzie zawsze mówią, że ciągi java są niezmienne. Udowadniasz, że nie są.
Victor Stafusa
16
Jest to cudownie paskudne, ale wymóg odwrotnego wykonania nie jest spełniony.
Thorbjørn Ravn Andersen
4
@ ThorbjørnRavnAndersen shhhh ... nie powinieneś im tego mówić. : p
Danny
5
@Victor W Javie ciągi znaków niezmienne. W całym Stackoverflow pojawiają się pytania typu „Myślałem, że ciągi są niezmienne”. Używają refleksji, dzięki czemu wydają się niezmienne. Obietnice Javy działają w następujący sposób: „Jeśli korzystasz z naszych rzeczy / klas w sposób, jaki zamierzaliśmy, obiecujemy, że nasze twierdzenia są prawidłowe”. Refleksja nie jest sposobem użycia klas.
Justin
70

C (i sortowanie Pythona)

Nowa wersja, wykorzystująca makro idealnie pasujące do formatu pytania. Po komentarzu Quincunx dodałem, returnżeby było ładniej.

Działa również w Pythonie, ale drukuje we właściwej kolejności.

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

Wersja oryginalna - obie są praktycznie takie same, po zastąpieniu makra:

main(){
    printf("Line 1\n",
    printf("Line 2\n",
    printf("Line 3\n",
    printf("Line 4\n",
    0))));
}
ugoren
źródło
1
+1 dla makra. Może zawierać inny; coś w stylu #define } 0))));(nie wiem dokładnie, jak działają makra w C). W ten sposób możesz mieć po prostu instrukcje print w metodzie głównej, nic więcej.
Justin
@Quincunx, nie możesz zdefiniować }, ale możesz zdefiniować return, co teraz zrobiłem. Teraz jest prawie poliglotą - printskładnia działa w kilku językach skryptowych, #defineczęsto jest komentarzem, ale main(){..}nie działa w żadnym języku, który mógłbym znaleźć.
ugoren
1
@Quincunx, a teraz to naprawdę poliglota.
ugoren
jak działają pierwsze dwie definicje bez spacji? Czy printzastąpiłoby go to "\n",printf(?
phuclv
@ LưuVĩnhPhúc - Miejsce jest opcjonalne. Zastępuje jak mówisz.
ugoren
61

ES6 (przy użyciu trybu wstecz;)

Wow, wygląda na to, że projektanci ECMAScript mieli niesamowitą dalekowzroczność, kiedy włączyli tryb wsteczny do specyfikacji:

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

Wynik (ocena, naprawdę):

"Line4Line3Line2Line1"

Zauważ, że jest to dokładnie żądana forma, z jedynie niewielkim wstecznym dopasowaniem, aby dopasować składnię trybu . Należy również zauważyć, że tryb ten jest obsługiwany tylko w nowszych wersjach Firefoksa w tej chwili .

Uwaga końcowa: w rzeczywistości nie ma trybu wstecznego. Ale nadal jest to prawidłowy skrypt działający w Firefoksie (skopiuj całość). :RE


ES6 „tryb lax”

BONUS : Oto zaktualizowana wersja, która nie korzysta z trybu wstecz, ale używa nowo określonego „trybu lax”, w którym silnik JS po prostu spróbuje odgadnąć, co powinien zrobić kod, bez względu na przestrzeganie określonej składni JS ( w zasadzie antyteza trybu ścisłego):

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

Należy pamiętać, że „ tryb lax ” jest obecnie dostępny tylko w przeglądarce Firefox> = 34.; P

Noyo
źródło
7
Wszystkie 3 zamieszczone linki prowadzą do 404. Czy to taki żart?
manatwork
8
Ach Teraz widzę. Podświetlacz składni był twoim wspólnikiem tutaj.
manatwork
12
To jest konkurs popularności i trollowanie kodu , prawda? :) Kocham to.
Nie, że Charles
8
To fenomenalne nadużycie Javascript. Lubię to.
Seiyria
2
Podstępny. Soooo sneaky ....
David Conrad
59

do

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
źródło
56

Rubin

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

Edycja: Alternatywnie

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

printLine1(
printLine2(
printLine3(
printLine4)))
histocrat
źródło
38
Wolę to, ponieważ ma met
Ray
2
Czy normalnie nie opublikowałbyś dwóch odpowiedzi, gdybyś miał dwa rozwiązania?
TheConstructor
3
Czy nie wyglądałoby to bardziej ruby-zabawnie z blokami kodu? pastebin.com/LDWpxKx8
manatwork
2
@PacMani te pareny nie używają białych znaków, używają białych znaków.
corsiKa
@manatwork nice one! Myślę method_missingjednak, że sama w sobie jest dość Rubinowa.
histocrat
49

PHP

Wiem, że to szaleństwo ...

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
źródło
66
Ten dźwięk, który słyszysz, wiruje w jego grobie Dijkstra. :-)
Gareth
24
Myślałem, że ktoś powiedział „bądź kreatywny i unikaj pisania tylko goto” ;-)
TheConstructor
22
@TheConstructor Część kreatywna używa goto w PHP ;)
NikiC
1
Tak pełne zwycięstwa.
Nick T
41

Haskell

To prawie idiomatyczny Haskell, ponieważ program wygląda teraz jak kompozycja funkcji od prawej do lewej. Gdyby funkcja nie była wypisana, ale coś, co zwróciłoby (użyteczną) wartość, deklaracja operatora byłaby niepotrzebna, a kod byłby czymś, co można zobaczyć w bibliotekach.

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

main = putStrLn "Line1"
    << putStrLn "Line2"
    << putStrLn "Line3"
    << putStrLn "Line4"
shiona
źródło
5
wskazówka:(<<) = flip (>>)
Bergi
@Bergi To inny sposób, aby to napisać, myślę, że jest nawet trochę bardziej elegancki. Byłem trochę zaskoczony, widząc, że rzecz nie została zdefiniowana w preludium (lub Control.Monad)
shiona
@shiona: Tak, zaskakującą rzeczą jest przeoczyć. Na szczęście mamy obu operatorów dla Wnioskodawców: <*i *>.
Tikhon Jelvis
@ TikhonJelvis, w <*rzeczywistości operator aplikacji jest inny niż ten <<: a <* bjest równoważny do x<-a;b;return x, tj. aNajpierw działa , efekt
dumny 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
źródło
22
Jest to teoretycznie nie gwarantuje wydrukowania w dokładnie odwrotnej kolejności.
Cruncher
4
@Cruncher Wiem, ale z 1 sekundowymi przerwami szanse na wydrukowanie w czymkolwiek innym niż w odwrotnej kolejności są dość niewielkie.
Gareth
3
@Gareth Dlatego kursywą teoretycznie :)
Cruncher
3
@Cruncher Czy to nie sprawia, że ​​jest to tak zabawne?
Pierre Arlaud
@Cruncher w taki sam sposób, w jaki teoretycznie moje atomy mogłyby przechodzić przez ścianę?
zmiana
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}

Zobacz jsFiddle .

Edycja:
Aby lepiej dostosować się do reguł, oto wariant XML, który faktycznie używa 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>

gdzie powinien być style.css

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

HTML bez CSS

I do cholery, oto jedna bez 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 .

Pan Lister
źródło
2
Czy ktoś może wyjaśnić opinię negatywną? Wiesz, działa to podczas drukowania.
Pan Lister
Możesz także zrobićp {float:right;}
Noyo
Ale wtedy wyniki będą w jednym wierszu!
Pan Lister
... i to jest dozwolone. :]
Noyo
1
... i to nie jest zabronione. : D Możesz również zawinąć go w div i dodać regułę 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";
}

(Zmienne lokalne są niszczone w odwrotnej kolejności do deklaracji.)

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

(Tak samo, ale zamiast tego używa lambdas i elementu danych tablicy).

ecatmur
źródło
Użyłem rozwiązania std::functioni próbowałem się go pozbyć. Teraz nie potrzebuję, bo masz to!
sergiol
21

Haskell

main = sequence_ $ reverse [
    putStr "Line1",
    putStr "Line2",
    putStr "Line3",
    putStr "Line4"]
mniip
źródło
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
źródło
Używanie 1,2,3,4jako limitów czasu również działa dla mnie. (Nie wiem jednak, czy to zachowanie jest ustandaryzowane w
skrypcie ECMAS
1
@ComFreek: setTimeoutjest standaryzowany w HTML5 / timerach , a nie w ES. Określa również minimalny limit czasu wynoszący 4 ms :-)
Bergi
1
@Bergi Tak, oczywiście masz rację! Standard HTML - Timery - jeśli ktoś jest zainteresowany.
ComFreek
1
Uruchom to na wystarczająco wolnym komputerze (powiedzmy, 8086 z kilkoma innymi aplikacjami?), A zakończy się niepowodzeniem. (Niepowodzenie, mam na myśli, że kolejność nie zostanie odwrócona, ponieważ wykonanie każdej instrukcji zajmie> = 100ms.
Jeff Davis
1
@ lastr2d2 Symulowanie wolnego komputera za pomocą pętli while jest dość subiektywne, ale myślę, że to bardziej tak: jsfiddle.net/7zbKw/1 . Notatka z whatwg.org/specs/web-apps/current-work/multipage/… „Ten interfejs API nie gwarantuje, że liczniki będą działać dokładnie zgodnie z harmonogramem. Należy oczekiwać opóźnień spowodowanych obciążeniem procesora, innymi zadaniami itp.”
Jeff Davis
20

do

Starając się maksymalnie podpowiedzieć wskazówkom zawartym w pytaniu:

#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
źródło
3
miłe nadużycie #define: P +1
masterX244
15

BF

Zakłada owijanie komórek.

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

Dlaczego to działa?

Pierwszy i ostatni wiersz składają się z pętli, która powtarza się cztery razy (counter = cell0 ).

Wewnątrz pętli znajduje się zmienna licznika (cell1 ), która jest zwiększana za każdym razem.

Każda linia sprawdza, czy zmniejszenie o cztery, trzy, dwa lub jeden jest równe zero. Dlatego przy pierwszym uruchomieniu licznik jest jeden i wykonywana jest ostatnia linia, przy drugim uruchomieniu wykonywana jest trzecia linia itp.

Te (line 1)pokazy gdzie trzeba wprowadzić tekst, który zostanie wydrukowany. Strzałki w pętlach przydzielają cell2do tego celu. [-]Czyści cell2po użyciu.

Timtech
źródło
14

Grzmotnąć

Ku pamięci czcigodnych SleepSort i SleepAdd przedstawiam wam ... SleepReverse :

#!/bin/bash

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

print 1
print 2
print 3
print 4
Zamieszki
źródło
Aby wyglądał bardziej jak specyfikacja, użyj $1i $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();
  }
}

Wszystko we właściwym czasie ... ;-)

TheConstructor
źródło
Linie muszą być przyległe.
Timtech
Są nie mniej przylegające niż np. Z codegolf.stackexchange.com/a/20660/16293 nikt nie powiedział, że powinny wyglądać tak samo.
Usunie
W porządku, świetnie :-)
Timtech
12

Python 3

import atexit

atexit.register(print,"Line1")
atexit.register(print,"Line2")
atexit.register(print,"Line3")
atexit.register(print,"Line4")
Mark Plotnick
źródło
12

Grzmotnąć

Oto skrypt o podwójnych twarzach:

#!/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
źródło
2
Nigdy nawet nie wiedziałem, że tacistnieje! Haha dzięki.
Noyo
11

Wspólne Lisp nr 1

Łatwo jest napisać ngorpmakro, które wykonuje swoje formularze w odwrotnej kolejności:

(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

Wspólne Lisp nr 2

Oto jeden, który bierze problem bardzo dosłownie; kod z pytania pojawia się w programie bez modyfikacji:

(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
źródło
10

PHP

Kolejny evalwariant:

$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";
Przyzwoity Dabbler
źródło
1
Przysiek! Niemniej jednak czuję się zmuszony wskazać, że to naprawdę zły pomysł.
David Kryzaniak
9

FA#

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

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

Właśnie utworzyłem niestandardowego operatora, który wykonuje funkcje w odwrotnej kolejności.

pswg
źródło
3
Jestem całkiem pewien (?) F (g (x)) = g (x); f (x) to rachunek różniczkowy i całkowy, a nie programowanie.
Jeff Davis
2
@JeffDavis: Całkiem pewnie (?) f g xczyta mniej więcej tak (?)(f, g, x), jakf(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")
}

Wypróbuj: http://play.golang.org/p/fjsJLwOFn2

cory.todd
źródło
Chciałem opublikować dokładnie ten sam kod. Dosłownie bajt po bajcie dokładnie to samo.
Art.
@ Art, super! Mam nadzieję, że zobaczę więcej Go używanych w Code Golf.
cory.todd
Prawdopodobnie się nie wydarzy. Go nie jest naprawdę dobry w kompresji, celowo ograniczają dziwne konstrukcje, abyś nie mógł stworzyć nieczytelnego bałaganu. Ale w tym przypadku (i może w innych konkursach popularności) ma szansę.
Art.
8

Python3

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

Może być o 6 bajtów krótszy, usuwając wszystkie spacje w ostatnim wierszu.

aragaer
źródło
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.
źródło
Zamiast std::reversei std::for_eachpo prostu użyjwhile (! functors.empty()) { functors.back()(); functors.pop_back(); }
David Hammen,
7

Partia

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
źródło
Witamy w codegolf! Niezły post.
Cruncher
7

DO#

Zamiast bezpośrednio wywoływać metodę Run, tworzę metodę dynamiczną, która zawiera kopię kodu bajtowego Run IL, z wyjątkiem tego, że argumenty opcode łańcucha znaków są zamieniane. Co powoduje, że nowa metoda wyświetla ciągi w odwrotnej kolejności.

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
źródło
6

Pyton

jeszcze inne rozwiązanie eval()

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

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

nie jest to bardzo skomplikowane, ale łatwe do zrozumienia.

dawidak
źródło
2
jedyny kod, który rozumiem: D
moldovean