El código más corto para aflojar legítimamente


146

Soy desarrollador y no tengo ganas de hacer mi trabajo. Sé por XKCD que la mejor excusa para aflojar es que su código está compilando . ¡Debido a esto, creo que necesito un código que se compilará para siempre! Y debido a que soy flojo y no quiero tener que escribir mucho, esto tiene que hacerse con el código más corto posible.

Entonces, su tarea es escribir un programa que sea sintácticamente válido, pero hará que el compilador ingrese un bucle infinito.

Especificaciones

  • Debe usar un lenguaje que tenga un compilador, obviamente.
  • Especifique la implementación utilizada en cada solución.
  • Este es el , por lo que gana la solución válida más corta (en bytes).
  • El compilador puede terminar por quedarse sin memoria o espacio de pila.

1
@obarakon No estoy de acuerdo. El código del otro desafío no se puede transferir a este desafío con facilidad. Los desafíos, mientras que ambos implican bucles infinitos, son fundamentalmente diferentes.
Sriotchilism O'Zaic

1
@obarakon Tampoco soy un tonto de esta pregunta , ya que no es un código de golf.
Esolanging Fruit


1
No estoy seguro de que se ajuste a este desafío (e incluso si lo hiciera, obtendría un puntaje terrible), pero para aquellos interesados, así es como lo haría Java: definir un procesador de anotaciones (fragmento de ideona) que usará al invocar javaccon su -processoropción. Hace que la compilación de cualquier clase se cuelgue para siempre.
Aaron

66
Para las respuestas que provocan el bloqueo del compilador: con el fin de aflojar, creo que todavía quieres que demore tanto como sea posible.
GuitarPicker

Respuestas:


16

Japt , 2 bytes

`ÿ

Puede probar esto en línea aquí , pero no lo recomendaría, ya que congelará su navegador.

Explicación

Japt usa la biblioteca shoco para comprimir cadenas. Un backtick le dice al compilador que descomprima todo hasta el siguiente backtick o al final del archivo. Cada byte hace lo siguiente:

  • 00-7F se dejan intactos
  • 80-BFcada transforman en un par de dos letras minúsculas común ( at, oo, th, etc.).
  • C0-DFcada uno consume el siguiente byte y se transforma en una cadena común de cuatro letras .
  • E0-EFcada uno consume los siguientes tres bytes y se transforma en una cadena de ocho letras "común" (que comienza Whererery desciende desde allí).
  • F0-F7 rompa el descompresor, aunque todavía devuelve todo al byte de ruptura.
  • F8-FFhacer que el descompresor entre en un bucle infinito. No estoy seguro de por qué es así, ya que no estoy muy familiarizado con el funcionamiento interno de la biblioteca shoco (y el código JavaScript es completamente ilegible ), pero es bastante útil en este caso.

No creo que haya otra forma de meterse con el compilador de Japt, pero nunca se sabe ...


10
¿Qué quieres decir con que es ilegible? Claramente, no estás intentando lo suficiente.
fəˈnɛtɪk

Me gustaría que hubiera una decompilador emscripten ...
tbodt

58

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

Un montón de bytes guardados gracias a wchargin

Un byte guardado gracias a Chris H

\input tikz
\tikz\pic

En realidad me encontré con este por accidente cuando estaba trabajando en la tarea. Pasé bastante tiempo esperando que se compilara antes de darme cuenta de lo que estaba sucediendo.

Esto tiene dos partes:

\input tikz

Esto carga el paquete TikZ

y:

\tikz\pic

Esto inicia un \tikzentorno y un comando de dibujo.

Que esta pasando

El compilador pdflatex tiene problemas \tikz\picy entra en modo interactivo, lo que hace que se detenga indefinidamente.


(1/2) No puedo reproducir esto. Aparece el mensaje "¡¿Fugitivo argumento?! El \draw l\end {document}archivo finalizó al escanear el uso de \tikz@next." pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian). tikz 13/10/2010 v2.10. Esto es estándar apt install texlive-fullen Ubuntu 14.04.
wchargin

1
@wchargin Estoy usando la misma versión pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016) y, de hecho, se repite indefinidamente. Gracias por los consejos.
Sriotchilism O'Zaic

1
Puede guardar un byte usando en \piclugar de \ draw` - exactamente el mismo comportamiento (probado usando tikz 1.142)
Chris H

3
No puedo creer que realmente esté abogando por no usar TikZ, pero seguramente el uso de este es excesivo aquí. ¿Qué tiene de malo el viejo \def\a{\a}\a(12 bytes)? O, como este es el código de golf y ~está activo por defecto, \def~{~}~(9 bytes)
Loop Space

2
@LoopSpace No hay nada malo con ellos. Simplemente no sabía que existía. Si desea dar su propia respuesta, siéntase libre.
Sriotchilism O'Zaic

40

C, 18 bytes

#include __FILE__

Los compiladores generalmente se rendirán después de recurrir unas 200 veces.

¿La construcción DOM cuenta como un paso de compilación? Si es así, entonces x.htm:

<iframe src=x.htm>

14
Recuerdo que los conjuntos de marcos recursivos solían bloquear IE4 con tanta fuerza que a veces eliminaban componentes importantes del sistema operativo. Entonces el HTML allí probablemente cuenta.

10
@ ais523, eso es porque, en los días IE4, Internet Explorer era un "componente importante del sistema operativo".
Mark

2
Un poco de ajuste y es válida PHP: <?include __FILE__;.
Ismael Miguel

66
No puedo publicar esta respuesta porque mi representante no es lo suficientemente alto, pero dos alternativas son: #include "/ dev / zero" y #include "/ dev / stdin" - ¡ten cuidado al ejecutar la primera!
rrauenza

2
Cuando lo probé, el uso de memoria de gcc comenzó a crecer rápidamente sin límite, el sistema dejó de responder y mi perro guardián finalmente se activó y se reinició. Fue bastante divertido :)
rrauenza

38

Java, 102 95 89 88 78 bytes

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

Esto termina con lo StackOverflowErrorque sucede porque el sistema de resolución genérico no puede decidir una raíz contra la cual resolver los otros genéricos.

Créditos donde vencen .

¿Qué pasa aquí?

  1. A<T>está ahí para tener un padre de 1 letra. Es genérico Podría haberlo usado List, pero las importaciones y la repetición de 4 letras son demasiado largas.
  2. B<T> declara un genérico básico.
  3. B extends Ase requiere tener una jerarquía entre By A.
  4. extends A<A>crea una auto referencia en A<T>.
  5. A<? super B> desencadena la búsqueda de genéricos en A<T>
  6. B<B<T>>crea una autorreferencia en B<T>.
  7. A<...> a=new B<>()fuerza el uso de los genéricos, en lugar de simplemente la definición de los mismos, forzando la resolución al compilar B, y no después.
  8. A<?super Bcrea una no referencia propia, por lo que tenemos una referencia a un tipo y a otro en los genéricos de A.
  9. B<A>crea una no referencia propia, por lo que tenemos una referencia a un tipo y a otro en los genéricos de B.

Ahora, el tipo Atiene tipo genérico Ay B, pero ¿cuál se debe elegir? Olvídate de ti mismo, tratemos de resolverlo B. Silbido.

De acuerdo, ¿ Btiene tipo genérico Ay B, pero cuál elegir? Olvídate de ti mismo, tratemos de resolverlo A. Apestar.

Este tipo de recursividad en realidad no puede ser evitado porque hay casos legítimos como A<B<A<B<A<B<Object>>>>>>: por ejemplo, un objeto JSON: List<Map<String,Map<String,List<Map<String,List<String>>>>>>.

Resultado de compilación

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

En mi sistema, el seguimiento de la pila se detiene después de mostrar 1024 líneas, que en realidad son las 4 mismas líneas repetidas 256 veces, lo que demuestra una recursión infinita. Te ahorraré todo ese rastro.

Ahorros

  1. 102 → 95 bytes: reemplazado interface+ implementscon class+ extends.
  2. 95 → 89 bytes: reemplazado Longcon A(dos veces).
  3. 89 → 88 bytes: operador de diamante usado ( new B<A>()new B<>()).
  4. 88 → 78 bytes: movió la declaración de la variable a un miembro de la clase, gracias a VoteToClose .

1
¿Qué estoy mirando
Addison Crump

Puede acortar esto a 78 bytes con:class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
Addison Crump

@VoteToClose Estás viendo un excelente ejemplo de indecidibilidad en los genéricos de Java. Se supone que cada genérico se resuelve con una raíz común a la que luego se valida. Lo que sucede aquí es que el genérico de Bcontiene una referencia indecidible al genérico, Aque a su vez contiene una referencia indecidible al genérico de B. Cuando el resolutor no puede decidir, verifica las referencias incluidas, pero aquí ambos genéricos se refieren entre sí de una manera indecidible (principalmente gracias a las auto-referencias y la superpalabra clave. Por lo tanto, el solucionador realmente hace ping-pong entre los dos genéricos.
Olivier Grégoire

Estaba pensando en crear un problema en tiempo de compilación con anotaciones cíclicas: public @interface X {@X(x=X.class)Class<? extends X> x();}... Pero rápidamente me di cuenta de por qué eso no funcionaría jajaja.
Magic Octopus Urn

34

GNU Makefile, 8 7 bytes

Un byte guardado gracias a KonradRudolph

Guardado como Makefilee invocado por make:

x:;make

Esto producirá una recursión de construcción infinita en el primer objetivo encontrado "x".

No hace falta decir que realmente no desea ejecutar esta bomba tenedor en su servidor de producción. :-)

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

Versión alternativa, 5 bytes.

Sugerido por KonradRudolph:

x:;$_

$_es una referencia al último argumento del comando anterior. Más específicamente, se resuelve aquí como la ruta absoluta al comando que se está ejecutando, que es en makesí mismo.

Esto debería funcionar bien en un entorno Bash genuino, pero no en Windows + MinGW.


2
Hmm, no creo makeque realmente compile el Makefile (solo lo interpreta).
zepelín

3
@zeppelin Tienes razón, esta es probablemente una respuesta límite. Dicho esto, las presentaciones que involucraron macro recursividad en el nivel de preprocesador nunca comenzarán a compilar ningún código real tampoco.
Arnauld

11
Se ajusta al objetivo previsto: tener un proceso de construcción infinito. +1!
YSC

23

C ++, 60 58

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

Esto crea instancias recursivamente class acon diferentes parámetros de plantilla. GCC 7.0 se detiene después de 900 niveles de recursión con toneladas de errores sobre operator->ser privado pero, por ejemplo, ICC 17 y Microsoft (R) C / C ++ Optimizing Compiler 19 se agotan en Godbolt .

El problema con eso es que probablemente todos los compiladores se quedarán sin memoria en algún momento, por lo que incluso sin límites de recursión, esto se detendrá. Lo mismo probablemente se aplica a la respuesta Clojure, también.

Editar: 2 bytes guardados por bolov - Gracias


1
más corto:a<int>i=i->b;
bolov

1
@Bolsillos como dije en mi respuesta, eso se debe a que el valor operator->predeterminado es privado dentro de una clase. Dentro de una estructura es pública y, por i->blo tanto, puede acceder a ella.
Christoph

1
gcc 4.4.7 parece colgar indefinidamente aquí. Esperando al infinito o para que muestre la salida, lo que ocurra primero. Se actualizará
osuka_

1
@osuka_ ¿sigue funcionando?
Christoph

1
@ Christoph no, se estrelló con un SIGSEGV después de dejarlo funcionando durante un par de días. Sin embargo, olvidé actualizar, ¡gracias por el recordatorio!
osuka_

23

Perl , 15 13 bytes

BEGIN{{redo}}

Pruébalo en línea!

Ahora con 2 bytes guardados: @Zaid me recordó una forma terser de hacer un bucle en Perl.

Esto es bastante simple: simplemente instala un gancho de analizador con un bucle infinito, lo que hace que el código tarde infinitamente en analizar. (Perl es bueno porque le permite ejecutar código arbitrario en el medio del análisis; los ganchos del analizador se especifican en el propio Perl y se usan con frecuencia para hacer cosas como importar bibliotecas o cambiar las reglas de análisis para un identificador que desee tratar como una palabra clave.) ¡Pruébelo en línea! el enlace de arriba ofrece la -copción (compilar el código para verificar la sintaxis de la corrección, pero no ejecutarlo), para probar que el bucle infinito ocurre en tiempo de compilación.

En caso de que se esté preguntando acerca del "tiempo de compilación" en un lenguaje de scripting: Perl realmente compila en bytecode y luego ejecuta el bytecode, pero este es un detalle que rara vez es relevante al programarlo. La -MO=familia de opciones de línea de comando se puede usar para hacer cosas con el código de bytes además de ejecutarlo (aunque no con este programa, ya que el bucle infinito ocurre antes de que se pueda generar el código de bytes).


1
a:goto atambién se ve bien (tristemente el mismo bytecount).
Dada

3
BEGIN{{redo}}te ahorrará algunos bytes
Zaid

20

C ++, 37 30 29 bytes

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

Utiliza el futuro parámetro de función automática. Se propuso en C ++ 17, pero no creo que lo haya logrado. gccSin embargo, lo admite como una extensión.

Básicamente

void foo(auto p);

es equivalente a

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

El código intenta crear instancias frecursivamente con diferentes argumentos de plantilla. gccfalla con

error fatal: la profundidad de creación de instancias de plantilla supera el máximo de 900 (use -ftemplate-depth = para aumentar el máximo)

Con -ftemplate-depth=10000eso lo escupí "Asesinado: tiempo de procesamiento excedido" en godbolt.

Compruébalo en godbolt


1 byte guardado por Quentin. Gracias.


1
Se puede guardar un byte utilizando intcomo tipo de retorno :)
Quentin

De hecho, los autoparámetros de la función no llegaron a C ++ 17; y tampoco int f() { ... }, a;es una declaración legal la última vez que lo revisé. (No puede mezclar declaraciones de funciones con declaraciones de variables como esa). Lo que tiene aquí es un dialecto de C ++ extremadamente específico de GCC. No es que haya nada malo con eso en este contexto. :)
Quuxplusone

19

Lisp común, 8 bytes

#.(loop)

El compilador intentará leer un formulario y se encontrará con la macro del lector de puntos de sharpsign , que evalúa el código en el momento de la lectura y utiliza su resultado como el formulario para compilar. Aquí, el código que se ejecuta es un bucle infinito.


17

TeX, 9 bytes

\def~{~}~

TeX funciona expandiendo macros. La mayoría de las veces, las macros de TeX (también llamadas secuencias de control ) tienen la forma \namepero también es posible definir ciertos caracteres como macros, estos se llaman caracteres activos . El carácter ~está activo de forma predeterminada en TeX simple y, por lo tanto, se puede utilizar como un nombre de macro sin más declaraciones. El \def~{~}en lo anterior define ~para que se expanda a ~. Es decir, cada vez que TeX se encuentra ~, lo reemplaza por ~y luego vuelve a examinar el reemplazo, lo que significa que encuentra una ocurrencia completamente nueva ~y lo reemplaza por ~. Esto define el bucle infinito. Todo lo que se necesita es comenzar el ciclo y eso es lo que hace el final ~.


Agregado en editar

Para hacer esto correctamente compilado , invoque como:

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

La -inibandera dice que pdftexdebería compilar un nuevo archivo de formato. Este es un conjunto de definiciones precompiladas que se pueden cargar cuando se invoca TeX más tarde para acelerar el procesamiento de un documento (LaTeX2e es un ejemplo de esto). Supongo que &pdftexagrega algunos bytes, llevando el total a 17.


¿Esto sucede en tiempo de compilación? La pregunta requiere que ocurra el bucle infinito durante la compilación, no cuando se ejecuta.

@ ais523 No había pensado completamente en eso. Estaba hablando de la respuesta TikZ. He agregado una alternativa que definitivamente se compila, a expensas de unos pocos bytes más.
Loop Space

2
@ ais523: Como siempre, "compilar" y "correr" son dos caras de la misma moneda. Personalmente, pienso en el código fuente de TeX como "compilación" en documentos PDF (que luego se "ejecutan" visualizando), de la misma manera que el código fuente de C ++ se "compila" en archivos .exe (que luego son "ejecutados" por corriendo). Pero también podría pensar en el pdftexprograma como "interpretando" la entrada de TeX para producir un PDF como "salida", de la misma manera que el g++programa "interpreta" la entrada de C ++ para producir un archivo .exe como "salida". ;)
Quuxplusone

13

Haskell, 25 + 17 = 42 bytes

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

Un metaprograma simple de Haskell que define un valor infinito e intenta calcular ese valor en tiempo de compilación.

Invoque con ghc -XTemplateHaskell <file.hs>(+17 para el parámetro al compilador)


¿ $(let a=a in a)No funciona (para 32 bytes)?
Ry-

1
¡No! GHC es demasiado inteligente. Cualquier bucle infinito del formulario let a = a in ase reescribe en una excepción, lo que simplemente provoca un error del compilador en lugar de un bucle infinito. (aunque tal vez esto funcionaría con un compilador Haskell diferente, pero no tengo uno para probar)
user2407038

Funciona con runghc para mí, por lo que diría que es válido. (En realidad, también funciona con ghc. 8.0.1 aquí.)
Ry-

De Verdad? También estoy en ghc 8.0.1, para mí Exception when trying to run compile-time code: <<loop>>, tanto en el intérprete como al compilar ... técnicamente, el código anterior también muere con una excepción, pero un desbordamiento de pila, que está explícitamente permitido por la especificación: y si tuvieras memoria infinita, realmente se repetiría para siempre. La <<loop>>excepción se dispara mucho antes de que mi máquina se quede sin memoria.
user2407038

12

gradle, 10 9 bytes

for(;;){}

con el código anterior colocado en un build.gradlearchivo. Gradle usa groovy como su lenguaje base, por lo que realmente estamos hablando de groovy aquí, pero como la pregunta era sobre el tiempo de construcción, pensé que gradle sería más apropiado.

La ejecución de cualquier comando de compilación de Gradle con el código anterior imprime la línea de estado de compilación compatible con el jefe puntiagudo:

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

Si está buscando un aumento, agregue el -dindicador de depuración para:

$ 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

que además de verse impresionantemente complicado también se actualiza con un nuevo conjunto 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.

líneas de estado cada 10 segundos, lo que hace que parezca que la compilación está ocupada haciendo importantes cosas técnicas ...


8

SWI-Prolog, 34 bytes

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

Explicación

term_expansion/2 es algo que el compilador llama automáticamente antes de compilar el código para transformar algunos términos del código fuente en otros.

A continuación, se introduce una nueva regla para term_expansion/2: repeat,1=0..

repeat/0 es un predicado que siempre tiene éxito y proporciona un número infinito de puntos de elección.

1=0está tratando de unificar 1con 0, que siempre es false. Esto hará que el compilador retroceda repeat(ya que siempre proporciona un punto de elección) e intente 1=0nuevamente, etc.


No funciona en GNU Prolog, por lo que supongo que esto es específico de la implementación. Es posible que desee poner el nombre de un compilador en el encabezado. (

@ ais523 Gracias, no comprobé otras distribuciones, pero como el material del compilador suele ser bastante específico, debería haberlo sabido mejor ...
Fatalize

@ ais523 Sin embargo, de acuerdo con esto , es posible que pueda usar expand_termen su lugar (como se dice term_expansion, no se puede usar como aquí en GNU Prolog). Sin embargo, no funciona con expand_termSWI.
Fatalize

7

GNU Make, 44

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

No puedo reclamar crédito por esto. Se deriva del libro de Robert Mecklenburg Gestión de proyectos con GNU Make: El poder de GNU Make para construir cualquier cosa .

Cuando make ejecuta este archivo MAKE, ve que el archivo MAKE está desactualizado (porque el objetivo .PHONY está desactualizado, por lo que ejecuta el comando táctil, que actualiza la marca de tiempo del archivo MAKE. Luego, make vuelve a leer el archivo y descubre el makefile está desactualizado ... Bueno, ya tienes la idea.

Prefiero esto a la otra respuesta de respuesta porque no utiliza la recursividad. En mi VM, la otra respuesta Make continúa los procesos de bifurcación y en algún lugar alrededor de 7,000 de profundidad, la VM se detiene por completo. Sin embargo, con esta respuesta puede continuar indefinidamente sin consumir recursos del sistema. Realmente podrás relajarte con esta construcción. He pasado más de 1,000,000 iteraciones sin degradación aparente del sistema.

Tenga en cuenta que tuve que agregar el sleep 1para que la marca de tiempo del archivo MAKE se actualice realmente cada vez. Puede cambiar esto sleep 0.01si desea que se queme a través de iteraciones un poco más rápido.


6

GNU Forth, 15 bytes

Golfed

: : [do] [loop]

Vuelve a definir (vuelve a compilar) la palabra :e invoca un bucle infinito inmediato [do] [loop]dentro de la nueva definición (justo en el momento de la compilación).

Una categoría de palabras no se compila. Estas llamadas palabras inmediatas se ejecutan (se realizan ahora) independientemente de si el intérprete de texto está interpretando o compilando.

¡Pruébelo en línea!


5

Clojure, 21 bytes

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

Vincula el compilador definiendo una macro que emite repetidamente llamadas para sí mismo.

En mi teléfono, esto hace que REPL se cuelgue y retrase el dispositivo. En mi computadora portátil, esto falla por completo con un StackOverflow.

Desafortunadamente, el StackOverflow ocurre instantáneamente, pero sigue siendo válido según las reglas.


5

MSBuild, 130 bytes

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

Guarde esto como un archivo con .projextensión y ejecútelo msbuilddesde el símbolo del sistema. MSBuild ejecutará su único objetivo que simplemente genera otro msbuildproceso.


¿Se requiere la sangría para que esto funcione? ¿Qué pasa con las nuevas líneas? Normalmente es posible jugar golf en espacios en blanco.

No, es más fácil de leer. El recuento de caracteres no incluye espacios en blanco.
Danko Durbić

1
Ah bien. En ese caso, probablemente deberías mencionar eso en el cuerpo de la publicación.


4

Mathematica 33 Bytes

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

El código intentará evaluar simbólicamente el argumento antes de la compilación, y el argumento en sí mismo es un bucle infinito. La función While tiene un segundo argumento nulo ya que no es importante.


"antes de la compilación" Sí ... no.
CalculatorFeline

Proporcione un argumento válido. reference.wolfram.com/language/tutorial/…
Kelly Lowder

La pregunta es, ¿ocurre el bucle durante la Compilellamada o antes?
CalculatorFeline

3

Haskell (GHC, sin Template Haskell o reglas de reescritura personalizadas) , 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()

Teóricamente, esto entra en un bucle infinito de la misma manera que lo hace el enfoque de C ++ : el método polimórfico yse instancia a tipos cada vez más intrincados. En la práctica, el tamaño de pila asignado predeterminado se desborda rápidamente:

$ 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éditos a Luke Palmer .


1

Haskell (ghc), 32 + 2 = 34 bytes

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

correr con ghc -O <file>. Activa una regla de reescritura para la función principal que reescribe en la misma cosa. La única característica desafortunada es que ghc es lo suficientemente inteligente como para detectar esto y detenerse después de 100 iteraciones. No sé de una manera fácil de deshabilitar este comportamiento.


1

Boo, 25 bytes

macro l:
 x=0 while 1>0
l

Esto define una macro, que se ejecuta en tiempo de compilación, que ejecuta un bucle infinito, y luego invoca la macro.


1

Óxido, 18 bytes

include!(file!());

Clásico autoincluido. Sin embargo, Rustc es molestamente cuerdo, y por defecto se rescatará después de 128 recursiones, y se expande primero en profundidad, por lo que el crecimiento exponencial tampoco funciona. Sin embargo, lo mismo se aplica a las soluciones C y C ++.


0

Factor , 29 16

<< [ t ] loop >>

La parte entre << >> se ejecuta en tiempo de análisis.

En cuanto a que [ t ] loop hace, te dejaré adivinar ...

Puede poner eso en el Listener tal cual, o agregarlo a cualquier vocabulario o archivo de script con el correspondiente material repetitivo.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.