Najkrótszy kod do legalnego zwolnienia


146

Jestem programistą i nie mam ochoty wykonywać swojej pracy. Wiem z XKCD, że najlepszą wymówką do zwolnienia się jest kompilacja twojego kodu . Z tego powodu myślę, że potrzebuję kodu, który skompiluje się na zawsze! A ponieważ jestem leniwy i nie chcę dużo pisać, należy to zrobić przy użyciu możliwie najkrótszego kodu.

Twoim zadaniem jest napisanie programu, który jest poprawny pod względem składniowym, ale spowoduje, że kompilator przejdzie w nieskończoną pętlę.

Dane techniczne

  • Oczywiście musisz użyć języka, który ma kompilator.
  • Określ implementację używaną w każdym rozwiązaniu.
  • To jest , więc wygrywa najkrótsze prawidłowe rozwiązanie (w bajtach).
  • Kompilator może zakończyć brak pamięci lub stosu.

1
@obarakon Nie zgadzam się. Kod z innego wyzwania nie może być z łatwością przeniesiony na to wyzwanie. Wyzwania, podczas gdy oba dotyczą nieskończonej pętli, są zasadniczo różne.
Sriotchilism O'Zaic

1
@obarakon Nie jest to dupek tego pytania , ponieważ nie jest to golf golfowy.
Esolanging Fruit


1
Nie jestem pewien, czy pasuje do tego wyzwania (i nawet jeśli tak, to strasznie zdobędzie punkty), ale dla zainteresowanych jest to, jak bym to zrobił Java: zdefiniuj procesor adnotacji (fragment ideone), którego będziesz używać podczas wywoływania javacz jego -processoropcja. Dzięki temu kompilacja dowolnej klasy zawiesza się na zawsze.
Aaron

6
W przypadku odpowiedzi, które powodują awarię kompilatora: W celu zwolnienia, sądzę, że nadal chcesz, aby trwało to tak długo, jak to możliwe.
GuitarPicker

Odpowiedzi:


16

Japt , 2 bajty

`ÿ

Możesz to przetestować online tutaj , ale nie poleciłbym tego, ponieważ spowoduje to zawieszenie przeglądarki.

Wyjaśnienie

Japt używa biblioteki shoco do kompresji ciągów. Strzałka wsteczna mówi kompilatorowi, aby wszystko zdekompresował do następnego kliknięcia wstecznego lub do końca pliku. Każdy bajt wykonuje następujące czynności:

  • 00-7F pozostają nienaruszone.
  • 80-BFkażdy przekształcić wspólnej małymi pary dwuliterowy ( at, oo, th, itd.).
  • C0-DFkażdy zużywa następny bajt i przekształca we wspólny czteroliterowy ciąg .
  • E0-EFkażdy zużywa kolejne trzy bajty i przekształca we „wspólny” ciąg ośmioliterowy (zaczynając od Wherereri schodząc stamtąd).
  • F0-F7 zepsuć dekompresor, choć nadal wszystko zwraca do bajtu łamania.
  • F8-FFpowoduje wejście dekompresora w nieskończoną pętlę. Nie jestem pewien, dlaczego tak jest, ponieważ nie jestem bardzo zaznajomiony z wewnętrznymi funkcjami biblioteki shoco (a kod JavaScript jest całkowicie nieczytelny ), ale w tym przypadku jest całkiem przydatny.

Nie wierzę, że istnieje inny sposób na bałagan z kompilatorem Japt, ale nigdy nie wiesz ...


10
Co to znaczy, że jest nieczytelny. Najwyraźniej po prostu nie starasz się wystarczająco mocno.
fəˈnɛtɪk

Żałuję, że nie było dekompilatora emscripten ...
tbodt

58

TikZ (pdfTeX 3.14159265-2.6-1.40.17), 85 79 74 24 22 21 bajtów

Pęczek bajtów zaoszczędzonych dzięki wchargin

Jeden bajt zaoszczędzony dzięki Chrisowi H.

\input tikz
\tikz\pic

Zetknąłem się z nią przypadkiem, kiedy pracowałem nad pracą domową. Sporo czasu czekałem, aż się skompiluje, zanim zdałem sobie sprawę, co się dzieje.

Składa się z dwóch części:

\input tikz

Spowoduje to załadowanie pakietu TikZ

i:

\tikz\pic

To uruchamia \tikzśrodowisko i polecenie rysowania.

Co się dzieje

Kompilator pdflatex ma problemy \tikz\pici wchodzi w tryb interaktywny, powodując jego zatrzymanie na czas nieokreślony.


(1/2) Nie mogę tego odtworzyć. Dostaję komunikat „Uciekający argument?! \draw l\end {document}Plik zakończony podczas skanowania \tikz@next.” pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian). tikz 2010/10/13 v2.10. Jest to standard apt install texlive-fullw Ubuntu 14.04.
wchargin

1
@wchargin Używam tej samej wersji pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016) i rzeczywiście zapętla się w nieskończoność. Dzięki za wskazówki.
Sriotchilism O'Zaic

1
Możesz zapisać bajt, używając \piczamiast \ draw` - dokładnie takie samo zachowanie (testowane przy użyciu tikz 1.142)
Chris H

3
Nie mogę uwierzyć, że tak naprawdę nie zalecam używania TikZ, ale z pewnością korzystanie z niego jest tutaj nadmierne. Co jest nie tak ze starymi \def\a{\a}\a(12 bajtów)? Lub, ponieważ jest to kod golfowy i ~domyślnie jest aktywny \def~{~}~(9 bajtów)?
Loop Space,

2
@LoopSpace Nic z nimi nie jest nie tak Po prostu nie wiedziałem, że istnieje. Jeśli chcesz zrobić własną odpowiedź, nie krępuj się.
Sriotchilism O'Zaic

40

C, 18 bajtów

#include __FILE__

Kompilatory zwykle poddają się po rekurencji około 200 razy.

Czy konstrukcja DOM liczy się jako etap kompilacji? Jeśli tak, to x.htm:

<iframe src=x.htm>

14
Pamiętam, że rekurencyjne zestawy ramek powodowały awarię IE4 tak mocno, że czasami zdejmowały ważne komponenty systemu operacyjnego. Więc HTML prawdopodobnie się liczy.

10
@ ais523, to dlatego, że w czasach IE4 Internet Explorer był „ważnym składnikiem systemu operacyjnego”.
Mark

2
Trochę skomplikowany i jest on ważny PHP <?include __FILE__;.
Ismael Miguel

6
Nie mogę opublikować tej odpowiedzi, ponieważ mój przedstawiciel nie jest wystarczająco wysoki, ale dwie alternatywy to: #include "/ dev / zero" i #include "/ dev / stdin" - uważaj, uruchamiając pierwszą !!
rrauenza

2
Kiedy spróbowałem, zużycie pamięci gcc zaczęło szybko rosnąć bez ograniczeń, system przestał odpowiadać, a mój watchdog w końcu się uruchomił i uruchomił ponownie. To było dość zabawne :)
rrauenza

38

Java, 102 95 89 88 78 bajtów

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

Kończy się to, StackOverflowErrorco się dzieje, ponieważ ogólny system rozstrzygania nie może zdecydować o katalogu głównym, na podstawie którego należy rozstrzygnąć inne ogólne.

Kredyty należne .

co się tutaj stało?

  1. A<T>jest tam, aby mieć 1-literowego rodzica. To jest ogólne. Mógłbym użyć List, ale import i powtarzanie 4 liter są zbyt długie.
  2. B<T> deklaruje podstawowy rodzajowy.
  3. B extends Awymagana jest hierarchia między Bi A.
  4. extends A<A>tworzy własne odniesienie na A<T>.
  5. A<? super B> włącza wyszukiwanie generyczne A<T>
  6. B<B<T>>tworzy odniesienie na B<T>.
  7. A<...> a=new B<>()wymusza użycie ogólnych, zamiast po prostu ich definicji, wymuszając rozdzielczość podczas kompilacji B, a nie później.
  8. A<?super Btworzy brak odniesienia do siebie, więc mamy zarówno odniesienie do jednego typu, jak i do drugiego w ogólnych nazwach A.
  9. B<A>tworzy brak odniesienia do siebie, więc mamy zarówno odniesienie do jednego typu, jak i do drugiego w ogólnych nazwach B.

Teraz typ Ama rodzaj ogólny Ai B, ale który należy wybrać? Zapomnij o sobie, spróbujmy rozwiązać B. Świst.

Okej, czy Bma rodzaj generyczny Ai B, ale który wybrać? Zapomnij o sobie, spróbujmy rozwiązać A. Pong

Ten rodzaj rekursji naprawdę nie można być unikane, ponieważ istnieją uzasadnione przypadki, takie jak A<B<A<B<A<B<Object>>>>>>na przykład: obiekt JSON: List<Map<String,Map<String,List<Map<String,List<String>>>>>>.

Wynik kompilacji

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

W moim systemie ślad stosu zatrzymuje się po wyświetleniu 1024 linii, które w rzeczywistości są 4 tymi samymi liniami powtórzonymi 256 razy, co dowodzi nieskończonej rekurencji. Oszczędzę ci cały ten ślad.

Oszczędności

  1. 102 → 95 bajtów: zastąpiono interface+ implementsznakiem class+ extends.
  2. 95 → 89 bajtów: zastępuje Longsię A(dwa razy).
  3. 89 → 88 bajtów: używany operator diamentowy ( new B<A>()new B<>()).
  4. 88 → 78 bajtów: dzięki VoteToClose przeniesiono deklarację zmiennej do członka klasy .

1
Na co patrzę
Addison Crump

Możesz skrócić to do 78 bajtów za pomocą:class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
Addison Crump

@VoteToClose Patrzysz na doskonały przykład nierozstrzygalności w ogólnych zagadnieniach Javy. Każdy rodzaj ogólny powinien być rozpoznany względem wspólnego katalogu głównego, do którego jest następnie zatwierdzony. Chodzi o to, że rodzajowe Bzawiera niezdecydowane odwołanie do ogólnego, Aktóre z kolei zawiera nierozstrzygalne odwołanie do ogólnej. B. Kiedy resolver nie może zdecydować, sprawdza dołączone odwołania, ale tutaj obie ogólne odnoszą się do siebie w nierozstrzygalny sposób (głównie dzięki samodzielnym odnośnikom i supersłowu kluczowemu. Więc resolver faktycznie ping-pong między dwoma rodzajami.
Olivier Grégoire,

Myślałem o stworzeniu problemu z czasem kompilacji z cyklicznymi adnotacjami: public @interface X {@X(x=X.class)Class<? extends X> x();}... Ale szybko zdałem sobie sprawę, dlaczego to nie zadziała lol.
Magic Octopus Urn

34

GNU Makefile, 8 7 bajtów

Jeden bajt zaoszczędzony dzięki KonradRudolph

Zapisane jako Makefilei przywołane przez make:

x:;make

Spowoduje to nieskończoną rekurencję kompilacji pierwszego znalezionego celu "x".

Nie trzeba dodawać, że tak naprawdę nie chcesz uruchamiać tej bomby widelcowej na serwerze produkcyjnym. :-)

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

Alternatywna wersja, 5 bajtów

Sugerowane przez KonradRudolph:

x:;$_

$_jest odniesieniem do ostatniego argumentu poprzedniego polecenia. Mówiąc dokładniej, rozwiązuje się tutaj jako bezwzględną ścieżkę do wykonywanego polecenia - które jest makesamo w sobie.

Powinno to działać dobrze w oryginalnym środowisku Bash, ale nie na Windows + MinGW.


2
Hmm, nie sądzę, że maketak naprawdę kompiluje Makefile (tylko go interpretuje).
zeppelin

3
@zeppelin Masz rację, to prawdopodobnie odpowiedź graniczna. To powiedziawszy, zgłoszenia zawierające rekurencję makr na poziomie preprocesora nigdy nie zaczną kompilować żadnego rzeczywistego kodu.
Arnauld

11
Jest to zgodne z zamierzonym celem: nieskończonym procesem kompilacji. +1!
YSC

23

C ++, 60 58

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

To rekurencyjnie tworzy wystąpienia class az różnymi parametrami szablonu. GCC 7.0 zatrzymuje się po 900 poziomach rekurencji z mnóstwem błędów związanych z operator->byciem prywatnym, ale na przykład ICC 17 i Microsoft (R) C / C ++ Optimization Compiler 19 limit czasu na godbolt .

Problem w tym, że prawdopodobnie w niektórych kompilatorach zabraknie pamięci w pewnym momencie, więc nawet bez limitów rekurencyjnych to się skończy. To samo prawdopodobnie dotyczy również odpowiedzi Clojure.

Edycja: 2 bajty zapisane przez bolov - Dzięki


1
krótszy:a<int>i=i->b;
bolov

1
@ Kieszenie, jak powiedziałem w mojej odpowiedzi, ponieważ operator->są domyślnie prywatne w klasie. Wewnątrz struktury jest publiczny i dlatego i->bmoże uzyskać do niego dostęp.
Christoph

1
Wydaje się, że gcc 4.4.7 zawiesza się tutaj w nieskończoność. Oczekiwanie na nieskończoność lub wyświetlenie wyniku, w zależności od tego, co nastąpi wcześniej. Zaktualizuje
osuka_

1
@osuka_ czy nadal działa?
Christoph

1
@Christoph nie, rozbił się z SIGSEGV po tym, jak zostawiłem go uruchomiony przez kilka dni. Jednak zapomniałem zaktualizować - dziękuję za przypomnienie!
osuka_

23

Perl , 15 13 bajtów

BEGIN{{redo}}

Wypróbuj online!

Teraz z zapisanymi 2 bajtami: @Zaid przypomniał mi o szybszym sposobie wykonania pętli w Perlu.

Jest to dość proste: po prostu instaluje hak analizatora składni z nieskończoną pętlą, co powoduje, że analizowanie kodu zajmuje nieskończenie dużo czasu. (Perl jest fajny, ponieważ pozwala na uruchamianie dowolnego kodu w środku analizy; haczyki analizatora są określone w samym Perlu i często używane do robienia rzeczy takich jak import bibliotek lub zmiana reguł parsowania dla identyfikatora, który chcesz traktować jak słowo kluczowe.) Wypróbuj online! powyższy link daje -copcję (aby skompilować kod w celu zweryfikowania poprawności składni, ale nie uruchomić jej), aby udowodnić, że nieskończona pętla dzieje się w czasie kompilacji.

Jeśli zastanawiasz się nad „czasem kompilacji” w języku skryptowym: Perl faktycznie kompiluje się do kodu bajtowego, a następnie uruchamia kod bajtowy, ale jest to szczegół, który rzadko ma znaczenie przy programowaniu. Rodzina -MO=opcji wiersza poleceń może być używana do robienia rzeczy z kodem bajtu innym niż jego uruchomienie (chociaż nie z tym programem, ponieważ nieskończona pętla ma miejsce przed wygenerowaniem kodu bajtu).


1
a:goto ateż wygląda ładnie (ten sam bytecount niestety).
Dada

3
BEGIN{{redo}}zaoszczędzi ci kilka bajtów
Zaid

20

C ++, 37 30 29 bajtów

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

Wykorzystuje przyszły parametr funkcji automatycznej. Został on zaproponowany do C ++ 17, ale nie sądzę, że się udało. gccobsługuje jednak to jako rozszerzenie.

Gruntownie

void foo(auto p);

jest równa

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

Kod próbuje utworzyć instancję frekurencyjnie z różnymi argumentami szablonu. gccnie działa z

błąd krytyczny: głębokość tworzenia szablonu przekracza maksimum 900 (użyj -ftemplate-depth =, aby zwiększyć maksimum)

Dzięki -ftemplate-depth=10000niemu mogę wypluć „Zabity - czas przetwarzania przekroczony” na Godbolt.

Sprawdź to na Godbolt


1 bajt zapisany przez Quentin. Dziękuję Ci.


1
Jeden bajt można zapisać, używając intjako typu zwrotu :)
Quentin

Rzeczywiście, autoparametry funkcji nie dostały się do C ++ 17; a także int f() { ... }, a;nie jest prawnym oświadczeniem podczas ostatniej kontroli. (Nie można mieszać deklaracji funkcji z takimi deklaracjami zmiennych). To, co tu masz, to bardzo specyficzny dla GCC dialekt języka C ++. Nie to, że w tym kontekście jest z tym coś nie tak. :)
Quuxplusone

19

Common Lisp, 8 bajtów

#.(loop)

Kompilator spróbuje odczytać formularz i napotka makro makra sharpsign-dot , które ocenia kod w czasie odczytu i wykorzystuje jego wynik jako formę do kompilacji. Tutaj wykonywany kod jest nieskończoną pętlą.


17

TeX, 9 bajtów

\def~{~}~

TeX działa poprzez rozwijanie makr. Przez większość czasu makra TeXa (zwane również sekwencjami kontrolnymi ) mają taką formę, \nameale możliwe jest również zdefiniowanie niektórych znaków jako makr, które są nazywane aktywnymi znakami . Znak ~jest domyślnie aktywny w zwykłym TeX-ie, dlatego można go używać jako nazwy makra bez dalszych deklaracji. W \def~{~}powyższym definiuje się ~tak, że rozwija się do ~. Oznacza to, że za każdym razem, gdy TeX napotka ~, zastępuje je, ~a następnie ponownie bada zastąpienie, co oznacza, że ​​napotyka całkowicie nowe wystąpienie ~i zastępuje je ~. To definiuje nieskończoną pętlę. Wszystko, co jest wtedy potrzebne, to uruchomienie pętli i to właśnie ~robi finał .


Dodano w edycji

Aby to poprawnie skompilować , wywołaj jako:

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

-iniFlaga mówi, że pdftexnależy opracować nowy format. Jest to wstępnie skompilowany zestaw definicji, które można załadować, gdy TeX zostanie później wywołany w celu przyspieszenia przetwarzania dokumentu (LaTeX2e jest tego przykładem). Myślę, że &pdftexdodaje kilka bajtów, co daje w sumie 17.


Czy dzieje się to w czasie kompilacji? Pytanie wymaga nieskończonej pętli podczas kompilacji, a nie podczas działania.

@ ais523 Nie w pełni pomyślałem o tym kawałku. Odpierałem odpowiedź TikZ. Dodałem alternatywę, która jest zdecydowanie skompilowana, kosztem jeszcze kilku bajtów.
Loop Space,

2
@ ais523: Jak zawsze „kompilowanie” i „bieganie” to dwie strony tej samej monety. Osobiście myślę o kodzie źródłowym TeXa jako o „kompilacji” do dokumentów PDF (które są następnie „wykonywane” przez przeglądanie), w taki sam sposób, w jaki kod źródłowy C ++ jest „kompilowany” do plików .exe (które są następnie „wykonywane” przez bieganie). Można jednak pomyśleć o pdftexprogramie jako o „interpretacji” danych wejściowych TeX w celu wygenerowania pliku PDF jako „danych wyjściowych” - w ten sam sposób, w jaki g++program „interpretuje” dane wejściowe C ++ w celu utworzenia pliku .exe jako „danych wyjściowych”. ;)
Quuxplusone

13

Haskell, 25 + 17 = 42 bajty

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

Prosty metaprogram Haskella, który definiuje nieskończoną wartość i próbuje obliczyć tę wartość w czasie kompilacji.

Wywołaj za pomocą ghc -XTemplateHaskell <file.hs>(+17 dla parametru do kompilatora)


Nie $(let a=a in a)działa (dla 32 bajtów)?
Ry-

1
Nie! GHC jest zbyt mądry. Każda nieskończona pętla formularza let a = a in azostaje przepisana na wyjątek, który po prostu powoduje błąd kompilatora w przeciwieństwie do nieskończonej pętli. (chociaż może to działałoby z innym kompilatorem Haskell, ale nie mam go pod ręką, aby spróbować)
user2407038

Dla mnie działa z runghc, więc powiedziałbym, że jest poprawny. (W rzeczywistości działa również z ghc. 8.0.1 tutaj.)
Ry-

Naprawdę? Używam także ghc 8.0.1 - dla mnie daje to Exception when trying to run compile-time code: <<loop>>zarówno w interpreterie, jak i podczas kompilacji ... technicznie powyższy kod umiera również z wyjątkiem, ale przepełnienie stosu, które jest wyraźnie dozwolone przez specyfikację - a gdybyś miał nieskończoną pamięć, zapętliłaby się na zawsze. Te <<loop>>pożary wyjątków daleko przed moja maszyna zabraknie pamięci.
user2407038,

12

klasa, 10 9 bajtów

for(;;){}

z powyższym kodem umieszczonym w build.gradlepliku. Gradle używa groovy jako języka podstawowego, więc naprawdę mówimy tutaj o groovy, ale ponieważ pytanie dotyczyło czasu kompilacji, pomyślałem, że gradle będzie bardziej odpowiedni.

Uruchomienie dowolnych poleceń kompilacji stopni z powyższym kodem powoduje wydrukowanie linii statusu kompilacji kompatybilnej z szefem włosów:

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

jeśli chcesz podbić, dodaj -dflagę debugowania dla:

$ 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

który oprócz imponująco skomplikowanego wyglądu aktualizuje również nowy zestaw:

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.

linie stanu co 10 sekund, dzięki czemu wygląda na to, że kompilacja jest zajęta robieniem ważnych technicznych ... rzeczy.


8

SWI-Prolog, 34 bajty

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

Wyjaśnienie

term_expansion/2 to coś, co jest automatycznie wywoływane przez kompilator przed faktyczną kompilacją kodu w celu przekształcenia niektórych terminów w kodzie źródłowym w inne.

Poniżej przedstawiamy nową regułę term_expansion/2: repeat,1=0..

repeat/0 jest predykatem, który zawsze się udaje i zapewnia nieskończoną liczbę punktów wyboru.

1=0stara się zjednoczyć 1z 0, co zawsze false. Spowoduje to powrót kompilatora do repeat(ponieważ zawsze zapewnia punkt wyboru) i ponowienie próby 1=0itp.


Nie działa w GNU Prolog, więc zakładam, że jest to specyficzne dla implementacji. Możesz umieścić nazwę kompilatora w nagłówku. (Zakładam, że SWI Prolog.)

@ ais523 Dzięki, nie sprawdzałem innych dystrybucji, ale ponieważ rzeczy kompilatora są zazwyczaj dość specyficzne, powinienem był wiedzieć lepiej ...
Fatalize

@ ais523 Jednak zgodnie z tym możesz być w stanie użyć expand_termzamiast tego (jak mówi, term_expansionnie można używać tak jak tutaj w GNU Prolog). expand_termJednak nie działa z SWI.
Fatalize

7

Marka GNU, 44

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

Nie mogę ubiegać się o kredyt. Wywodzi się z książki Roberta Mecklenburga Managing Projects with GNU Make: The Power of GNU Make for Building Anything .

Gdy make wykonuje ten plik makefile, widzi, że plik makefile jest nieaktualny (ponieważ cel .PHONY jest nieaktualny, więc wykonuje polecenie dotykowe, które aktualizuje znacznik czasu pliku makefile. Następnie make ponownie czyta plik i odkrywa plik makefile jest nieaktualny ... Cóż, masz pomysł.

Wolę to od drugiej Utwórz odpowiedź, ponieważ nie używa rekurencji. Na mojej maszynie wirtualnej druga odpowiedź Make kontynuuje rozwidlanie procesów i gdzieś na głębokości około 7 000 maszyn wirtualnych nie reaguje. Jednak dzięki tej odpowiedzi można kontynuować w nieskończoność bez zużywania zasobów systemowych. Dzięki tej kompilacji naprawdę będziesz mógł się zwolnić. Przeszedłem ponad 1 000 000 iteracji bez widocznej degradacji systemu.

Uwaga: Musiałem dodać sleep 1tak, aby znacznik czasu makefile był aktualizowany za każdym razem. Możesz to zmienić, sleep 0.01jeśli chcesz, aby przechodził przez iteracje nieco szybciej.


6

GNU Forth, 15 bajtów

Grał w golfa

: : [do] [loop]

Ponownie definiuje (ponownie kompiluje) słowo :i wywołuje natychmiastową nieskończoną pętlę [do] [loop]wewnątrz nowej definicji (dokładnie w czasie kompilacji).

Jedna kategoria słów nie jest kompilowana. Te tak zwane słowa bezpośrednie są wykonywane (wykonywane teraz) niezależnie od tego, czy interpreter tekstu interpretuje, czy kompiluje.

Wypróbuj online!


5

Clojure, 21 bajtów

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

Związuje kompilator, definiując makro, które wielokrotnie emituje wywołania do siebie.

W moim telefonie powoduje to zawieszenie się REPL i opóźnienie urządzenia. Na moim laptopie nie udaje się to z StackOverflow.

Niestety StackOverflow dzieje się natychmiast, ale nadal obowiązuje zgodnie z regułami.


5

MSBuild, 130 bajtów

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

Zapisz to jako plik z .projrozszerzeniem i uruchom z msbuildwiersza polecenia. MSBuild uruchomi swój jedyny cel, który po prostu spawnuje inny msbuildproces.


Czy wymagane jest wcięcie, aby to zadziałało? Co z nowymi liniami? Zazwyczaj można grać w golfa w białe spacje.

Nie, po prostu łatwiej to odczytać. Liczba znaków nie obejmuje białych znaków.
Danko Durbić

1
Ah, tak. W takim przypadku prawdopodobnie powinieneś wspomnieć o tym w treści postu.

5

C, 31 bajtów

main[-1llu]={1};

Inspirowany Digital Trauma . Skompiluj z -mcmodel=mediumflagą.

Powodzenia w kompilowaniu tego, potrzebujesz 1,8 yottabajtów pamięci RAM i miejsca na dysku.


4

Mathematica 33 bajtów

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

Kod podejmie próbę symbolicznej oceny argumentu przed kompilacją, a sam argument jest nieskończoną pętlą. Funkcja While ma drugi zerowy argument, ponieważ nie jest ważny.


„przed kompilacją” Tak… nie.
CalculatorFeline


Pytanie brzmi: czy pętla występuje podczas Compilepołączenia, czy przed nim?
CalculatorFeline

3

Haskell (GHC, bez szablonu Haskell lub niestandardowych reguł przepisywania) , 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()

Teoretycznie wchodzi to w nieskończoną pętlę w podobny sposób, jak robi to podejście C ++ : metoda polimorficzna yjest tworzona w postaci instancji dla coraz bardziej skomplikowanych typów. W praktyce domyślny przydzielony rozmiar stosu szybko się przepełnia:

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

Kredyty dla Luke'a Palmera .


1

Haskell (ghc), 32 + 2 = 34 bajty

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

biegać z ghc -O <file>. Wyzwala regułę przepisywania dla głównej funkcji, która przepisuje to samo. Jedyną niefortunną cechą jest to, że ghc jest wystarczająco inteligentny, aby to wykryć i zatrzymać po 100 iteracjach. Nie znam łatwego sposobu na wyłączenie tego zachowania.


1

Boo, 25 bajtów

macro l:
 x=0 while 1>0
l

Definiuje to makro, które wykonuje się w czasie kompilacji, które wykonuje nieskończoną pętlę, a następnie wywołuje makro.


1

Rdza, 18 bajtów

include!(file!());

Classic self-include. Rustc jest jednak denerwująco rozsądny i domyślnie ratuje się po 128 rekurencjach i rozszerza się na głębokość pierwszą, więc wykładniczy wzrost również nie działa. To samo dotyczy rozwiązań C i C ++.


0

Współczynnik , 29 16

<< [ t ] loop >>

Część pomiędzy << >>jest wykonywana w czasie analizy.

Co do tego [ t ] loop, co mogę zrobić, pozwolę ci zgadnąć ...

Możesz umieścić to w Listener tak, jak jest, lub dodać do dowolnego pliku słownictwa lub skryptu z odpowiednimi dodatkami.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.