Kod, który zostanie wykonany tylko raz


223

Cel

Celem tego wyzwania jest napisanie kodu, który wykona się tylko raz. Oznacza to w zasadzie, że w jakiś sposób uszkadza program, skrypt lub środowisko. Ponowne uruchomienie systemu pozwala na ponowne uruchomienie kodu, co jest dozwolone.

Punktacja

Liczba głosów Wszystkie założenia muszą być wyraźnie wymienione. Wszelkie odpowiedzi inicjujące ponowne uruchomienie lub zatrzymanie zostaną zdyskwalifikowane.

Dodatkowe zasady, ponieważ Greg Hewgill jest półbogiem

Nie można uzyskać dostępu do katalogu głównego.

Data końcowa

Konkurs zakończy się 31 maja 2014 r.

Edytować

Ten konkurs został zmieniony na konkurs popularności.


7
@PeterTaylor możliwym rozwiązaniem byłoby samodzielne usunięcie, ale wyniki pokazują, że nie jest to jedyne.
Lukei

101
Dla wielu osób dzwoniących viw jednym środowisku terminalowym ma taki efekt, nie ma przed nim ucieczki, chyba że uruchomisz się ponownie :) Żart tutaj.
orion

6
Witryna jest bezpłatna, aby zaproponować takie pytanie.
ojblass

16
echo "If you try to execute me again, it means you are an idiot.";<- Nikt nie wykona więcej niż raz: P
user3459110

25
Czy oprogramowanie związane z pociskami kwalifikuje się? ;)
rsegal

Odpowiedzi:


518

Czuwanie

Nareszcie przypadek użycia Czuwania!

def main():
  raise Exception()

Fragment „specyfikacji języka”:

Jest rzeczą oczywistą, że każda funkcja, która zgłasza wyjątek, który nie został złapany, jest błędna i musi zostać ukarana.

...

W przypadku złamania przysięgi funkcja naruszająca [...] zostanie należycie ukarana.

W jaki sposób?

Prosty: zostanie usunięty z twojego kodu źródłowego.

Jedyny sposób, aby upewnić się, że Twój program spełnia jego wymagania, aby absolutnie zabronić kodu, który tego nie robi. Z Vigil zrobi to za Ciebie automatycznie.

Istnieją inne sposoby, aby to zrobić, ponieważ Vigil zapewnia słowa kluczowe implorei swearktóre są w zasadzie przysięgi na przestrzeganie pewnych przed i po warunków:

def main():
  swear 0 > 1

116
Bez wątpienia to zasługuje na zwycięstwo.
Matteo Italia

77
Wreszcie wystarczająco czujny język dla współczesnego wieku! Zacznę używać go w produkcji. Wszystkie błędy muszą zostać usunięte.
Claudiu

13
Wydaje mi się, że to niekoniecznie wina funkcji rzuca nieprzechwycony wyjątek, może też być tak, że funkcje na stosie wywołań są zaniedbywane, ponieważ nie można go złapać. Może to nawet sugerować, że architektura całej aplikacji jest wadliwa (ponieważ być może nie ma sposobu, aby poprawnie obsłużyć ten wyjątek bez zmiany kodu?) Krótko mówiąc, cały program powinien zostać usunięty.
Jonathan Pullano


32
Dodatkowe punkty za przeklinanie. Program składający fałszywe oświadczenia bez wątpienia musi zostać wyeliminowany.
orion

293

Prawie każda dystrybucja Linuksa, 9 znaków

Ten jest klasykiem!

#!/bin/rm

Umieść to w pliku i uruchom:

> ed
a
#!/bin/rm
.
wq foo
> ls
Mail mbox foo
> chmod 777 foo
> ./foo
> ls
Mail mbox

Aa i już go nie ma!

Jeśli chodzi o to, co się dzieje: tak naprawdę po prostu biegam rm! #!nazywa się shebang . A jeśli umieścisz jedną z nich, a następnie ścieżkę do jakiegoś pliku wykonywalnego jako pierwszą linię w skrypcie, moduł ładujący program wykona plik skryptu z tym, co tam napisałeś - domyślnie jest to ( #!/bin/bashlub #!/bin/shpowłoka Bourne-ponownie shell / Bourne) . Pierwszym argumentem przekazanym do tego skryptu będzie sama nazwa pliku (dlatego widzisz tutaj tak wiele rozwiązań, w tym %0lub $0i podobnych); więc tworząc mój plik #!/bin/rmi uruchamiając go, wszystko, co robię, to przekazanie do niego nazwy pliku rm.


9
Myślę, że nigdy nie korzystałem z Linuksa, ponieważ usuwa on plik skryptu.
tragiczny

56
@NateKerkhofs #!sekwencja rozpoczyna shebang, który identyfikuje interpretera, którego będziesz używać dla skryptu - normalnie /bin/bash. W tym przypadku Flonk był używany /bin/rmjako „tłumacz”. rmto program, który usuwa pliki. ponieważ Linux uważa, że ​​chcemy rmbyć tłumaczem, przekazuje nazwę pliku jako argument. dlatego plik sam się usuwa

19
To jest histeryczne
ojblass

25
@ user80551 Nie potrzebuję do tego dostępu do konta roota.
Flonk

9
hmm ..../foo mbox
Izkata

241

binarny x86, 4 bajty

F0 0F C7 C8

Założenie: Musi być uruchomiony na procesorze Pentium P5.

Powyższa instrukcja jest powszechnie znana jako błąd F00F . Próbuje wykonać niepoprawną instrukcję poprzedzoną blokadą .

Powoduje to całkowite zawieszenie procesora (ani zatrzymanie, ani ponowne uruchomienie) i nie wymaga nawet dostępu do roota.


4
Wow ... to naprawdę interesujące.
ojblass

31
@JackM: Będzie, ale jest to wyraźnie dozwolone w pytaniu.
Dennis

34
@JackM, wydaje się to świetnym sposobem na zatrzymanie działania „skryptu”.
Paul Draper

5
Pamiętam, kiedy ten błąd robił obchód. Obejście jądra zostało prawie natychmiast znalezione - nie spowoduje awarii komputera, chyba że używasz systemu operacyjnego bez poprawki.
zwolnienie

3
@RosLuP 209 różnych użytkowników, najwyraźniej. Jeśli się nie zgadzasz, oddaj głos i przejdź dalej.
Dennis

150

Bash, 5

>"$0"

Obcina się do zerowej długości.

Jeśli nazwa pliku nie zawiera spacji, >$0działa dla 3 znaków !


2
W rzeczywistości cytaty nigdy nie są potrzebne dla zmiennej używanej w takiej nazwie pliku przekierowania, nawet jeśli program lub ścieżka do programu zawiera spacje, ze względu na specjalny przypadek w regułach parsowania powłoki. Więc zawsze możesz to zrobić w 3 znakach!
apenwarr

3
@apenwarr mówi „$ 0: niejednoznaczne przekierowanie”, gdy bez cudzysłowów, a nazwa pliku zawiera spacje

1
@apenwarr, jest potrzebne, jeśli powłoka interpretująca ten skrypt jest oparta na ksh88 lub bash nie jest w trybie posix. Nie chodzi o spację, chodzi o dowolny znak $IFSdla bash i symbole wieloznaczne dla bash i ksh88. Skrypt bez szarpania będzie zwykle interpretowany przez sh systemu, ale niektóre powłoki, w tym bash i ksh88, zinterpretują je w sobie.
sch

144

gzip

#!/bin/gzip

Zbyt irytujące osoby przyzwyczajone do nieniszczących narzędzi linii poleceń, gzip domyślnie rujnuje oryginalny plik, zastępując go wersją spakowaną gzip (dodanie sufiksu).

Jest to odmiana #!/bin/rmopcji, z wyjątkiem tego, że można ją odzyskać przez ręczną interwencję człowieka (połączeniegunzip ). Jako specjalny bonus wynikowy plik jest znacznie dłuższy niż oryginał (różnica zależy od długości nazwy pliku).

Ostrzeżenie: lokalizacja gzipmoże się różnić.

EDYCJA: jak wskazał WChargin, jest to bardziej przenośne:

#!/usr/bin/env gzip

Reszta pliku może mieć dowolną treść. Zasadniczo jest to plik, który po wywołaniu ukrywa się w pudełku i odmawia wyjścia, dopóki siłą go nie rozpakujesz.


7
Nigdy o tym nie myślałem, ale masz całkowitą rację.
ojblass

bardzo interesujące
Grijesh Chauhan

11
„Uwaga: lokalizacja gzipmoże się różnić” - to nie jest golf golfowy , więc możesz użyć#!/usr/bin/env gzip
wchargin

37
+1 tylko dla It's essentially a file that, when called, hides itself in a box and refuses to come out until you forcibly unpack it.Ciebie stworzyło mój dzień, i jest 1 w nocy.
klaskać

Zasadniczo jest to plik, który po wywołaniu ukrywa się w pudełku i odmawia wyjścia, dopóki siłą go nie rozpakujesz. rozśmieszyło mnie. : D
Mischa,

121

Bash, 13 12

Nie najkrótszy, ale tak naprawdę nie usuwa pliku ani nie czyni systemu bezużytecznym.

chmod 0 "$0"

Jeśli nazwa pliku nie zawiera spacji, możesz usunąć cudzysłowy, aby zapisać 2 znaki.

Wyjaśnienie

Usuwa wszystkie uprawnienia ( rwx) z siebie. Gdy spróbujesz go uruchomić, a nawet wyświetlić jego kod, po raz drugi, bez ręcznego przywracania uprawnień, powie coś w rodzaju

bash: <FILENAME>: Permission denied

Przywróć uprawnienia za pomocą

chmod +rwx <FILENAME>

Stara wersja

Usuwa tylko uprawnienia do wykonywania, ale o jeden znak dłużej (było to pytanie do zanim zmieniło się w ):

chmod -x "$0"

Podstępna wersja autorstwa Łukasza Niemiera

#!/bin/chmod 0

4
chmod 0też działa
gnibbler

@gnibbler thnx, dodano

Myślę, że możesz wywołać program ai zapisać jeszcze 3 znaki:chmod 0 a
yo '

@tohecz to w zasadzie oszustwo

5
Jeszcze ładniej#!/bin/chmod 0
Hauleth

112

Kod maszynowy 6800 - 1 bajt

0xDD

Jest to znane jako HCF lub Halt and Catch Fire


78
Cóż, zasady mówią: „Wszelkie odpowiedzi inicjujące ponowne uruchomienie lub zatrzymanie zostaną zdyskwalifikowane”, ale to nie tylko inicjuje zatrzymanie, ponieważ również zapala się. Tak więc +1!
Trejkaz

94

Shell + sed, 16 bajtów

Nie tak destrukcyjne jak niektóre inne odpowiedzi ;-)

Ten skrypt wstawia komentarz #na początku każdej linii:

sed -i s/^/#/ $0

3
Jak o sed -i g $0?
seshoumara

91

Commodore 64 BASIC

Ten nie usuwa programu.

1 POKE 2048,1

Self-destruct

Zgodnie z mapą pamięci Commodore 64 adres 2048jest nieużywany, ale musi zawierać wartość, 0aby program BASIC mógł być uruchomiony.


1
Czy Poke po prostu przenosi zmienną do lokalizacji?
ojblass

12
@ojblass tak, skutecznie. poke a, bodpowiada kodowi C *((unsigned char *)a) = b;.
Jules

4
Chciałbym wizualizować moje zaczepy FaceBook w ten sposób!
Sunny R Gupta

3
Och wow ... Pamiętam PEEK i POKE z C64 BASIC!
Pisałem

uwaga dodatkowa: 0bajt służy do oznaczenia końca linii kodu; więc adres 0x800 prawdopodobnie potrzebuje jednego, aby zaznaczyć początek pierwszej linii kodu.
Tytus

89

Założenie: działający system Solaris, zalogowany jako root

killall

3
czy Solaris naprawdę mają coś takiego?
ojblass

21
Tak, robi dokładnie to, co mówi na puszce i zabija wszystkie uruchomione procesy.
Greg Hewgill

jeden głos za ciebie!
ojblass

9
1, w pytaniu wspomniano, że dostęp do katalogu głównego nie jest dozwolony.
user80551

119
@ user80551 jest przyczyną tej reguły.
Seiyria

68

Python, 18 lat

open(__file__,'w')

Obcina plik, otwierając go w trybie tylko do zapisu.


14
Na wszelki wypadek poważnie otwiera się ( __file__odnosi się do własnej nazwy pliku). Otwarcie w wtrybie obcina plik, w zasadzie go usuwa.
Bob

7
Myślę, że obcinanie odbywa się na otwartym, ale niezależnie od środowiska wykonawczego Python powinno wyczyścić wszystkie otwarte pliki na końcu programu, a Python lub system operacyjny zamkną je po zakończeniu procesu. „Oczywiście, ogólnie dobrą praktyką jest jawne zamykanie otwartych uchwytów, gdy z nimi skończysz.
Bob

5
„Właściwy” sposób obsługi plików w Pythonie to ... er, z. with open("myfile.txt","r") as thefile:a następnie kod obsługi pliku automatycznie zamknie plik po zakończeniu.
Schilcote

1
Można to skrócić do czegoś w rodzaju open("f.py","w").
Ethan Bierlein,

1
Nie przestaje działać, gdy pozostaje .pyc pozostaje
minmaxavg

66

Partia: 5 bajtów

%0|%0

Zasadniczo jest to widebomb dla systemu Windows.

Aplikacja rozpoczyna swój pierwszy argument dwa razy. Nie uruchamiaj go w produktywnym środowisku;)


83
Czy istnieje produktywne środowisko Windows? (Żartuję oczywiście).
orion

17
wygląda tak niewinnie!
ojblass

15
Ok, zdecydowanie nie próbuj tego. Nie poszło dobrze.
rmobis

75
Nie miej do powiedzenia przedstawiciela, ale narusza to „tylko raz” w najostrzejszy możliwy sposób.
Xan

14
Wierzę, że człowiek wykonuje go tylko raz i że się kwalifikuje.
ojblass

54

JavaScript

localStorage.x = eval(localStorage.x + localStorage.x)

Przy pierwszym uruchomieniu będzie działał dobrze:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
NaN

Jeśli spróbujesz uruchomić go więcej (nawet po odświeżeniu), pojawi się błąd:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
ReferenceError: NaNNaN is not defined

5
Więc jeśli uruchomisz go wiele razy, otrzymasz motyw Batmana. +1 za to.
Hankrecords

2
@Hankrecords Niestety, nie do końca, ponieważ nie zostanie to wykonane później ...
RedClover

@Sakuaku Bummer ...
Hankrecords,

@Hankrecords, chyba że je usuniesz eval, ale nie spełni tego wyzwania
RedClover

46

System operacyjny CMS firmy IBM, który jest systemem operacyjnym dla jednego użytkownika działającym jako gość w ramach VM Hypervisor IBM, ma ciekawą strukturę plików.

Pliki składają się z trzech elementów: nazwy pliku, typu pliku i trybu pliku. Tryb pliku składa się z dwóch elementów, jednego alfabetu, które dla ułatwienia wyjaśnienia można traktować podobnie do litery dysku dla systemu Windows / MS-DOS i jednej cyfry.

Pojedyncza cyfra ma znaczenie, http://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.dmsa3/hcsd0b10127.htm i dla tego zadania interesująca jest liczba 3:

Tryb pliku numer 3
Tryb pliku numer 3 oznacza, że ​​pliki są usuwane po ich odczytaniu. Możesz użyć trybu pliku numer 3, jeśli nie chcesz przechowywać kopii na swoich minidiskach lub w katalogach SFS.

Poświęć godziny na pisanie skryptu i zapisanie go jako „LOST FOREVER A3”. Uruchom to, działa po raz pierwszy. Wyrusz do domu z dobrze wykonaną pracą.

Uwaga: nie jest wyświetlany żaden komunikat wskazujący na usunięcie. W końcu wszyscy wiedzą, co to 3znaczy, prawda?

Jest to oczywiście bardzo przydatne. Po zakończeniu testowania można użyć 3plików tymczasowych i nie trzeba ich później czyścić, ponieważ są to pliki jednorazowe.


44

Commodore 64 BASIC

0 NEW

NEW usuwa program.


1
Co to robi
Darth Egregious

3
@ user973810, jeśli pamiętam podstawowy, nowy służy do czyszczenia pamięci, więc usunie program
user902383

3
Miły. Nie dotyczy Commodore 64, prawdopodobnie działa tak, jak działa na prawie każdej 8-bitowej maszynie BASIC z lat 80-tych ...
ysap

Możesz też cofnąć OLD lub O. Uznałem, że 12 miesięcy 12-latków jest genialnym programistą do gier; raz działam przypadkowo. Następnie przypadkowo zapisany zamiast przestarzałego. O. już nie działał :( Nauczyłem się, jak edytory szesnastkowe działały dość ostro :)
Matt Warren

3
@ysap: Byłoby bardziej przenośne, gdyby używał 1 jako numeru linii; nie wszystkie implementacje BASIC obsługiwane numer linii 0.
celtschk

41

Bash, 12

Uwaga: jest to destrukcyjne.

:(){ :|:&};:

To popularna bomba typu widelec. Wykładniczo zjada całą pamięć i PID blokuje system. Twardy restart pozwoli na ponowne uruchomienie kodu, ale dlaczego miałbyś to zrobić?


Bash, 10

:(){ :&};:

W przypadku dwóch mniej znaków, to zjada pamięć liniowo.


Bash, 7

w;PATH=

w jest wybierany jako najkrótszy plik wykonywalny, jaki mogłem wymyślić.

To po prostu usuwa zmienną ścieżki, aby powłoka nie mogła znaleźć /usr/bin/wnastępnym razem. Ponowne uruchomienie powłoki naprawia to, ponieważ ścieżka jest zwykle przechowywana~/.profile


Cholera: DI właśnie wpadł na ten sam pomysł: P
Knerd

1
:(){ :&};:nie powinienem jeść swojej pamięci. Zatrzymuje się, gdy tylko rozwinie się, więc jest zawsze O(1)aktywny. Zrobiłeś to while(fork());, co zjadłoby twoją pamięć liniowo, jest odpowiednikiem fork(); while(1);.
marinus

26
Łał! to niektóre śmiertelne emocje! Lepiej nie nazywam mojego komputera obraźliwym frownyface :(){ ....
Level River St

1
O ile dobrze pamiętam ... bomba widelca okresowo pozostawia jeden PID otwarty. Skrypt można uruchomić ponownie w tym przedziale czasowym ... a jeśli to się nie liczy, możliwe jest zabicie wszystkich widelców z pewnym wysiłkiem. Ponowne uruchomienie jest po prostu najłatwiejszym rozwiązaniem.
Brilliand

11
Nie sądzę, że to się kwalifikuje. Nie uniemożliwia to ponownego uruchomienia skryptu, ale gwarantuje, że uruchomi się ponownie (wiele razy).
Ben Voigt

20

DO#

Najkrótszy kod do usuwania siebie

Process.Start(new ProcessStartInfo("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location + "\""));

Kod powodujący, że staje się niezauważalny w interfejsie użytkownika

Process.Start( new ProcessStartInfo()
{
    Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location+"\"",
    WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = "cmd.exe"
});

7
Nareszcie odpowiedź w języku C #!
Pharap

Dlaczego wymagany jest wybór?
wizzwizz4

19

C ++ 71

Plik wykonywalny „golf” nie ma pozwolenia na uruchomienie następnym razem.

#include <stdlib.h>
int main()
{
system("chmod a-x golf");
return 0;
}

JavaScript / HTML 137, 145 z testem konsoli

<script id="s"> 
function h(){
console.log(1);
var s=document.getElementById("s");
h=s.innerHTML;
h=h.replace("h","g");
s.innerHTML=h;
}

11
@Templar w kontekście JavaScript, myślę, że odświeżenie strony liczy się jako

2
Nawet jeśli skrypt nie był usuwany ze strony, nadal byłby wykonywany tylko raz. To nie ma sensu.
nderscore

2
@nderscore Wygląda na to, że funkcja h zostanie wykonana tylko raz. Musisz go wywołać skądinąd (jak sądzę, analogicznie do uruchamiania programu). Powiedzieć <button onclick="h();">.
Bob

4
Biorąc pod uwagę, że ponowne ładowanie strony jest dozwolone, a Twoim celem jest tylko zapobieganie wykonywaniu h przez więcej niż jeden raz, gdy jest już załadowany, co jest nie tak function h(){h=0}?
Keen

1
Dzięki temu #include <sys/stat.h>możesz uzyskać chmodbezpośredni dostęp do funkcji, oszczędzając sporo bajtów ( <stdlib.h>nie jest już potrzebne i nie jest system). Również nie returnjest potrzebne.
Ben Voigt

19

Nazywam się Shell ... PowerShell

Klasyczny komunikat autodestrukcyjny:

@'
##################################
Project X is a go

Meet Eagle 1 at WP Alpha

Further comms is hereby prohibited
##################################
This message will self destruct in 
5 seconds
'@
5..1| %{$_;Sleep 1;}
"Goodbye"
rm $(.{$MyInvocation.ScriptName})

Wyjaśnienie, proszę?
noɥʇʎԀʎzɐɹƆ

@ noɥʇʎԀʎzɐɹƆ Linie do 13 to tylko nonsens. Następnie, podobnie jak każda inna powłoka, PowerShell ładuje uruchomiony skrypt do pamięci, a zatem nie potrzebuje już oryginalnego pliku skryptu ... więc sam się usuwa.
SomeShinyObject,

18

Bash (5)

rm $0

Zakładając, że nie masz spacji w nazwie pliku.


40
To dlatego Unix jest lepszy niż Windows: rm zamiast del zapisał ci bajt.
MadTux,

1
@MadTux Wolę * nix od Uniksa.
wizzwizz4

14

sh

#!/bin/sh
curl http://runonce.herokuapp.com/

Uruchomi się tylko raz (i wyświetli „Witaj, świecie!”, Jeśli działa), nawet jeśli ponownie zainstalujesz system i ponownie umieścisz skrypt.


EDYCJA: Pomyślałem, że wydam również skrypt za runonce. Nic specjalnego, ponieważ nie miało być wydane w żaden sposób, ale cokolwiek.

<?php
$db = pg_connect("[connection information]");
$ip = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];

pg_query("DELETE FROM users WHERE time < now() - interval '1 day'");

$result = pg_query_params($db, "SELECT * FROM users WHERE ip = $1 LIMIT 1", array($ip));

if (!pg_fetch_row($result)) {
    echo "Hello, world!\n";
    pg_query_params($db, "INSERT INTO users (ip) VALUES ($1)", array($ip));
}

Jak również schemat bazy danych

CREATE TABLE users (
    ip inet PRIMARY KEY,
    time timestamp with time zone NOT NULL DEFAULT now()
);
CREATE INDEX ON users (time);

Dane są przechowywane w bazie danych Heroku, możesz je sprawdzić , jeśli chcesz. Nie sprawdzam danych przechowywanych w bazie danych, są one przechowywane wyłącznie w celu umożliwienia wykonania kodu raz.


4
Twierdziłbym, że będzie działał wiele razy, po prostu nie generuje żadnych wyników po pierwszym.
Brilliand

5
To nawet nie pokazało mi „Hello World”.
Paŭlo Ebermann

1
@ StéphaneGourichon: Tak, pamięta adresy IP i nie ma możliwości usunięcia adresu IP przed automatycznym usunięciem. Postanowiłem umieścić kod źródłowy, abyś mógł sprawdzić, co robi.
Konrad Borowski

1
@ StéphaneGourichon: pg_query_paramsprawie chroni przed wstrzyknięciem SQL. Nie zostanie on jednak zapisany, ponieważ '; DROP TABLE users;--nie jest prawidłowym adresem IP ( inetakceptuje tylko adresy IP), a zatem jeśli masz fałszywy X-Forwarded-Fornagłówek, twoja wizyta nie zostanie zapisana. Nie uważam tego za problem.
Konrad Borowski

2
Uważam, że jest to naruszenie standardowej luki: outsourcing prawdziwej odpowiedzi .
juniorRubyist

12

PHP, 22 20 znaków

<?=unlink(__FILE__);

EDYCJA: Usunięto dwa znaki na końcu na komentarze.


2
Można to dodatkowo uprościć, ponieważ: <?unlink(__FILE__);trailing ?>nie jest wymagany
leepowers

Musisz zacząć od, <?=lub tag początkowy nie został rozpoznany.
Michael Mior

2
PHP sam się niszczy ... ha! E_NOTICE linia 3048
metadany

<?+ spacja jest również w porządku. Po krótkim tagu nie można użyć litery.
Tytus

11

Ruby, 14 lat

Przepisuje kod źródłowy jako nazwę programu.

IO.write $0,$0

3
A co, jeśli program ma nazwę „IO.write $ 0, $ 0”? „Założenie: nazwij program czymś, co nie jest poprawnym kodem w żadnym języku.”
Brilli i

@Brilland program ruby ​​powinien zawsze kończyć się na, .rba nawet jeśli jego nazwa to „IO.write $ 0, $ 0 # .rb”, to nie zadziała, ponieważ podczas pisania będzie zawierać pełną ścieżkę.
Mhmd

3
@Mhmd program rubinowy może kończyć się wszystkim. Na przykład gemi irbsą programami Ruby bez rozszerzenia.
bfontaine

@bfontaine Które mają shebangs. To nie
wizzwizz4

@ wizzwizz4 Shebangs nie mają nic wspólnego z rozszerzeniem. ruby fooi ruby foo.rbbędzie działać tak samo z shebang lub bez. ./foooraz ./foo.rb(zakładając, że są one wykonywalne) zarówno zakończy się niepowodzeniem bez shebang, jak i odniesie sukces (przy założeniu poprawnego kodu itp.).
bfontaine

10

Partia (6 znaków)

Zakłada się, że mamy pozwolenie na usunięcie pliku, i oczywiście można to zrobić w systemie Windows (może także MS-DOS).

del %0

10

Bash 9 8 znaków

nc -l 1&

Uruchomi się tylko raz, ponieważ port jest zablokowany na zawsze.


1
Myślę, że to nie działa, ponieważ 0jest to specjalny port (jest zarezerwowany). Po uruchomieniu tego na komputerze mogę otworzyć go wiele razy. Jest to również port < 1024, co oznacza, że ​​wymaga dostępu do konta root, aby można go było słuchać.
heinrich5991

nc -l 1&rozwiąże problem 0i będzie o jeden bajt krótszy, ponieważ ostatnie miejsce nie jest potrzebne.
kasperd

@kasperd Dzięki za wkład :-)
Falco

@ heinrich5991 ok - niż potrzebowałbym 11 znaków bez dostępu do katalogu głównego, aby użyć portu takiego jak 9654
Falco

Chcesz wyjaśnić, dlaczego przegłosowałeś?
Falco

9

NodeJS - 33 bajty

require('fs').unlink(__filename);

Czy mógłbyś opisać, co to robi dla tych, którzy nie znają języka?
Kyle Kanos

1
@KyleKanos Pobiera moduł systemu plików fsi bieżącą nazwę pliku __filenameoraz usuwa tę nazwę pliku z systemu plików.
Gorliwy

7
Możesz pominąć średnik, ponieważ są one opcjonalne w JavaScript.
dokładnie

8

Partia, 7 znaków

Zapisz niezapisaną pracę przed wypróbowaniem tego.

Przyjmuje system 64-bitowy lub 32-bitowy z pamięcią RAM <2 GB. Należy go zapisać w pliku .bat lub .cmd przed uruchomieniem, samo wpisanie go w cmd.exe nie będzie działać.

^ nul<^

Zużywa pełny rdzeń procesora i wypełnia pamięć RAM z szybkością kilkuset megabajtów na sekundę. Jeśli nie zatrzymasz go na czas (Menedżer zadań), zajmie on każdy bajt pamięci RAM na twoim komputerze, cały system zamrozi się i nie będziesz mógł nic zrobić, zanim wymusisz zamknięcie i ponowne uruchomienie komputera przez cięcie zasilanie lub przytrzymanie przycisku zasilania.

Wszystkie kredyty trafiają do txtechhelp na StackOverflow. Zobacz więcej informacji tutaj: https://stackoverflow.com/q/23284131/1955334


Jak to by było możliwe? Co ze stronicowaniem? Priorytet procesu ?
Nicolas Barbulesco

Uruchomiłem ten skrypt, nic się nie stało.
Pavel

@Pavel Domyślam się, że zostało to naprawione w systemie Windows 10. Nie mogę go odtworzyć w systemie Windows 10, ale działa on w systemie Windows 8.1.
bilde2910,

1
„Zużywa pełny rdzeń procesora i wypełnia pamięć RAM z szybkością kilkuset megabajtów na sekundę. Jeśli nie zatrzymasz go na czas (Menedżer zadań), zużyje każdy bajt pamięci RAM na twoim komputerze, cały system zawiesi się i nie będziesz mógł nic zrobić, zanim nie wymusisz zamknięcia komputera i ponownego uruchomienia komputera przez odcięcie zasilania lub przytrzymanie przycisku zasilania. " Brzmi jak horror na komputery ...
noɥʇʎԀʎzɐɹƆ

7

Oto kilka. W przeciwieństwie do wielu, nie są one destrukcyjne, tylko kreatywne i niekonwencjonalne.

Grzmotnąć

#!/usr/bin/env bash
read <<< ''
printf "$REPLY" > "$0"

Ten jest dość prosty. Zmienna $REPLYjest tworzona niejawnie przez read, ale wypełniona pustym ciągiem znaków. Ten pusty ciąg jest następnie printfzapisywany w bieżącym skrypcie. Jest to raczej zaciemniony odpowiednik:

#!/usr/bin/env bash
cat <<< '' > "$0" # probably a lot more portable

Pakiet Windows

copy con %0 < nul

Drugi w zasadzie kopiuje dane wejściowe konsoli, odczytane z nul , do bieżącego pliku.


Opublikowane po tym stało się konkursem popularności
Isiah Meadows

1
Pierwszy nie będzie działał bez uprawnień roota. Dlaczego próbujesz wymienić urządzenie zerowe? Po uruchomieniu jako root spowoduje to, że system zachowa się nieprawidłowo. Nadpisujesz również wartość zerową podczas pisania w niej :) Dlaczego nie przenieść jej gdzie indziej? Takich jak mv „$ 0” „$ {0} x” czy coś? To powinno wystarczyć.
orion

Czy plik nadal istnieje później?
Isiah Meadows

Teraz całkowicie zmieniłem przykład Bash.
Isiah Meadows

W jaki sposób nie są one destrukcyjne?
ysap

7

Sinclair BASIC

10 POKE 23635,255

Przenosi adres programu BASIC w pamięci poza miejsce, w którym powinien być (203), aby tłumacz znalazł nieprawidłowe dane.


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.