Выполнить печать назад

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сами решаете, какие строки вашей программы должны соответствовать строкам, но они должны быть смежными ;

  • Каждая строка может содержать только одну строку printи не может превышать 60 байт ;

  • Так как это , будьте креативны и не пишите просто gotoили простоfor(i){if(i=4)print"Line1";if(i=3)...}

  • Ответ, получивший наибольшее количество голосов за 2 недели, побеждает.

  • Ваш вывод ДОЛЖЕН быть Line4 Line3 Line2 Line1 ИЛИ Line4Line3Line2Line1 ИЛИ Line4\nLine3\nLine2\nLine1 (где \nесть новая строка), и он должен генерироваться только путем их выполнения в printsобратном порядке.

Удачного кодирования!

ОБНОВЛЕНИЕ: Конкурс окончен! Спасибо вам всем :)

Vereos
источник
15
Арабский считается? :)
Если вы в состоянии соответствовать спецификациям, конечно: P
Vereos
Хотелось быстро уточнить одно правило ... Когда вы говорите: «Каждый лайк может содержать только один шрифт», вы имеете в виду одну текстовую строку в файле кода или один оператор LOC /?
Руслан
Каждая строка кода может содержать только один отпечаток
Vereos
Должен ли он пройти проверку кода - подходит для производственного кода?
Ланс

Ответы:

183

Коммодор 64 Бейсик

40 print "Line 1"
30 print "Line 2"
20 print "Line 3"
10 print "Line 4"
Данко Дурбич
источник
83
Я никогда не мог понять, зачем нужны номера строк, до сих пор.
Угорен
3
Я собирался предложить, скопировать символьное ПЗУ ($ D000) в ОЗУ ($ 3000), поменять местами растровые символы для «1» <-> «4» и «2» <-> «3», а затем запустить программу в прямом порядке. , Это симпатичнее.
Марк Лаката
Я почти уверен, что вы не сможете на самом деле сохранить / загрузить или иным образом перечислить код в указанном порядке, используя стандартные инструменты (в любом случае, определенно не можете в Apple II), все, что вы можете сделать, это ввести эти строки в консоль в этой последовательности. И если это разрешено, вы не могли бы просто использовать, например, библиотеку C # SendKeys для ввода кода на любом из отвеченных языков в другом порядке с помощью клавиш со стрелками для перемещения.
Ланс
109

PHP

Злоупотребление приоритетом ... :-)

!print "Line1\n".
!print "Line2\n".
!print "Line3\n".
!print "Line4\n";
bwoebi
источник
3
В PHP printможет использоваться как выражение, как и в perl, возвращаемое значение которого всегда 1. !1возвращает bool(false), который при вводе в виде строки возвращает пустую строку. Более правильным ограничением для PHP может быть требование echoвместо print; Выше действительно только одно утверждение.
Примо
1
@ kuldeep.kamboj Это просто сгруппировано таким образом: print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));- все, что находится справа от оператора печати, является его частью.
Bwoebi
4
Кажется, работает в каждой версии 3v4l.org/dpSpK очень впечатляет!
Айсберг
3
Мне потребовалось время, чтобы понять (спасибо @eisberg за ссылку!), Но я понял это сейчас. Хотя первый printвызывается первым, он не заканчивает вычисление того, что нужно для печати, пока внутренние (нижние) значения printуже не были вызваны и полностью не оценены. И !s просто скрыть 1, которые напечатали бы в противном случае. Отлично, @bwoebi!
сфарбота
1
@sfarbota Читать правила сложно. Исправлена. Спасибо :-)
bwoebi
76

С

Неопределенное поведение - самый захватывающий вид поведения!

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

Фактический вывод может варьироваться в зависимости от вашего компилятора, компоновщика, операционной системы и процессора :)

Ник
источник
22
Я понятия не имею, как это работает, +1.
svick
7
@svick: для поддержки varargs большинство компиляторов C помещают аргументы функций в стек в обратном порядке (поэтому верхний элемент в стеке всегда является первым аргументом), что означает, что они, вероятно, будут оценивать аргументы одинаково. Конечно, это предполагает , что аргументы , которые передаются через стек , который становится все меньше и меньше в случае с новыми компиляторами.
Гунтрам Блум,
Как сказал @GuntramBlohm, основная идея заключается в том, что параметры функции C часто (но не всегда) помещаются в стек в порядке справа налево. Поскольку это вызовы функций, функции, вероятно, (но не обязательно) также вызываются справа налево. Однако все это не определено стандартом C, поэтому, хотя в GCC 4 и происходит правильный результат, полностью зависит от компилятора и соглашения о вызовах, что на самом деле происходит.
Ник
1
@fluffy: Увы, все наоборот: C не рассматривает запятые в списках аргументов как точки последовательности, в отличие от других запятых.
Виллихам Тотланд
6
@WillihamTotland ну тогда я знаю какой-то код, который мне действительно нужно исправить ... спасибо
пушистый
74

Ява

Используя отражение

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
Какой ужас. Мне это нравится.
Роджер Линдсё
4
+1 Люди всегда говорят, что Java-строки неизменны. Вы доказываете, что это не так.
Виктор Стафуса
16
Это восхитительно противно, но требование обратного исполнения не выполняется.
Турбьёрн Равн Андерсен
4
@ ThorbjørnRavnAndersen тссс ... ты не должен говорить им об этом. : p
Дэнни
5
@Victor В Java Строки являются неизменяемыми. По всему Stackoverflow есть вопросы типа «Я думал, что строки были неизменяемыми». Они используют отражение, и это заставляет их казаться неизменными. Обещания Java работают так: «Если вы используете наши вещи / классы так, как мы намеревались, тогда мы обещаем, что наши утверждения верны». Отражение - это не способ, которым классы предназначены для использования.
Джастин
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();

Оригинальная версия - после подстановки макроса они практически одинаковы:

main(){
    printf("Line 1\n",
    printf("Line 2\n",
    printf("Line 3\n",
    printf("Line 4\n",
    0))));
}
ugoren
источник
1
+1 за макрос. Может быть, включить другой; что-то вроде #define } 0))));(я не знаю точно, как работают макросы в C). Таким образом, вы можете просто использовать операторы print в методе main, и ничего больше.
Джастин
@Quincunx, вы не можете определить }, но вы можете определить return, что я сейчас и сделал. Теперь это почти полиглот - printсинтаксис работает на нескольких языках сценариев, #defineчасто является комментарием, но main(){..}не работает ни на одном языке, который я мог найти.
Угорен
1
@Quincunx, а теперь это действительно полиглот.
Угорен
как первые два определяют работу без пробелов? Будет ли его printзаменить "\n",printf(?
phuclv
@ LưuVĩnhPhúc - пробел не является обязательным. Он заменяет, как вы говорите.
Угорен
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"

Обратите внимание, что это точно запрошенная форма, с незначительной обратной оптимизацией, чтобы соответствовать синтаксису режима . Также обратите внимание, что этот режим поддерживается только в последних версиях 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

Noyo
источник
7
Все 3 ссылки, которые вы разместили, ведут на 404. Это такая шутка?
manatwork
8
Ах. Я вижу сейчас. Подсветка синтаксиса была вашим соучастником здесь.
manatwork
12
Это комбо -конкурс популярности и код-троллинг , не так ли? :) Я люблю это.
Не то, что Чарльз
8
Это феноменальное злоупотребление Javascript. Мне это нравится.
Сейрия
2
Sneaky. Soooo подлый ....
Дэвид Конрад
59

С

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)))
histocrat
источник
38
Я предпочитаю это, потому что у него есть мет
Рэй
2
Не могли бы вы опубликовать два ответа, если бы у вас было два решения?
TheConstructor
3
Разве это не выглядело бы более rubyхорошо с блоками кода? pastebin.com/LDWpxKx8
manatwork
2
@PacMani эти парены не используют пустое пространство, они используют пустое пространство.
CorsiKa
@ Manatwork хороший! method_missingХотя я думаю, что это сама по себе Ruby-ish.
гистократ
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
Этот шум, который вы слышите, - Дейкстра кружится в могиле. :-)
Гарет
24
Подумал, кто-то сказал: « goto
Будь
22
@TheConstructor Креативная часть использует goto в PHP ;)
NikiC
1
Так полно побед.
Ник Т
41

Haskell

Это почти идиоматичный Haskell, так как теперь программа выглядит как композиция функций справа налево. Если бы функция не была напечатана, но что-то, что возвращало бы (полезное) значение, объявление оператора было бы ненужным, и код был бы тем, что вы увидите в библиотеках.

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

main = putStrLn "Line1"
    << putStrLn "Line2"
    << putStrLn "Line3"
    << putStrLn "Line4"
shiona
источник
5
Совет:(<<) = flip (>>)
Берги
@Bergi Это еще один способ написать это, я думаю, даже немного элегантнее. На самом деле я был немного удивлен, увидев, что эта вещь не была определена в прелюдии (или Control.Monad)
shiona
@shiona: Да, это удивительно, что пропустить. К счастью, у нас есть оба оператора для заявлений: <*и *>.
Тихон Джелвис
@TikhonJelvis на самом деле, <*аппликативный оператор отличается от этого <<: a <* bэквивалентен do x<-a;b;return x, то есть он запускает aэффект первым
гордый 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
источник
22
Это теоретически не гарантируется для печати в точном обратном порядке.
Cruncher
4
@Cruncher Я знаю, но с промежутками в 1 секунду шансы на его печать в любом другом месте, кроме обратного порядка, довольно малы.
Гарет
3
@Gareth Вот почему я выделил курсивом теоретически :)
Cruncher
3
@ 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}

HTML без CSS

И, черт возьми, вот этот без 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>

Скрипки .

Мистер листер
источник
2
Кто-нибудь может объяснить отрицательный голос? Вы знаете, это работает при печати.
Мистер Листер
Вы также можете просто сделатьp {float:right;}
Noyo
Но тогда результаты будут все в одной строке!
Мистер Листер
... и это разрешено :]
Noyo
1
... и это не запрещено. : D Вы также можете обернуть его в div и добавить правило 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";
}

(Локальные переменные уничтожаются в обратном порядке объявления.)

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

(Почти то же самое, но вместо этого используются лямбда-выражения и элемент данных массива.)

ecatmur
источник
Я опубликовал решение с помощью std::function, и я пытался избавиться от него. Теперь мне не нужно, потому что вы получили это!
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);
JoshWillik
источник
Использование 1,2,3,4как тайм-ауты также работает для меня. (Однако я не знаю, стандартизировано ли это поведение в ECMAScript.)
ComFreek
1
@ComFreek: setTimeoutстандартизирован в HTML5 / таймеры, а не в ES. Также указывается минимальное время ожидания 4 мс :-)
Bergi
1
@ Bergi Да, ты прав, конечно! Стандарт HTML - Таймеры - если кому-то интересно.
ComFreek
1
Запустите это на достаточно медленной машине (скажем, 8086, на которой запущено несколько других приложений?), И это не удастся. (Под неудачей я имею в виду, что порядок не будет отменен, поскольку для выполнения каждого оператора потребуется> = 100 мс.
Джефф Дэвис,
1
@ lastr2d2 Моделирование медленного компьютера с помощью циклов while довольно субъективно, но я думаю, что это будет больше похоже на это: jsfiddle.net/7zbKw/1 . Примечание от whatwg.org/specs/web-apps/current-work/multipage/… "Этот API не гарантирует, что таймеры будут работать точно по расписанию. Следует ожидать задержек из-за загрузки ЦП, других задач и т. Д."
Джефф Дэвис
20

С

Попытка сделать вызов подсказкам в вопросе настолько творческим насколько возможно:

#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
источник
3
хорошее злоупотребление #define: P +1
masterX244
15

BF

Предполагает обертывание клеток.

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

Почему это работает

Первая и последняя строки составляют цикл, который повторяется четыре раза (counter = cell0).

Внутри цикла есть переменная counter ( cell1), которая увеличивается при каждом запуске.

Каждая строка проверяет, равно ли уменьшение на четыре, три, два или одну ноль. Поэтому при первом запуске счетчик равен единице, и выполняется последняя строка, при втором запуске выполняется третья строка и т. Д.

В (line 1)шоу , где вы должны сделать текст , который печатается. Стрелки в петлях выделяют cell2для этой цели. [-]Очищает cell2после использования его.

Timtech
источник
14

удар

В память о уважаемых SleepSort и SleepAdd , представляю вам ... SleepReverse :

#!/bin/bash

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

print 1
print 2
print 3
print 4
буйство
источник
Чтобы он больше походил на спецификации, используйте $1и $2: function print(){(sleep $((4-$2));echo "$1 $2";)&}; print Line 1
ThinkChaos
13

Ява

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

Это все в правильное время ... ;-)

TheConstructor
источник
Линии должны быть смежными.
Timtech
Они не менее смежные, чем, например, с codegolf.stackexchange.com/a/20660/16293, никто не сказал, что они должны выглядеть одинаково.
Удалит
Хорошо, отлично :-)
Timtech
12

Python 3

import atexit

atexit.register(print,"Line1")
atexit.register(print,"Line2")
atexit.register(print,"Line3")
atexit.register(print,"Line4")
Марк Плотник
источник
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"
Matteo Italia
источник
2
Я даже не знал, что tacсуществует! Хаха спасибо.
Noyo
11

Обыкновенный Лисп № 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

Обыкновенный Лисп № 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
Slick! Тем не менее, я чувствую себя обязанным указать, что это действительно плохая идея.
Дэвид Крызаняк
9

F #

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

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

Только что создал пользовательский оператор, который выполняет функции в обратном порядке.

PSWG
источник
3
Я почти уверен (?) F (g (x)) = g (x); f (x) - это исчисление, а не программирование.
Джефф Дэвис
2
@JeffDavis: Довольно уверенно (?) f g xчитает примерно так (?)(f, g, x), как нетf(g(x))
Эрик
9

Go (Голанг)

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

cory.todd
источник
Я хотел опубликовать точно такой же код. Буквально, побайтовый точно так же.
Art
@ Арт, классно! Я надеюсь увидеть больше Go, используемых в Code Golf.
cory.todd
Вероятно, не произойдет. Go не очень хороша для сжатых, они намеренно ограничивают странные конструкции, чтобы вы не могли создать нечитаемый беспорядок. Но в этом случае (и, возможно, в других конкурсах популярности) у него есть шанс.
Art
8

python3

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

Может быть на 6 байтов короче, удалив все пробелы в последней строке.

aragaer
источник
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::reverseи 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
hmilch
источник
Добро пожаловать в Codegolf! Хороший пост.
Cruncher
7

C #

Вместо прямого вызова метода Run я создаю динамический метод, который содержит копию байт-кода IL в Run, за исключением того, что операнды кода операции загрузки меняются местами. Что заставляет новый метод отображать строки в обратном порядке.

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

питон

еще одно решение с использованием eval()

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

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

это не очень сложно, но легко понять.

davidak
источник
2
единственный код, который я понимаю: D
молдавский