(Wystarczy otworzyć 50 kart w Google Chrome: D (żartuję, nie, nie możesz))
Najkrótszy kod dla nieskończonego dysku we / wy w dowolnym języku, przykład w C #:
using System.IO;
namespace FileApp {
static class Program {
public static void Main() {
do {
File.WriteAllText("a", "a");
File.Delete("a");
} while (true);
}
}
}
Nie możesz po prostu zapełnić całego dysku, ponieważ wtedy zatrzyma się na końcu i będzie skończony.
I nie możesz robić tylko czytania, musi się zdarzyć nieskończone pisanie. (Musi zabić mój dysk SSD po wystarczającym czasie działania.)
Zaskocz! :)
/dev/null
? (Czyyes>/dev/null
ważna jest odpowiedź Basha?)Odpowiedzi:
DOS / Batch: 4 bajty
Ten plik wsadowy wywoła się (
%0
) i przekieruje (>
) dane wyjściowe do pliku o nazwiex
. Ponieważ echo jest domyślnie włączone, spowoduje to wyświetlenie ścieżki i polecenia.źródło
>
Zostanie nadpisany.>>
dołączaPowerShell v2 +, 10 bajtów
Po prostu zapętlaj nieskończenie za pomocą pustej
for
pętli. Podczas każdej iteracji wypisujemy liczbę całkowitą1
(domyślnie przekonwertowaną na ciąg) za pomocą>
operatora przekierowania , który zastępuje plik o nazwie1
w katalogu lokalnym.źródło
Winload.exe
wystarczy ...1
musi być pewną liczbą, aby niejawne parsowanie działało poprawnie. Wszystko z[0-9]
działałoby tak samo.1
cokolwiek nieliczbowego (i nieokreślonego jako.\a
luba.txt
podobnego) powoduje błąd analizy.Pyth, 6 bajtów
Jedyne polecenie wyjściowe pliku Pytha to
.w
. Po wywołaniu ciągu zapisuje ten ciąg do pliku w trybie dołączania, co nie jest dobre na potrzeby tego pytania. Po wywołaniu na tablicy 2-d zapisuje odpowiedni obraz do tego pliku, zastępując zawartość pliku. Tak właśnie działa ten program. Domyślna nazwa pliku wyjściowego too.png
, więc ten program nieskończenie zastępuje pliko.png
białym 1-pikselowym obrazem.#
jest nieskończoną pętlą.źródło
Jeśli chcesz krótszej (ale bardziej nudnej od mojej drugiej) odpowiedz:
Bash, 5 bajtów
Mógłbym to skrócić, jeśli istnieje polecenie (o długości mniejszej niż 3 bajty), które zapisuje coś na dysku we / wy. Coś takiego
sync
działałoby, alesync
ma 4 bajty 😛Uwaga: to nie działa, gdy jest uruchamiany bezpośrednio z bash, tylko gdy jest umieszczony w skrypcie i działa jako nazwa skryptu. (tj.
echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb
)źródło
exec
(lub. $0
). Myślę, że zabraknie PID.w
potrzeba? Dla mnie po prostu>w
tworzy pusty plikw
, a zrobienie tego w pętli stworzy nieskończone operacje we / wy, ponieważ metadane mtime muszą być ciągle aktualizowane.Rubin,
2220 bajtówWielokrotnie obcina i zapisuje
1
do plikua
.Dzięki Ventero za 2 bajty!
źródło
open(?a,?w)<<1
aby zapisać 2 bajty.cmd, 14 bajtów
Nieskończenie zastępuje plik
1
ciągiem do bieżącego kataloguJestem tu nowy: czy nowe linie systemu Windows (
CR
LF
) są liczone jako dwa bajty?źródło
LF
bez problemu. Powyższe działa dla mnie tylkoLF
z Windows 8.1, więc twoje 14 bajtów jest poprawne.CR
LF
2CR
1LF
1Bash + coreutils, 10
Zapisuje ciągły strumień
>b
, który jest przesyłany dosh
oceny.>b
po prostu obcina plik wywoływanyb
za każdym razem do zera bajtów.źródło
b
niec
?Perl 5,
273222 bajtówJeśli wystarczy zmiana znacznika czasu modyfikacji pliku ...
Szybkie wyjaśnienie:
Poprzednie rozwiązanie (32 bajty):
{{open my$h,'>o';print$h 1}redo}
Edycja:
{open F,'O';print F 1;redo}
← Nie testowałem kodu przed opublikowaniem; teraz musiałem to poprawić.źródło
$
!PHP,
60 30 17 1615 bajtówZaktualizowany jeszcze raz zgodnie z sugestią @manatwork:
Również teraz przetestowane.
Trochę oszukiwania 22 bajtów:
while (exec ('> 1 dir'));Wcześniejsza sugestia @manatwork 30 bajtów:
while (file_put_contents (1,1));NIE TESTOWANE (brak php na tym komputerze) 43 bajty:
for ($ a = fopen (1, 'w'); fputs ($ a, 1); fclose ($ a))Oryginalne 45 bajtów w golfa:
$ a = fopen (1, 'w'); while (fputs ($ a, 1)) przewijanie do tyłu ($ a);Mój pierwszy post tutaj, dołączyłem, ponieważ musiałem to wypróbować: dopóki zapis pliku się powiedzie, przewiń wskaźnik pliku, aby rozpocząć.
Po prostu nie może być mniejszy niż file_put_contents ().źródło
while(file_put_contents(1,1));
powinno wystarczyć. Zauważ, że uruchamianie pełnych skryptów z wiersza poleceń, cophp -r '…'
jest dopuszczalne, zgodnie z konsensusem na meta Uruchamianie PHP z-r
zamiast znaczników kodu .sh, 11 bajtów
Zapisz to do pliku bez znaków specjalnych, takiego jak loop.sh, spraw, aby był wykonywalny i uruchom go za pomocą
./loop.sh
lub podobnego.Spowoduje to zapisanie wyniku polecenia
w
do plikuw
, za każdym razem nadpisując poprzednią wartość. Następnie zastępuje się nową wersją tego samego programu, dzięki czemu może działać bez końca.źródło
>
. a także, zakładając, że masz „specjalny”$PATH
i „specjalny” system plików / umask / plików, możesz przejśćw>>w;$0
, ograniczając go do 7 znaków>>
jest dołączany, ostatecznie zapełni dysk. $0
zamiastexec $0
? Nie wiem jednak, czy to zadziała, spowoduje przepełnienie stosu czy coś takiego. ... Tak, segregowało.C,
959493897890897675 bajtówZnowu
sudo watch -n1 lsof -p `pidof inf`
wydaje się, że to prawda.JAK NIE ZOBACZYŁEM TEGO PRZESTRZENI D: <
Dzięki @Jens za zgolenie 13 bajtów: D
źródło
w+
Tryb jest czytać i pisać, początkowo obcinanie pliku. Ponieważ nie musisz czytać, możesz zgolić bajt za pomocą justw
, co również obcina plik, ale nie otwiera go w trybie odczytu.return 0;
jeśli pętla nigdy się nie kończy.fputc(1,f)
zamiast super-pełnegofprintf(f," ")
?main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}
ponieważ pusta warunkowego wfor
drodzetrue
. 76 bajtów.Bash, 26 bajtów
Gdybym rozwinął ten linijkę, otrzymałbym to:
To nie może dokładnie konkurować z 10-bajtową linią PowerShell, ale będzie się utrzymywać na tle innych. Zobacz moją drugą odpowiedź dla wersji 6-bajtowej.
źródło
while :;ls>l;done
exec
trik zrobi lepiej:ls>l;exec $0
. Krótszy, ale nudny.:>l;exec $0
- tworzenie pliku pisze i-węzeły
,yes
nadal będzie zapisywać do tego samego uchwytu pliku, który miał. Uruchomlsof | grep yes
i powinieneś zobaczyć coś takiego/path/to/y (deleted)
. To zapełni dysk i zakończy się niepowodzeniem.rm y
możesz użyć,>y
który obetnie istniejący plik. Jest również nieco krótszy.TI-BASIC, 12 bajtów
Alternatywne rozwiązanie użytkownika lirtosiast o tym samym rozmiarze:
Będzie to działać na serii kalkulatorów TI-83 + i TI-84 +.
Tak, działa to również, jeśli A jest już zarchiwizowane lub w ogóle nie zostało zainicjowane na początku programu! Program ma tylko 12 bajtów z powodu tokenizacji .
źródło
CPython 3.5,
3316 bajtówTak naprawdę. :RE
źródło
while 1:open("a","w")
jest krótszy istrace
pokazuje, że Python wykonuje operacje open, fstat64 i close, na pewno operacje we / wy. Jeśli plika
już istnieje, to może być jeszcze krótszy:while 1:open('a')
który wciąż generujeopen
,fstat64
aclose
, a nawet modyfikujeatime
tego pliku.MATL , 10 bajtów
Wyjaśnienie
Jest to nieskończona pętla, która zapisuje liczbę
1
do pliku wywoływanegoinout
w bieżącym katalogu, zastępując zawartość poprzedniego pliku.źródło
Haskell, 20 bajtów
Zapisz ciąg
"a"
do pliku o nazwie"b"
i powtórz.writeFile
nadpisuje plik, jeśli istnieje.źródło
JavaScript (Node.js),
4341 bajtówZapisuje
null
do pliku o nazwiea
, a następnie powtórz.źródło
c
lubx
do pliku? Oszczędza 2 bajty. Poza tym nierequire`fs`
działa?c
lubx
.require`fs`
niestety nie działa, ponieważ użycie funkcji backticks do wywołania funkcji wywołuje ją z pierwszymi argumentami as["fs"]
(tablica, której pierwszym i jedynym elementem jest przekazany ciąg) zamiast"fs"
(tylko ciąg). Spróbujconsole.log`test`
na przykład.ZSH, 14 bajtów
Zsh, w przeciwieństwie do Bash i innych muszli podobnych do Bourne'a, pozwala na pętle bez
do ... done
ogrodzenia , pod warunkiem, że warunek jest odpowiednio ograniczony.Alternatywnie z
while
:Zauważ, że
:
jest wbudowany. Nie możesz zawiesić tej pętli.Zasada jest taka sama jak w odpowiedzi Digital Trauma - do pliku nic nie jest zapisywane, IO polega wyłącznie na tworzeniu i obcinaniu pliku.
źródło
Rdza, 84 bajtów
File::create
obcina istniejący plik, dzięki czemu nie zabraknie miejsca na dysku.Używany kompilator (1.9 Nightly) wyświetla ostrzeżenie o niewykorzystanym wyniku,
write(...)
ale mimo to kompiluje.źródło
C, 92 bajty
Choć wygląda na to, że możesz zaoszczędzić 1 bajt
problem z tą pętlą polega na tym, że + nie daje ci gwarantowanej kolejności.
Lub rekurencyjny - nie powinien się przepełniać, jeśli kompilator poprawnie implementuje rekurencję ogona (f ma wyraźny zakres wewnętrzny)
85 bajtów
źródło
for(;;)
i krótszych funkcji niżfprintf
. Jeśli musiałeś dołączyć stdio.h (czego nie potrzebujesz), nie potrzebujesz spacji:#include<stdio.h>
Mathematica, 14 bajtów
Wielokrotnie zapisuje ciąg
"a"
do pliku o nazwiea
w bieżącym katalogu, tworząc go, jeśli nie istnieje.źródło
a
, która jest niezdefiniowana, więc po prostu zapisujea\n
.C, 40 bajtów
Jednak szybko zabraknie deskryptorów plików; można temu zaradzić poprzez:
45, 43 bajtówźródło
int
.open()
nie jest stałą czasową kompilacji). Ponadto zabraknie miejsca na dysku, ponieważ nie ma wyszukiwania. Może spróbujutime("a","")
w pętli, która będzie aktualizowaćctime
. (Nadal musiszopen
utworzyć plik o znanej nazwie).lazytime
, jak powiedziałem w mojej odpowiedzi.C na amd64 Linux, 36 bajtów (tylko znacznik czasu),
5249 bajtów (rzeczywista aktywność dysku)open(2)
Zaszyfrowałem flagi na stałe, więc nie jest to przenośne dla innych ABI. Linux na innych platformach prawdopodobnie używa tego samegoO_TRUNC
itp., Ale inne systemy POSIX mogą tego nie robić.+4 bajty, aby przekazać poprawny argument uprawnień arg, aby upewnić się, że plik został utworzony z prawem do zapisu przez właściciela, patrz poniżej. (Tak się dzieje, że działa z gcc 5.2)
nieco przenośny ANSI C, 38/51 bajtów (tylko znacznik czasu), 52/67 bajtów (rzeczywista aktywność dysku)
Na podstawie odpowiedzi @ Cat z napisem @Jens.
Pierwszy numer dotyczy implementacji, w których
int
może przechowywaćFILE *fopen()
wartość zwracaną, drugi numer, jeśli nie możemy tego zrobić. W systemie Linux adresy stosu znajdują się w mniejszych 32 bitach przestrzeni adresowej, więc działa nawet bez-m32
lub-mx32
. (Deklaracjavoid*fopen();
jest krótsza niż#include <stdio.h>
)Tylko metadane sygnatury czasowej we / wy :
Zapisywanie bajtu, faktyczne uderzenie w dysk w systemie Linux 4.2.0 + XFS +
lazytime
:write
jest warunkiem pętli, co jest w porządku, ponieważ zawsze zwraca 1.close
jest przyrostem.Objaśnienie wersji nieprzenośnej:
Plik jest tworzony z losowymi uprawnieniami do śmieci. W wersji
gcc
5.2 z-O0
lub-O3
zdarza się, że zawiera on uprawnienia właściciela do zapisu, ale nie jest to gwarantowane.0666
jest dziesiętnym 438. Trzeci argument,open
który zajmie kolejne 4 bajty . Jesteśmy już na sztywno kodować O_TRUNC i tak dalej, ale to może zepsuć się z innym kompilatorem lub libc na tym samym ABI.Nie możemy pominąć drugiego argumentu
open
, ponieważ zdarza się, że wartość śmieci zawieraO_EXCL
, aO_TRUNC|O_APPEND
więc otwieranie kończy się niepowodzeniemEINVAL
.Nie musimy zapisywać wartości zwracanej
open()
. Zakładamy, że tak3
, bo zawsze tak będzie. Nawet jeśli zaczniemy od fd 3 open, zostanie ono zamknięte po pierwszej iteracji. W najgorszym przypadku,open
otwiera nowe fds, dopóki 3 nie będzie ostatnim dostępnym deskryptorem pliku. Tak więc, do pierwszych 65531write()
wywołań może się nie powieśćEBADF
, ale wtedy będzie działać normalnie z każdymopen
tworzeniem fd = 3.577 = 0x241 =
O_WRONLY|O_CREAT|O_TRUNC
w systemie Linux x86-64. BezO_TRUNC
tego czas mod i-węzła i czas zmiany nie są aktualizowane, więc krótszy argument nie jest możliwy.O_TRUNC
jest nadal niezbędny dla wersji, która wywołujewrite
rzeczywistą aktywność dysku, a nie przepisuje w miejscu.Widzę kilka odpowiedzi na to
open("a",1)
. O_CREAT jest wymagany, jeśli jeszczea
nie istnieje.O_CREAT
jest zdefiniowany jako ósemkowy 0100 (64, 0x40) w systemie Linux.Brak wycieków zasobów, dzięki czemu może działać wiecznie.
strace
wynik:lub
Mam wartość dziesiętną
open
flag dla tego ABI, używającstrace -eraw=open
mojej wersji C ++.W systemie plików z
lazytime
włączoną opcją montowania Linuksa zmiana, która wpływa tylko na znaczniki czasu i-węzła, spowoduje tylko jeden zapis na 24 godziny. Po wyłączeniu tej opcji montowania aktualizacja znaczników czasu może być dobrym sposobem na zużycie dysku SSD. (Jednak kilka innych odpowiedzi dotyczy tylko metadanych I / O).alternatywy:
krótszy niedziałający :
main(){for(;;)close(write(open("a",577),"",3));}
używawrite
wartości zwracanej do przekazania3
argumentu do zamknięcia. Zapisuje kolejny bajt, ale nie działa z gcc -O0 lub -O3 na amd64. Śmieci w trzecim argopen
są różne i nie obejmują uprawnień do zapisu.a
zostanie utworzony za pierwszym razem, ale wszystkie przyszłe iteracje kończą się niepowodzeniem-EACCESS
.dłużej, działając, z różnymi wywołaniami systemowymi :
main(c){for(open("a",65);pwrite(3,"",1);)sync();}
przepisuje bajt w miejscu i wywołujesync()
synchronizację wszystkich systemów plików w całym systemie. Dzięki temu świeci lampka napędu.Nie obchodzi nas, który bajt, więc nie przekazujemy czwartego argumentu do napisania. Tak, dla rzadkich plików:
Napisanie jednego bajtu z przesunięciem ~ 128TiB doprowadziło do XFS przy użyciu 300kB miejsca do przechowywania mapy zasięgu, tak myślę. Nie próbuj tego w systemie OS X z HFS +: IIRC, HFS + nie obsługuje plików rzadkich, więc zapełni dysk.
XFS to właściwy 64-bitowy system plików, obsługujący pojedyncze pliki do 8 eksabajtów . tj. 2 ^ 63-1, maksymalna wartość
off_t
może utrzymać.strace
wynik:źródło
Rakieta, 46 bajtów
źródło
Współczynnik, 73 bajty
Na zawsze ustawia zawartość pliku na bajt nul.
źródło
CBM BASIC 7.0, 9 bajtów
Po uruchomieniu program wielokrotnie zapisuje się na dysku. Oto bardziej czytelna wersja, która nie używa skrótów BASIC:
źródło
0 SAVE "A" : RUN
Python, 32 bajty
Zauważ, że jeśli uruchomisz na Pythonie 3, spowoduje to nieskończoną liczbę ostrzeżeń. Ponadto prawdopodobnie zabraknie FDS, jeśli zostanie uruchomiony w implementacji innej niż rozliczeniowa.
źródło
write
i"w"
części polecenia open.Dyalog APL 15.0, 17 bajtów (niekonkurencyjny)
Chrome obecnie źle interpretuje kod U + 2262. Powyższa linia powinna wyglądać
(⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1
.Jest to niekonkurencyjne, ponieważ wersja 15 nie została jeszcze wydana.
Dotyczy
⍣
funkcji(⊢⊣⊃⎕NPUT⊢)
na'A'1
aż do wejścia zostanie zmieniony (czyli nigdy):⊢⊣⊃⎕NPUT⊢
jest ciągiem funkcji:Skrajny prawy
⊢
zwraca'A'1
niezmodyfikowany; to (nazwa pliku, flaga zastępująca) będzie właściwym argumentem dla `⎕NPUT '.„⊃” zwraca pierwszy element
'A'1
('A'
); to dane do zapisania.Następnie
⎕NPUT
jest uruchamiany i informuje, ile bajtów zostało zapisanych (2 lub 3 w zależności od systemu operacyjnego); staje się to właściwym argumentem dla⊣
.Skrajnie lewy
⊢
ponownie zwraca'A'1
niezmodyfikowany; to jest lewy argument do⊢
.⊣
ignoruje swój prawy argument i zwraca lewy argument ('A'1
), staje się to nową wartością dostarczaną do⍣
.Ponieważ nowa wartość jest identyczna ze starą, operacja jest kontynuowana (na zawsze).
źródło
SmileBASIC, 12 bajtów
źródło
edytor tekstu vim, 10 bajtów
8 bajtów, jeśli nie można wykonać polecenia wykonania
@a
źródło