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 :)


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"

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

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 :)


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 .


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

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


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

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

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;

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"

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

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 .


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.)


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"]

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

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

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.


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

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


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

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"

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

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

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.


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


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.


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

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

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

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.


2
le seul code que je comprends: D
moldave
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.