Exécuter des impressions en arrière

102

Votre tâche consiste à inverser l'ordre dans lequel certains printssont exécutés.


Spécifications:
Votre code sera sous cette forme:

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

Vous devrez print(ou echo, ou write, ou équivalent) ces chaînes du quatrième au premier.

  • Vous décidez quelles lignes de votre programme doivent printles chaînes, mais elles doivent être adjacentes ;

  • Chaque ligne ne peut en contenir qu'une seule printet ne peut dépasser 60 octets de long.

  • Comme il s’agit d’un , soyez créatif et évitez d’écrire simplement un gotooufor(i){if(i=4)print"Line1";if(i=3)...}

  • La réponse la plus votée en 2 semaines a gagné.

  • Votre sortie DOIT être Line4 Line3 Line2 Line1 OR Line4Line3Line2Line1 ou Line4\nLine3\nLine2\nLine1 (où \nest une nouvelle ligne), et elle doit être générée uniquement en les exécutant à l' printsenvers.

Bonne codage!

MISE À JOUR: Le concours est terminé! Merci à tous :)

Vereos
la source
15
L'Arabe compte-t-il? :)
Si vous êtes capable de répondre aux spécifications, bien sûr: P
Vereos
Voulait clarifier rapidement une règle ... Lorsque vous dites "Chaque élément similaire ne peut contenir qu'une seule impression", voulez-vous dire une ligne de texte dans le fichier de code ou une seule LOC / instruction?
Ruslan
Chaque ligne de code ne peut contenir qu'une seule copie
Vereos
Doit-il passer une révision du code - adapté au code de production?
Lance

Réponses:

183

Commodore 64 BASIC

40 print "Line 1"
30 print "Line 2"
20 print "Line 3"
10 print "Line 4"
Danko Durbić
la source
83
Je n'ai jamais pu comprendre pourquoi les numéros de ligne sont nécessaires, jusqu'à présent.
Ugoren
3
J'allais proposer, en copiant Character ROM ($ D000) dans RAM (3000 USD), en permutant les bitmaps de caractères pour "1" <-> "4" et "2" <-> "3", puis en exécutant le programme dans l'ordre suivant . C'est plus mignon.
Mark Lakata
Je suis presque sûr que vous ne pouvez pas réellement enregistrer / charger ou lister le code dans l'ordre indiqué à l'aide des outils standard (ce qui est impossible avec Apple II de toute façon). Tout ce que vous pourriez faire serait de taper ces lignes dans la console. dans cet ordre. Et si cela est autorisé, vous ne pouvez pas simplement utiliser, par exemple, la bibliothèque C # SendKeys pour taper du code dans l’une des langues répondues, dans un ordre différent, à l’aide des touches fléchées.
Lance
109

PHP

Abus de préséance ... :-)

!print "Line1\n".
!print "Line2\n".
!print "Line3\n".
!print "Line4\n";
bwoebi
la source
3
En PHP, printpeut être utilisé comme une expression, comme en Perl, dont la valeur de retour est toujours 1. !1retourne bool(false)ce qui, lorsqu'il est saisi sous forme de chaîne, renvoie la chaîne vide. Une restriction plus appropriée pour PHP pourrait être d'exiger echoplutôt que de print; ce qui précède n’est en réalité qu’une déclaration.
Primo
1
@ kuldeep.kamboj C'est simplement groupé de cette façon: print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));- tout ce qui se trouve à droite d'une déclaration print en fait partie.
Bwoebi
4
Cela semble fonctionner dans toutes les versions 3v4l.org/dpSpK très impressionnant!
eisberg
3
Il m'a fallu un certain temps pour comprendre (Merci @eisberg pour le lien!), Mais je comprends maintenant. Alors que le premier printest appelé en premier, il ne termine pas l’évaluation de ce dont il a besoin pour imprimer avant que les éléments internes (inférieurs) printaient déjà été appelés et pleinement évalués. Et les !s sont juste pour cacher les 1 qui imprimeraient autrement. Brillant, @bwoebi!
Sfarbota
1
@sfarbota Lire les règles est difficile. Fixé. Merci :-)
bwoebi
76

C

Un comportement indéfini est le type de comportement le plus excitant!

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

La sortie réelle peut varier en fonction du compilateur, de l'éditeur de liens, du système d'exploitation et du processeur :)

pseudo
la source
22
Je ne sais absolument pas pourquoi cela fonctionne, +1.
svick
7
@svick: pour prendre en charge les variables, la plupart des compilateurs C placent les arguments de la fonction sur la pile dans l'ordre inverse (l'élément le plus haut de la pile est toujours le premier argument), ce qui signifie qu'ils sont susceptibles d'évaluer les arguments de la même manière. Bien entendu, cela suppose que les arguments soient passés sur la pile, ce qui devient de moins en moins le cas avec les nouveaux compilateurs.
Guntram Blohm
Comme @GuntramBlohm l'a dit, l'idée de base est que les paramètres de la fonction C sont souvent (mais pas toujours) poussés sur la pile dans un ordre de droite à gauche. Comme il s'agit d'appels de fonction, les fonctions sont probablement (mais pas nécessairement) également appelées de droite à gauche. Tout ceci n’est cependant pas défini par le standard C, alors, bien que cela donne le bon résultat dans GCC 4, il incombe totalement au compilateur et à la convention d’appel de savoir ce qui se passe réellement.
Nick
1
@ Fluffy: Hélas, c'est l'inverse: C ne traite pas les virgules arglist comme des points de séquence, contrairement à d' autres virgules.
Williham Totland
6
@ WillihamTotland bien alors je connais un code que j'ai vraiment besoin de réparer ... merci
moelleux
74

Java

En utilisant la réflexion

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

Sortie:

Line4
Line3
Line2
Line1

Une explication de pourquoi cela fonctionne peut être trouvée ici .

Danny
la source
61
Horrible. Je l'aime.
Roger Lindsjö
4
+1 Les gens disent toujours que les java Strings sont immuables. Vous prouvez qu'ils ne le sont pas.
Victor Stafusa
16
C'est délicieusement désagréable, mais l'exigence d'exécution inversée n'est pas remplie.
Thorbjørn Ravn Andersen
4
@ ThorbjørnRavnAndersen chut ... tu n'es pas censé leur dire ça. : p
Danny
5
@Victor En Java, les chaînes sont immuables. Partout dans Stackoverflow, il y a des questions telles que "Je pensais que les chaînes étaient immuables". Ils utilisent la réflexion et cela leur donne une apparence immuable. Les promesses de Java fonctionnent comme suit: "Si vous utilisez nos objets / classes comme nous le pensions, nous promettons que nos revendications sont correctes." La réflexion n'est pas la façon dont les classes sont censées utiliser.
Justin
70

C (et sorte de Python)

Nouvelle version, utilisant une macro pour s'adapter parfaitement au format de la question. Suite au commentaire de Quincunx, j’ai ajouté returnpour le rendre plus agréable.

Cela fonctionne également en Python, mais l’impression se fait dans le bon ordre.

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

Version originale - les deux sont pratiquement les mêmes, après substitution de macro:

main(){
    printf("Line 1\n",
    printf("Line 2\n",
    printf("Line 3\n",
    printf("Line 4\n",
    0))));
}
Ugoren
la source
1
+1 pour la macro. Peut-être en inclure un autre; quelque chose comme #define } 0))));(je ne sais pas exactement comment les macros fonctionnent en C). De cette façon, vous pouvez simplement avoir les instructions print dans la méthode principale, rien d’autre.
Justin
@ Quincunx, vous ne pouvez pas définir }, mais vous pouvez définir return, ce que j'ai maintenant fait. C'est presque un polyglotte maintenant - la printsyntaxe fonctionne dans plusieurs langages de script, #defineest souvent un commentaire, mais main(){..}ne fonctionne dans aucun langage que j'ai pu trouver.
Ugoren
1
@Quincunx, et maintenant c'est vraiment un polyglotte.
Ugoren
comment les deux premiers définissent-ils le travail sans espaces? Cela ferait-il printpour être remplacé par "\n",printf(?
phuclv
@ LưuVĩnhPhúc - L'espace est facultatif. Ca remplace comme tu dis.
Ugoren
61

ES6 (en mode arrière;)

Wow, il semblerait que les concepteurs d'ECMAScript aient fait preuve d'une clairvoyance incroyable en intégrant le mode arrière dans la spécification:

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

Résultat (évaluation, vraiment):

"Line4Line3Line2Line1"

Notez que c'est exactement de la forme demandée, avec seulement une légère rétro-information pour correspondre à la syntaxe du mode . Notez également que ce mode est pris en charge dans les versions récentes de Firefox au moment .

Note finale: En fait, il n'y a pas de mode arrière. Mais ceci est toujours un script valide qui tourne dans Firefox (copiez le tout). :RÉ


ES6 "mode lax"

BONUS : Voici une version mise à jour qui n'utilise pas le mode précédent, mais utilise le "mode laxiste" nouvellement spécifié, dans lequel le moteur JS essaiera simplement de deviner ce que le code est censé faire, quelle que soit la syntaxe spécifiée par JS ( fondamentalement l'antithèse du mode strict):

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

Veuillez noter que le " mode lax " est actuellement disponible uniquement dans Firefox> = 34.; P

Noyo
la source
7
Tous les 3 liens que vous avez affichés mènent à 404. Est-ce ce genre de blague?
Manatwork
8
Ah Je vois maintenant. Le surligneur de la syntaxe était votre complice ici.
Manatwork
12
Ceci est un combo popularité-concours et code-trolling , non? :) J'aime cela.
Pas que Charles
8
C'est un abus phénoménal de Javascript. Je l'aime.
Seiyria
2
Sournois. Soooo sournois ....
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;
}
David Yaw
la source
56

Rubis

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

Edit: Alternativement,

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

printLine1(
printLine2(
printLine3(
printLine4)))
histocrate
la source
38
Je préfère cela parce qu'il a de la méthamphétamine
Ray
2
Ne posteriez-vous pas normalement deux réponses si vous aviez deux solutions?
TheConstructor
3
Est-ce que cela ne semblerait pas plus rubycompliqué avec des blocs de code? pastebin.com/LDWpxKx8
manatwork
2
@PacMani ces parens n'utilisent pas d'espace blanc, ils utilisent un espace blanc.
CorsiKa
@manatwork nice one! Je pense que method_missingc'est joli Ruby-ish lui-même, cependant.
histocrat
49

PHP

Je sais, c'est de la folie ...

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
la source
66
Ce bruit que vous entendez, c'est Dijkstra qui tourne dans sa tombe. :-)
Gareth
24
Je pensais que quelqu'un disait "soyez créatif et évitez d'écrire juste un goto" ;-)
TheConstructor
22
@TheConstructor La partie créative utilise goto en PHP ;)
NikiC
1
Si plein de victoire.
Nick T
41

Haskell

Ceci est presque idiomatique en Haskell, car le programme ressemble maintenant à une composition de fonctions de droite à gauche. Si la fonction n'était pas imprimée, mais que quelque chose renverrait une valeur (utile), la déclaration de l'opérateur ne serait pas nécessaire et le code serait quelque chose que vous verriez dans les bibliothèques.

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

main = putStrLn "Line1"
    << putStrLn "Line2"
    << putStrLn "Line3"
    << putStrLn "Line4"
Shiona
la source
5
(<<) = flip (>>)
Astuce
@ Bergi C'est une autre façon de l'écrire, je suppose un peu plus élégant même. J'étais en fait un peu surpris de voir que la chose n'était pas définie dans le prélude (ou Control.Monad)
shiona
@ Shiona: Oui, c'est une chose surprenante à rater. Heureusement, nous avons les deux opérateurs pour les applications: <*et *>.
Tikhon Jelvis
@TikhonJelvis en fait, l' <*opérateur applicatif est différent de celui-ci <<: a <* best équivalent à do x<-a;b;return x, c'est- à -dire qu'il exécute al'effet en premier
fier 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
la source
22
Ceci n’est théoriquement pas garanti pour imprimer dans l’ordre inverse exact.
Cruncher
4
@Cruncher je sais, mais avec 1 seconde d'écart, les chances d'imprimer autrement que dans l'ordre inverse sont plutôt minces.
Gareth
3
@Gareth C'est pourquoi j'ai italicisé théoriquement :)
Cruncher
3
@Cruncher N'est-ce pas ce qui le rend si amusant?
Pierre Arlaud
@ Cruncher de la même manière que théoriquement mes atomes pourraient traverser un mur?
jeudi
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}

Voir jsFiddle .

Edit:
Pour mieux se conformer aux règles, voici une variante en XML, qui utilise réellement 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>

où style.css devrait être

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

HTML sans CSS

Et pour le plaisir, en voici un sans 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>

Violon .

M. Lister
la source
2
Quelqu'un peut-il expliquer le vote négatif? Cela fonctionne lors de l'impression, vous savez.
M. Lister
Vous pouvez également simplement fairep {float:right;}
Noyo
Mais alors les résultats seront tous sur une seule ligne!
M. Lister
... et c'est permis. :]
Noyo
1
... et ce n'est pas refusé. : D Vous pouvez également l'envelopper dans une div et ajouter la règle 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";
}

(Les variables locales sont détruites dans l'ordre inverse de la déclaration.)

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

(Le même principe, mais utilisez plutôt lambdas et un membre de données de tableau.)

ecatmur
la source
J'ai posté une solution en utilisant std::function, et j'essayais de m'en débarrasser. Maintenant, je n'ai pas besoin parce que tu l'as!
sergiol
21

Haskell

main = sequence_ $ reverse [
    putStr "Line1",
    putStr "Line2",
    putStr "Line3",
    putStr "Line4"]
mniip
la source
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
la source
Utiliser 1,2,3,4comme délais d'attente fonctionne également pour moi. (Cependant, je ne sais pas si ce comportement est normalisé dans ECMAScript.)
ComFreek
1
@ComFreek: setTimeoutest normalisé dans HTML5 / timers, pas dans ES. En outre, il spécifie un délai d'expiration minimal de 4 ms :-)
Bergi, le
1
@ Bergi Oui, vous avez raison, bien sûr! HTML Standard - Timers - si quelqu'un est intéressé.
ComFreek
1
Exécutez cette opération sur une machine suffisamment lente (par exemple, un 8086 exécutant plusieurs autres applications?) Et elle échouera. (Par échec, je veux dire que l'ordre ne sera pas inversé, car il faudra> = 100 ms pour exécuter chaque instruction.
Jeff Davis
1
@ lastr2d2 Simuler un ordinateur lent avec des boucles while est assez subjectif, mais je pense que cela lui ressemblerait davantage: jsfiddle.net/7zbKw/1 . Note de whatwg.org/specs/web-apps/current-work/multipage/… "Cette API ne garantit pas que les minuteries fonctionneront exactement comme prévu. Des retards dus à la charge du processeur, à d'autres tâches, etc. sont à prévoir."
Jeff Davis
20

C

Essayer de défier les astuces de la question de la manière la plus créative possible:

#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
la source
3
bel abus d'un #define: P +1
masterX244
15

BF

Suppose que les cellules sont emballées.

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

Pourquoi ça marche

Les première et dernière lignes composent une boucle qui se répète quatre fois (counter = cell0).

Dans la boucle, il existe une variable de compteur ( cell1) qui est augmentée à chaque exécution.

Chaque ligne vérifie si elle diminue de quatre, trois, deux ou un égal à zéro. Par conséquent, lors de la première exécution, le compteur est égal à un et la dernière ligne est exécutée, lors de la deuxième exécution, la troisième ligne est exécutée, etc.

La (line 1)montre où vous devez faire le texte qui est imprimé. Les flèches dans les boucles allouées cell2à cette fin. Le [-]nettoie cell2après que vous l'utilisez.

Timtech
la source
14

Frapper

En mémoire du vénérable SleepSort et SleepAdd , je vous présente ... SleepReverse :

#!/bin/bash

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

print 1
print 2
print 3
print 4
Émeute
la source
Pour que cela ressemble davantage aux spécifications, utilisez $1et $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();
  }
}

Tout est dans le bon timing ... ;-)

Le constructeur
la source
Les lignes doivent être adjacentes.
Timtech
Ils ne sont pas moins adjacents que par exemple avec codegolf.stackexchange.com/a/20660/16293 personne n'a dit qu'ils devraient se ressembler. Supprime certains caractères de nouvelle ligne ;-)
TheConstructor
Très bien :-)
Timtech le
12

Python 3

import atexit

atexit.register(print,"Line1")
atexit.register(print,"Line2")
atexit.register(print,"Line3")
atexit.register(print,"Line4")
Mark Plotnick
la source
12

Frapper

Voici le script à double face:

#!/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
la source
2
Je n'ai même jamais su tacexisté! Haha merci.
Noyo
11

Common Lisp № 1

Il est facile d'écrire une ngorpmacro qui exécute ses formulaires dans l'ordre inverse:

(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

En voici un qui prend le problème très littéralement; le code de la question apparaît dans le programme sans modification:

(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
la source
10

PHP

Une autre 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";
Dabbler décent
la source
1
Nappe! Néanmoins, je me sens obligé de souligner que c'est une très mauvaise idée.
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") ""

Vient de créer un opérateur personnalisé qui exécute les fonctions dans l’ordre inverse.

pswg
la source
3
Je suis à peu près sûr (?) F (g (x)) = g (x); f (x) est un calcul et non une programmation.
Jeff Davis
2
@JeffDavis: Assez sûr se (?) f g xlit comme suit à peu près comme (?)(f, g, x)nonf(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")
}

Essayez-le: http://play.golang.org/p/fjsJLwOFn2

cory.todd
la source
Je voulais poster le même code exact. Littéralement, octet pour octet exactement identique.
Art
@ Art, génial! J'espère voir plus de Go utilisé dans Code Golf.
cory.todd
Cela n'arrivera probablement pas. Go n'est pas vraiment bon d'être compressé, ils limitent délibérément les constructions étranges afin que vous ne puissiez pas créer un désordre illisible. Mais dans ce cas (et peut-être d'autres concours de popularité), il a une chance.
Art
8

Python3

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

Peut être plus court de 6 octets en supprimant tous les espaces de la dernière ligne.

aragaer
la source
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.
la source
Au lieu de std::reverseet std::for_each, utilisez simplementwhile (! functors.empty()) { functors.back()(); functors.pop_back(); }
David Hammen
7

Lot

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
hilk
la source
Bienvenue chez codegolf! Belle publication.
Cruncher
7

C #

Au lieu d'appeler directement la méthode Run, je crée une méthode dynamique qui contient une copie du bytecode IL de Run, à la différence près que les opérandes d'opcode de chaîne de chargement sont échangés. Ce qui entraîne la nouvelle méthode pour afficher les chaînes dans l'ordre inverse.

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
la source
6

Python

encore une autre solution en utilisant eval()

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

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

ce n'est pas très complexe, mais facile à comprendre.

Davidak
la source
2
le seul code que je comprends: D
moldave