Code le plus court pour légitimement relâcher


146

Je suis développeur et je n'ai pas envie de faire mon travail. D'après XKCD, je sais que la meilleure excuse pour relâcher l'attention est la compilation de votre code . Pour cette raison, je pense avoir besoin d'un code qui compilera pour toujours! Et parce que je suis paresseux et ne veux pas avoir à taper beaucoup, ceci doit être fait avec le code le plus court possible.

Votre tâche consiste donc à écrire un programme dont la syntaxe est correcte, mais qui oblige le compilateur à entrer dans une boucle infinie.

Caractéristiques

  • Vous devez évidemment utiliser un langage avec un compilateur.
  • Spécifiez l'implémentation utilisée dans chaque solution.
  • C'est du , donc la solution valide la plus courte (en octets) est gagnante.
  • Le compilateur peut cesser de manquer de mémoire ou d’espace de pile.

1
@obarakon je ne suis pas d'accord. Le code de l'autre défi ne peut pas être facilement associé à ce défi. Les défis, alors que les deux impliquent une boucle infinie, sont fondamentalement différents.
Sriotchilism O'Zaic

1
@obarakon N'est pas dupe de cette question , car ce n'est pas du code-golf.
Esolanging Fruit


1
Je ne suis pas sûr que cela corresponde à ce défi (et même s’il le fait, cela donnerait des résultats terribles), mais pour ceux que cela intéresse, voici comment je le ferais Java: définir un processeur d’annotation (idéone snippet) que vous utiliserez pour invoquer javacavec son -processoroption. Cela fait que la compilation de n'importe quelle classe est suspendue pour toujours.
Aaron

6
Pour les réponses qui aboutissent à un crash du compilateur: Dans le but de relâcher, je penserais que vous voulez toujours que ça prenne aussi longtemps que vous le pouvez pour planter.
GuitarPicker

Réponses:


16

Japt , 2 octets

`ÿ

Vous pouvez le tester en ligne ici , mais je ne le recommanderais pas car cela gèlera votre navigateur.

Explication

Japt utilise la bibliothèque shoco pour la compression de chaînes. Un backtick demande au compilateur de tout décompresser jusqu'au prochain backtick ou à la fin du fichier. Chaque octet fait ce qui suit:

  • 00-7F sont laissés intacts.
  • 80-BFchaque transformée en une paire commune à deux lettres en minuscule ( at, oo, th, etc.).
  • C0-DFchacun utilise l'octet suivant et se transforme en une chaîne commune de quatre lettres .
  • E0-EFchacun utilise les trois octets suivants et se transforme en une chaîne "commune" de huit lettres (commençant à Wherereret descendant à partir de là).
  • F0-F7 casser le décompresseur, bien qu'il renvoie toujours tout jusqu'à l'octet de rupture.
  • F8-FFamener le décompresseur à entrer dans une boucle infinie. Je ne sais pas pourquoi, car je ne connais pas très bien le fonctionnement interne de la bibliothèque shoco (et le code JavaScript est complètement illisible ), mais c'est très pratique dans ce cas.

Je ne crois pas qu'il y ait un autre moyen de jouer avec le compilateur Japt, mais on ne sait jamais ...


10
Qu'est-ce que tu veux dire par illisible? Clairement, vous n'essayez pas assez fort.
fəˈnɛtɪk

Je souhaite qu'il y ait un décompilateur emscripten ...
tbodt

58

TikZ (pdfTeX 3.14159265-2.6-1.40.17), 85 79 74 24 22 21 octets

Un tas d'octets sauvés grâce à wchargin

Un octet enregistré grâce à Chris H

\input tikz
\tikz\pic

En fait, j'ai rencontré celui-ci par accident lorsque je travaillais à faire mes devoirs. J'ai passé un bon bout de temps à attendre qu'il soit compilé avant de réaliser ce qui se passait.

Cela a deux parties:

\input tikz

Cela charge le paquet TikZ

et:

\tikz\pic

Cela démarre un \tikzenvironnement et une commande draw.

Que se passe-t-il

Le compilateur pdflatex a des problèmes avec le \tikz\picmode interactif et passe en mode interactif, ce qui le bloque indéfiniment.


(1/2) Je ne peux pas reproduire ceci. Je reçois "Argument Runaway \draw l\end {document}?! Le fichier s'est terminé lors de l'analyse en utilisant \tikz@next." pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian). tikz 2010/10/13 v2.10. Ceci est standard apt install texlive-fullsur Ubuntu 14.04.
wchargin

1
@wchargin J'utilise la même version de pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016) et il boucle en effet indéfiniment. Merci pour les conseils.
Sriotchilism O'Zaic

1
Vous pouvez sauvegarder un octet en utilisant à la \picplace de \ draw` - exactement le même comportement (testé avec tikz 1.142)
Chris H

3
Je ne peux pas croire que je préconise en fait de ne pas utiliser TikZ, mais son utilisation est certainement excessive ici. Quel est le problème avec l'ancien \def\a{\a}\a(12 octets)? Ou, comme il s'agit du code golf et qu'il ~est actif par défaut, \def~{~}~(9 octets)?
Loop Space

2
@LoopSpace Rien ne va pas avec eux, je ne savais tout simplement pas l'existence. Si vous souhaitez apporter votre propre réponse, n'hésitez pas.
Sriotchilism O'Zaic

40

C, 18 octets

#include __FILE__

Les compilateurs abandonnent généralement après avoir été récursifs environ 200 fois.

La construction de DOM compte-t-elle comme une étape de compilation? Si oui, alors x.htm:

<iframe src=x.htm>

14
Je me souviens que les framesets récursifs utilisaient IE4 avec un tel plantage qu'il en détruisait parfois des composants importants. Donc, le code HTML compte probablement.

10
@ ais523, c'est parce que, dans IE4, Internet Explorer était un "composant important du système d'exploitation".
Marc

2
Un peu de peaufinage et il est valide PHP: <?include __FILE__;.
Ismael Miguel

6
Je ne peux pas poster cette réponse car mon représentant n'est pas assez élevé, mais il existe deux alternatives: #include "/ dev / zero" et #include "/ dev / stdin" - soyez prudent lorsque vous exécutez le premier !!
Rrauenza

2
Lorsque j'ai essayé, l'utilisation de la mémoire de gcc a commencé à croître rapidement, le système est devenu insensible, et mon chien de garde a fini par démarrer et redémarrer. C'était assez amusant :)
rrauenza

38

Java, 102 95 89 88 78 octets

class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}

Cela se termine par un StackOverflowErrorqui se produit car le système de résolution générique ne peut pas décider d'une racine contre laquelle résoudre les autres génériques.

Crédits dus .

Que se passe t-il ici?

  1. A<T>est juste là pour avoir un parent d'une lettre. C'est générique. J'aurais pu l'utiliser List, mais l'importation et la répétition de 4 lettres sont trop longues.
  2. B<T> déclare un générique de base.
  3. B extends Aest nécessaire d'avoir une hiérarchie entre Bet A.
  4. extends A<A>crée une auto référence sur A<T>.
  5. A<? super B> déclenche la recherche de génériques sur A<T>
  6. B<B<T>>crée une auto-référence sur B<T>.
  7. A<...> a=new B<>()force l'utilisation des génériques, au lieu de simplement la définition de ceux-ci, forçant la résolution lors de la compilation B, et non après.
  8. A<?super Bcrée une non-référence de soi, nous avons donc à la fois une référence à un type et à un autre dans les génériques de A.
  9. B<A>crée une non-référence de soi, nous avons donc à la fois une référence à un type et à un autre dans les génériques de B.

Maintenant, le type Aa le type générique Aet B, mais lequel doit être choisi? Oubliez vous-même, essayons de résoudre B. Ping

D'accord, les Bgénériques sont-ils de type Aet B, mais lequel doit être choisi? Oubliez vous-même, essayons de résoudre A. Pong

Ce genre de récursion ne peut pas vraiment être évité car il y a des cas légitimes comme A<B<A<B<A<B<Object>>>>>>: par exemple un objet JSON: List<Map<String,Map<String,List<Map<String,List<String>>>>>>.

Résultat de la compilation

$ javac NoCompile.java


The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
        at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2587)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
        at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
        at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2592)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
        at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)

Sur mon système, la trace de la pile s’arrête après avoir affiché 1024 lignes, qui sont en fait les 4 mêmes lignes répétées 256 fois, ce qui prouve une récursion infinie. Je vous épargne toute cette trace.

Des économies

  1. 102 → 95 octets: remplacé interface+ implementspar class+ extends.
  2. 95 → 89 octets: remplacé Longpar A(deux fois).
  3. 89 → 88 octets: opérateur diamant utilisé ( new B<A>()new B<>()).
  4. 88 → 78 octets: déplacé la déclaration de variable vers un membre de la classe, grâce à VoteToClose .

1
Qu'est-ce que je regarde
Addison Crump

Vous pouvez réduire ce nombre à 78 octets avec:class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
Addison Crump le

@VoteToClose Vous regardez un excellent exemple d'indécidabilité dans les génériques de Java. Chaque générique est censé être résolu contre une racine commune sur laquelle est ensuite validé un. La chose ici est que le générique de Bcontient une référence indécidable au générique Aqui contient à son tour une référence indécidable au générique de B. Lorsque le résolveur ne peut pas décider, il vérifie les références incluses, mais ici les deux génériques se réfèrent l'un à l'autre de manière indécidable (principalement grâce aux références personnelles et au supermot clé. Le résolveur est donc un ping-pong entre les deux génériques.
Olivier Grégoire

Je pensais créer un problème de compilation avec des annotations cycliques: public @interface X {@X(x=X.class)Class<? extends X> x();}... Mais j'ai vite compris pourquoi cela ne marcherait pas lol.
Urne Octopus Magique

34

GNU Makefile, 8 7 octets

Un octet enregistré grâce à KonradRudolph

Enregistré sous Makefileet invoqué par make:

x:;make

Cela produira une récursion de construction infinie sur la première cible trouvée "x".

Inutile de dire que vous ne voulez pas vraiment utiliser cette bombe fourchue sur votre serveur de production. :-)

make
make[1]: Entering directory `/path/to/my/dir'
make
make[2]: Entering directory `/path/to/my/dir'
make
make[3]: Entering directory `/path/to/my/dir'
make
make[4]: Entering directory `/path/to/my/dir'
make
make[5]: Entering directory `/path/to/my/dir'
make
make[6]: Entering directory `/path/to/my/dir'
make
make[7]: Entering directory `/path/to/my/dir'
make
...

Version alternative, 5 octets

Proposé par KonradRudolph:

x:;$_

$_est une référence au dernier argument de la commande précédente. Plus précisément, il est résolu ici comme le chemin absolu de la commande en cours d'exécution - qui est makelui - même.

Cela devrait fonctionner correctement dans un environnement Bash authentique, mais pas sous Windows + MinGW.


2
Hmm, je ne pense pas que le compilateur soitmake vraiment compilé (il l'interprète simplement).
Zeppelin

3
@zeppelin Vous avez raison, c'est probablement une réponse limite. Cela dit, les soumissions impliquant une récurrence de macro au niveau du préprocesseur ne commenceront jamais à compiler le code réel non plus.
Arnauld

11
Cela correspond au but recherché: avoir un processus de construction infini. +1!
YSC

23

C ++, 60 58

template<class T>class a{a<T*>operator->();};a<int>i=i->b;

Cela crée de manière récursive des instances class aavec différents paramètres de modèle. GCC 7.0 s’arrête après 900 niveaux de récursivité avec des tonnes d’erreurs concernant la operator->confidentialité, mais par exemple, ICC 17 et le compilateur d’optimisation Microsoft (R) C / C ++ 19 sur Time-God .

Le problème avec cela est que probablement tous les compilateurs vont manquer de mémoire à un moment donné, donc même sans limite de récursivité, cela va s'arrêter. La même chose s'applique probablement à la réponse de Clojure.

Edit: 2 octets enregistrés par bolov - Merci


1
plus court:a<int>i=i->b;
bolov

1
@Pockets, comme je l'ai dit dans ma réponse, c'est parce que la operator->classe est privée par défaut. Dans une structure, il est public et i->bpeut donc y accéder.
Christoph

1
gcc 4.4.7 semble être suspendu indéfiniment ici. En attente de l'infini ou de l'affichage de la sortie, selon la première éventualité.
Mettra à

1
@osuka_ est-il toujours en cours d'exécution?
Christoph

1
@Christoph Nope, il s'est écrasé avec un SIGSEGV après l'avoir laissé en marche pendant quelques jours. Oublié de mettre à jour, cependant - merci pour le rappel!
osuka_

23

Perl , 15 à 13 octets

BEGIN{{redo}}

Essayez-le en ligne!

Maintenant, avec 2 octets sauvés: @Zaid m'a rappelé un moyen de faire une boucle en Perl.

C’est assez simple: il n’installe qu’un crochet d’analyse avec une boucle infinie, ce qui rend le code très long à analyser. Perl a l'avantage de permettre l'exécution de code arbitraire au milieu de l'analyse; les points d'ancrage de l'analyseur sont spécifiés dans Perl lui-même et sont fréquemment utilisés pour importer des bibliothèques ou modifier les règles d'analyse d'un identifiant que vous souhaitez traiter. un mot clé.) Le Essayez-le en ligne! Le lien ci-dessus donne l' -coption (pour compiler le code afin de vérifier l'exactitude de la syntaxe, mais pas pour l'exécuter), pour prouver que la boucle infinie se produit au moment de la compilation.

Au cas où vous vous interrogeriez sur le "temps de compilation" dans un langage de script: Perl compile réellement en bytecode puis exécute le bytecode, mais il s'agit d'un détail qui est rarement pertinent lors de sa programmation. La -MO=famille d’options en ligne de commande peut être utilisée pour faire des choses avec le bytecode autre que l’exécuter (mais pas avec ce programme, car la boucle infinie se produit avant que le bytecode puisse être généré).


1
a:goto aa l'air bien aussi (même nombre malheureusement malheureusement).
Dada

3
BEGIN{{redo}}vous épargnera quelques octets
Zaid

20

C ++, 37 30 29 octets

int f(auto p){f(&p);},a=f(0);

Il utilise le futur paramètre de fonction automatique. Il a été proposé dans C ++ 17, mais je ne pense pas que cela ait réussi. gcccependant le supporte comme une extension.

Fondamentalement

void foo(auto p);

est équivalent à

template <class T>
void foo(T p);

Le code tente d'instancier frécursivement avec différents arguments de modèle. gccéchoue avec

erreur fatale: la profondeur d'instanciation du modèle dépasse 900 (utilisez -ft-modèle-profondeur = pour augmenter le maximum)

Avec -ftemplate-depth=10000j'ai réussi à cracher "tués - le temps de traitement dépassé" sur godbolt.

Vérifiez-le sur godbolt


1 octet enregistré par Quentin. Je vous remercie.


1
Un octet peut être sauvegardé en utilisant intcomme type de retour :)
Quentin

En effet, autoles paramètres de fonction n’ont pas été intégrés à C ++ 17; et int f() { ... }, a;n'est pas non plus une déclaration légale la dernière fois que j'ai vérifié. (Vous ne pouvez pas mélanger des déclarations de fonction avec des déclarations de variable comme celle-ci.) Vous avez ici un dialecte extrêmement spécifique à GCC de C ++. Non pas qu'il y ait quelque chose qui cloche dans ce contexte. :)
Quuxplusone

19

Common Lisp, 8 octets

#.(loop)

Le compilateur essaiera de lire un formulaire et rencontrera la macro sharpsign-dot reader, qui évalue le code au moment de la lecture et utilise son résultat comme formulaire à compiler. Ici, le code en cours d'exécution est une boucle infinie.


17

TeX, 9 octets

\def~{~}~

TeX fonctionne en développant des macros. La plupart du temps, les macros de TeX (également appelées séquences de contrôle ) sont de la forme, \namemais il est également possible de définir certains caractères en tant que macros. Ce sont les caractères actifs . Le caractère ~est actif par défaut en clair TeX et peut donc être utilisé comme nom de macro sans déclaration supplémentaire. Le \def~{~}dans ce qui précède définit ~pour qu'il se développe ~. C'est-à-dire que chaque fois que TeX rencontre, ~il le remplace par ~, puis réexamine le remplacement, ce qui signifie qu'il rencontre une occurrence entièrement nouvelle de ~et le remplace par ~. Ceci définit la boucle infinie. Il suffit ensuite de commencer la boucle et c'est ce que fait la finale ~.


Ajouté en édition

Pour que cela soit correctement compilé , appelez-le en tant que:

pdftex -ini "&pdftex \def~{~}~"

Le -inidrapeau indique que pdftexdevrait compiler un nouveau fichier de format. Il s'agit d'un ensemble précompilé de définitions qui peuvent être chargées lorsque TeX est appelé ultérieurement pour accélérer le traitement d'un document (LaTeX2e en est un exemple). Je suppose que cela &pdftexajoute quelques octets, ce qui porte le total à 17.


Cela se produit-il au moment de la compilation? La question nécessite que la boucle infinie se produise lors de la compilation, pas lors de l'exécution.

@ ais523 N'avait pas vraiment pensé à cela. Je me moquais de la réponse de TikZ. J'ai ajouté une alternative qui est définitivement compilée, au détriment de quelques octets supplémentaires.
Loop Space

2
@ ais523: Comme toujours, "compiler" et "courir" sont les deux faces d'une même pièce. Personnellement, je considère le code source de TeX comme une "compilation" dans des documents PDF (qui sont ensuite "exécutés" en affichant), de la même manière que le code source C ++ est "compilé" en fichiers .exe (qui sont ensuite "exécutés" par fonctionnement). Mais vous pouvez aussi penser que le pdftexprogramme "interprète" l'entrée TeX pour produire un PDF en tant que "sortie" - de la même manière que le g++programme "interprète" l'entrée C ++ pour produire un fichier .exe en tant que "sortie". ;)
Quuxplusone le

13

Haskell, 25 + 17 = 42 octets

a= $(let a='a':a in[|a|])

Un métaprogramme Haskell simple qui définit une valeur infinie et tente de la calculer au moment de la compilation.

Invoke with ghc -XTemplateHaskell <file.hs>(+17 pour le paramètre du compilateur)


Ne $(let a=a in a)fonctionne pas (pour 32 octets)?
Ry-

1
Nan! GHC est trop intelligent. Toute boucle infinie du formulaire let a = a in aest réécrite en une exception, ce qui provoque simplement une erreur du compilateur, par opposition à une boucle infinie. (Bien que cela fonctionne peut-être avec un compilateur Haskell différent, mais je n'en ai pas sous la main pour essayer)
user2407038

Cela fonctionne avec runghc pour moi, alors je dirais que c'est valide. (En fait, cela fonctionne aussi avec ghc. 8.0.1 ici.)
Ry-

Vraiment? Je suis aussi sur ghc 8.0.1 - pour moi, cela donne Exception when trying to run compile-time code: <<loop>>, à la fois dans l'interpréteur et lors de la compilation ... techniquement, le code ci-dessus meurt avec une exception également, mais un débordement de pile, explicitement autorisé par la spécification - et si vous aviez une mémoire infinie, elle bouclerait vraiment pour toujours. L' <<loop>>exception se déclenche bien avant que ma machine ne manque de mémoire.
user2407038

12

gradle, 10 à 9 octets

for(;;){}

avec le code ci-dessus placé dans un build.gradlefichier. Gradle utilise groovy comme langage de base, donc nous parlons vraiment de groovy ici, mais comme la question portait sur le temps de construction, je pensais que gradle serait plus approprié.

L'exécution de toutes les commandes de génération de niveaux avec le code ci-dessus imprime la ligne d'état de la génération compatible pointy-haired-boss:

$ gradle tasks
> Configuring > 0/1 projects > root project

si vous visez une augmentation, ajoutez le -ddrapeau de débogage pour:

$ gradle -d tasks
14:56:25.522 [INFO] [org.gradle.internal.nativeintegration.services.NativeServices] Initialized native services in: .gradle/native
14:56:25.757 [DEBUG] [org.gradle.launcher.daemon.client.DaemonClient] Executing build 84908c0d-f28d-4c57-be61-40eaf0025e16.1 in daemon client {pid=27884}
14:56:25.761 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface tun0
14:56:25.762 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
14:56:25.762 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a multicast interface? false
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x:x:x:x:x:x:%tun0
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x.x.x.x
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a multicast interface? true
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x:x:x:x:x:x:%eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x.x.x.x
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote multicast interface eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface lo
<snip>
14:57:07.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
> Configuring > 0/1 projects > root project

qui, en plus de paraître impressionnant et compliqué, met également à jour un nouvel ensemble de:

15:07:57.054 [DEBUG] [org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
15:07:57.054 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
15:07:57.054 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.

toutes les 10 secondes, les lignes d'état donnent l'impression que la compilation est occupée à effectuer d'importantes tâches techniques.


8

SWI-Prolog, 34 octets

term_expansion(_,_):-repeat,1=0.

Explication

term_expansion/2 est quelque chose qui est appelé automatiquement par le compilateur avant de compiler le code pour transformer certains termes du code source en d'autres termes.

Nous présentons ici une nouvelle règle pour term_expansion/2: repeat,1=0..

repeat/0 est un prédicat qui réussit toujours et fournit un nombre infini de points de choix.

1=0essaie de s'unifier 1avec 0, ce qui est toujours false. Cela fera revenir le compilateur repeat(puisqu'il fournit toujours un point de choix) et 1=0recommence, etc.


Ne fonctionne pas dans GNU Prolog, donc je suppose que ceci est spécifique à la mise en oeuvre. Vous voudrez peut-être mettre le nom d'un compilateur dans l'en-tête. (Je suppose que SWI Prolog.)

@ ais523 Merci, je n'ai pas vérifié d'autres distributeurs, mais comme le compilateur est généralement assez spécifique, j'aurais dû le savoir mieux ...
Fatalize 16/02/17

@ ais523 Cependant , vous pourriez peut-être utiliser cette option expand_term(car il est dit que cela term_expansionne peut pas être utilisé comme ici dans GNU Prolog). Cela ne fonctionne pas avec expand_termSWI cependant.
Fataliser

7

GNU Make, 44

.PHONY:x
$(MAKEFILE_LIST):x;sleep 1;touch $@

Je ne peux pas demander de crédit pour cela. Il est dérivé de l'ouvrage de Robert Mecklenburg, Gestion de projets avec GNU Make: La puissance de GNU: Construire n'importe quoi .

Lorsque make exécute ce fichier makefile, il voit que celui-ci est obsolète (la cible .PHONY étant obsolète, elle exécute la commande touch, qui met à jour l'horodatage du fichier makefile. Ensuite, relit le fichier et découvre le fichier makefile est obsolète ... Vous voyez l'idée.

Je préfère cela à l’autre Make answer car il n’utilise pas de récursivité. Sur ma machine virtuelle, l’autre réponse est toujours en train de traiter les processus et, à une profondeur d’environ 7 000 personnes, la machine virtuelle s’arrête de ne plus répondre. Cependant, avec cette réponse, il est possible de continuer indéfiniment sans consommer les ressources du système. Vous pourrez vraiment vous détendre avec cette version. J'ai parcouru plus de 1 000 000 itérations sans dégradation apparente du système.

Notez que je devais ajouter le sleep 1pour que l'horodatage du fichier Make soit réellement mis à jour à chaque fois. Vous pouvez le changer sleep 0.01si vous voulez que les itérations soient un peu plus rapides.


6

GNU Forth, 15 octets

Golfé

: : [do] [loop]

Redéfinit (recompile) le mot :et appelle une boucle infinie immédiate [do] [loop]dans la nouvelle définition (juste au moment de la compilation).

Une catégorie de mots ne sont pas compilés. Ces mots dits immédiats sont exécutés (exécutés maintenant), que l'interpréteur de texte interprète ou compile.

Essayez-le en ligne!


5

Clojure, 21 octets

(defmacro a[]`(a))(a)

Attache le compilateur en définissant une macro qui émet à plusieurs reprises des appels à elle-même.

Sur mon téléphone, le REPL se bloque et retarde le périphérique. Sur mon ordinateur portable, cela échoue carrément avec un StackOverflow.

Malheureusement, le StackOverflow se produit instantanément, mais il reste valide conformément aux règles.


5

MSBuild, 130 octets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="X">
        <Exec Command="msbuild"/>
    </Target>
</Project>

Enregistrez-le dans un fichier avec .projextension et exécutez-le à msbuildpartir de l'invite de commande. MSBuild exécutera sa seule cible qui génère simplement un autre msbuildprocessus.


L'indentation est-elle requise pour que cela fonctionne? Qu'en est-il des nouvelles lignes? Il est normalement possible de jouer en blanc.

Non, c'est plus facile à lire. Le nombre de caractères n'inclut pas les espaces.
Danko Durbić

1
Ah oui. Dans ce cas, vous devriez probablement le mentionner dans le corps du message.


4

Mathematica 33 octets

Compile[{},Evaluate@While[True,]]

Le code tentera d'évaluer symboliquement l'argument avant la compilation et l'argument lui-même est une boucle infinie. La fonction While a un second argument nul car ce n'est pas important.


"avant la compilation" Ouais ... non.
CalculatorFeline

Veuillez fournir un argument valide. reference.wolfram.com/language/tutorial/…
Kelly Lowder

La question est la suivante: la boucle se produit-elle pendant Compileou avant l' appel?
CalculatriceFeline

3

Haskell (GHC, sans modèle Haskell ni règles de réécriture personnalisées) , 138

{-#LANGUAGE FlexibleContexts,UndecidableInstances#-}
data A x=A
class C y where y::y
instance C(A(A x))=>C(A x)where y=A
main|A<-y=pure()

Théoriquement, cela entre dans une boucle infinie de la même manière que l'approche C ++ : la méthode polymorphe yest instanciée pour des types de plus en plus convolutés. En pratique, la taille de pile allouée par défaut déborde rapidement:

$ ghc-7.10 wtmpf-file14146.hs 
[1 of 1] Compiling Main             ( wtmpf-file14146.hs, wtmpf-file14146.o )

wtmpf-file14146.hs:5:9:
    Context reduction stack overflow; size = 101
    Use -fcontext-stack=N to increase stack size to N
      C (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A t0))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
    In a stmt of a pattern guard for
                   an equation for ‘main’:
      A <- y
    In an equation for ‘main’: main | A <- y = pure ()

Crédits à Luke Palmer .


1

Haskell (ghc), 32 + 2 = 34 octets

{-#RULES""main=main#-}
main=main

courir avec ghc -O <file>. Déclenche une règle de réécriture pour la fonction principale qui réécrit dans la même chose. La seule caractéristique malheureuse est que ghc est suffisamment intelligent pour le détecter et s’arrêter après 100 itérations. Je ne sais pas d'un moyen facile de désactiver ce comportement.


1

Boo, 25 octets

macro l:
 x=0 while 1>0
l

Cela définit une macro, qui s'exécute au moment de la compilation, qui exécute une boucle infinie, puis appelle la macro.


1

Rouille, 18 octets

include!(file!());

Auto-inclure classique. Rustc est ennuyeusement sain cependant, et par défaut, il renflouera après 128 récurrences, et il étend la profondeur en premier afin que la croissance exponentielle ne fonctionne pas non plus. La même chose s'applique aux solutions C et C ++.


0

Facteur , 29 16

<< [ t ] loop >>

La partie entre << >>est exécutée au moment de l'analyse.

Pour ce qui [ t ] loopest, je vous laisse deviner ...

Vous pouvez mettre cela dans le Listener tel quel, ou l'ajouter à un vocabulaire ou à un fichier de script avec le contenu passe-partout correspondant.


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.