Виконувати відбитки назад


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зворотних рядків .

Щасливого кодування!

ОНОВЛЕННЯ: Конкурс закінчений! Дякую вам всім :)


15
Чи враховується арабська мова? :)

Якщо ви зможете зустріти специфікації, звичайно: P
Вереос

Хотіли швидко уточнити одне правило ... Коли ви говорите "Кожен подібний може містити лише один друк", ви маєте на увазі один текстовий рядок у файлі коду або один LOC / заяву?
Руслан

Кожен рядок коду може містити лише один друк
Vereos

чи потрібно пройти перевірку коду - підходить для виробничого коду?
Ленс

Відповіді:


183

Commodore 64 BASIC

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

83
Я ніколи не міг зрозуміти, для чого потрібні номери рядків, до цих пір.
угорен

3
Я збирався запропонувати скопіювати ROM символів ($ D000) в оперативну пам’ять ($ 3000), замінити растрові символи на "1" <-> "4" і "2" <-> "3", а потім запустити програму в прямому порядку . Це кутер.
Марк Лаката

Я впевнений, що ви фактично не можете зберегти / завантажити або іншим чином перерахувати код у порядку, показаному за допомогою стандартних інструментів (напевно, не можна в Apple II), все, що ви могли зробити, було б ввести ці рядки в консоль в тому порядку. І якщо це дозволено, ви не можете просто використати, наприклад, бібліотеку C # SendKeys для введення коду на будь-якій із відповідей мов у іншому порядку за допомогою клавіш зі стрілками для переміщення.
Ленс

108

PHP

Зловживання пріоритетом ... :-)

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

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 дуже вражаюче!
eisberg

3
Мені довелося трохи розібратися (спасибі @eisberg за посилання!), Але я це зараз зрозумів. Хоча перший printназивається першим, він не закінчує евакуацію того, що потрібно надрукувати, доки внутрішні (нижні) значення printне будуть вже викликані та повністю оцінені. І !s просто для того, щоб приховати 1, які друкували б інакше. Блискуче, @bwoebi!
sfarbota

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 ставлять аргументи функцій на стек у зворотному порядку (тому верхній елемент стека завжди є першим аргументом), а це означає, що вони, ймовірно, оцінюють аргументи таким же чином. Звичайно, це передбачає , що аргументи , які передаються через стек , який стає все менше і менше в випадку з новими компіляторами.
Guntram Blohm

Як сказав @GuntramBlohm, основна ідея полягає в тому, що параметри функції C часто (але не завжди) висуваються на стек в порядку справа наліво. Оскільки це виклики функцій, функції, ймовірно, (але не обов'язково) викликаються також справа наліво. Все це не визначено стандартом C, тому, хоча трапляється отримати правильний результат у GCC 4, це повністю залежить від компілятора і виклику конвенції, що насправді відбувається.
Нік

1
@fluffy: На жаль, це навпаки: C не трактує аргументальні коми як точки послідовності, на відміну від інших коми.
Вілліхам Тотланд

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
Жахливий. Мені це подобається.
Роджер Ліндсьо

4
+1 Люди завжди кажуть, що струнні Java незмінні. Ти доводиш, що їх немає.
Віктор Стафуса

16
Це приємно противно, але вимога зворотного виконання не виконується.
Thorbjørn Ravn Andersen

4
@ ThorbjørnRavnAndersen shhhh ... ваші не повинні їм це казати. : 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))));
}

1
+1 для макросу Може включати ще одну; щось на кшталт #define } 0))));(я не знаю точно, як працюють макроси на C). Таким чином, ви могли просто мати оператори друку в основному методі, нічого іншого.
Джастін

@Quincunx, ви не можете визначитись }, але ви можете визначити return, що я зробив зараз. Зараз це майже поліглот - printсинтаксис працює декількома мовами скриптів, #defineчасто є коментарем, але main(){..}не працює жодною мовою, яку я міг би знайти.
угорен

1
@Quincunx, а тепер це справді поліглот.
угорен

як перші два визначення роботи без пробілів? Чи було б його printзамінити на "\n",printf(?
phuclv

@ LưuVĩnhPhúc - простір необов’язковий. Він замінює, як ви кажете.
ugoren

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


7
Усі 3 посилання, які ви опублікували, ведуть до 404. Це жарт?
манастирська робота

8
Ага. Я зараз бачу. Тут підкреслив синтаксис.
манастирська робота

12
Це комбінований конкурс популярності та кодування , ні? :) Я це люблю.
Не те, що Чарльз

8
Це феноменальне зловживання Javascript. Мені це подобається.
Сейрія

2
Підлий. 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)))

38
Я вважаю за краще це, тому що він має мет
Рей,

2
Ви б не отримали два відповіді, якби у вас було два рішення?
Конструктор

3
Хіба це не виглядало б більше ruby-більше з кодовими блоками? pastebin.com/LDWpxKx8
манатура

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

22
@TheConstructor Творча частина використовує goto в PHP ;)
NikiC

1
Так повно виграшу.
Нік Т

41

Хаскелл

Це майже ідіоматичний Haskell, оскільки програма зараз виглядає як композиція функцій справа наліво. Якщо функція не була надрукована, але щось, що повертало б (корисне) значення, декларація оператора була б непотрібною, і код буде чимось, що ви б бачили в бібліотеках.

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

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

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

22
Це теоретично не гарантується для друку в точному зворотному порядку.
Cruncher

4
@Cruncher Я знаю, але з прогалиною за 1 секунду шанси на друк у будь-якому іншому, крім зворотного порядку, досить малі.
Гарет

3
@Gareth Ось чому я теоретично курсив курсивом :)
Cruncher

3
@Cruncher Це не те, що робить це так весело?
П’єр Арло

@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;}
Нойо,

Але тоді всі результати будуть в одному рядку!
Містер Лістер

... і це дозволено. :]
Нойо

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, і я намагався його позбутися. Тепер мені це не потрібно, бо ти це отримав!
сергіол

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,

1
@ComFreek: setTimeoutстандартизовано в HTML5 / таймери, а не в ES. Крім того, він визначає мінімальний час очікування 4ms :-)
Bergi

1
@Bergi Yep, ти прав, звичайно! HTML Standard - Таймери - якщо хтось зацікавлений.
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;
}

3
приємне зловживання #define: P +1
masterX244

15

BF

Передбачає обгортання клітин.

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

Чому це працює

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

Всередині циклу є змінна лічильника ( cell1), яка збільшується з кожним пробігом.

Кожен рядок перевіряє, чи зменшується на чотири, три, два чи один дорівнює нулю. Тому на першому запуску лічильник - один, а останній рядок виконується, у другому - третій рядок і т.д.

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


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

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

Все в правильні терміни ... ;-)


Лінії повинні бути суміжними.
Timtech

Вони не менш суміжні, ніж, наприклад, з codegolf.stackexchange.com/a/20660/16293 ніхто не сказав, що вони повинні виглядати так само.
Видалить

Гаразд, чудово :-)
Timtech

12

Пітон 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"

2
Я ніколи навіть не знав, що tacіснує! Ха-ха, дякую.
Нойо

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
Гладко! Тим не менш, я змушений зазначити, що це дуже погана ідея.
Давид Кризаняк

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

Перейти (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


Я хотів опублікувати такий самий код. Буквально, байт-байт точно такий же.
Ст

@Art, дивовижно! Я сподіваюся побачити більше Go, використовуваних у Code Golf.
cory.todd

Напевно, не станеться. 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::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

Ласкаво просимо до codegolf! Гарний пост.
Cruncher

7

C #

Замість того, щоб безпосередньо викликати метод 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

Пітон

ще одне рішення з використанням eval()

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

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

це не дуже складно, але легко зрозуміти.


2
єдиний код, який я розумію: D
moldovean
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.