Twoim zadaniem jest napisanie pełnego programu, który będzie odliczał od 10 przy każdym uruchomieniu.
- Przy pierwszym uruchomieniu program powinien zostać wydrukowany
10
. - Następnym razem powinien wyjść
9
. - Następnym razem powinien wyjść
8
, i tak dalej. - Zamiast drukowania
0
program powinien ulec awarii. Po tym czasie nie musisz już obsługiwać uruchomionego programu. - Wszelkie obiekty używane do przechowywania można założyć, że są puste przed pierwszym uruchomieniem programu.
Oto przykładowa implementacja w Pythonie 3:
try:f=open("a","r+");v=int(f.read())
except:f=open("a","w");v=10
1/v
print(v)
f.seek(0)
f.write(str(v-1))
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź (mierzona w bajtach).
Odpowiedzi:
6502 język maszynowy + Apple] [+ ROM, 12 (11? 10? 9?) Bajtów
Powinien zacząć od
$8000
. Awarie monitora systemu, gdy liczba osiągnie 0.Powinien zacząć od
$B1
. Oszczędza to bajt, ponieważ mogę używać (dwubajtowej) wersji zerowej stronyDEC
, ale zastępuje krytyczną procedurę ApplesoftCHRGET
; musisz go załadować i wywołać z monitora, a po zakończeniu użyj CTRL+, BReturnaby ponownie zainicjować BASIC. Nie jestem pewien, czy to unieważnia, czy nie.Powinien zacząć od
$8000
. Nie inicjuje się$9E
, oszczędzając dwa bajty. Oznacza to jednak, że nie wolno dzwonić do niego z ujemnym adresem (lub, jeśli dzwonisz z monitora, musisz zadzwonić do monitora z dodatnim adresem). Jeśli tak, Applesoft zaCALL
rutynowe będzie przechowywaćFF
w$9E
, powodując jej dodać 65280 do numeru podczas drukowania go. Ponownie, nie jestem pewien, czy to unieważnia rozwiązanie, czy nie.Powinien zacząć od
$B1
. Jest to kombinacja powyższych dwóch programów, oszczędzając w sumie trzy bajty; będziesz musiał zadzwonić do monitora z dodatnim adresem, załadować go i uruchomić stamtąd, a następnie użyć Ctrl+, BReturnaby ponownie zainicjować BASIC po zakończeniu .Zauważ, że te programy modyfikują tylko program w pamięci; ponowne załadowanie programu z dysku spowoduje zresetowanie odliczania. Działa to, ponieważ Apple] [(i] [+, // e i // c) nie mają żadnego systemu ochrony pamięci; program (i jego samodzielne modyfikacje) pozostaną w pamięci nawet po wyjściu z niego, więc możesz nadal uruchamiać go z pamięci, dopóki nie nadpiszesz tej pamięci na coś innego.
Przykładowy przebieg
Wyjaśnienie
Objaśnienie wersji 10-bajtowej
Warianty
Drukuje
ERR
i emituje sygnały dźwiękowe, gdy liczba osiągnie 0Normalny - 15 bajtów
Nadpisuje
CHRGET
- 14 bajtówNie inicjuje się
$9E
- 13 bajtówNadpisuje
CHRGET
i nie inicjuje$9E
- 12 bajtówZatrzymuje się, gdy liczba osiągnie 0
Normalny - 12 bajtów
Nadpisuje
CHRGET
- 11 bajtówNie inicjuje się
$9E
- 10 bajtówNadpisuje
CHRGET
i nie inicjuje$9E
- 9 bajtówźródło
Perl w systemie Linux, 17 bajtów
Pomyślałem, że może być interesujące stworzenie programu, który nie utrzymuje żadnego stanu i nie modyfikuje własnego kodu źródłowego; innymi słowy, faktycznie sprawdza, jak często był uruchamiany, pytając system operacyjny. Pytanie brzmi: „Można założyć, że wszelkie urządzenia używane do przechowywania są puste przed pierwszym uruchomieniem programu.” I dlatego chcielibyśmy zacząć od całkowicie pustego systemu operacyjnego. W związku z tym lepiej wyjaśnię, jak sobie z tym poradzisz, ponieważ w przeciwnym razie testowanie programu jest trudne.
Istnieją dwa sposoby skonfigurowania działania programu. Tak czy inaczej, minimalny system operacyjny do tego celu działałby tylko z powłoką (aby umożliwić nam uruchamianie Perla z kolei) i najprostszą z możliwych powłok (aby nie robił nic wymyślnego, co sprawiłoby, że system operacyjny nie byłby pusty).
/bin/dash
jest dobrym wyborem tutaj, ponieważ miał być minimalną powłoką do odzyskiwania systemu. Następnie musimy uruchomić Linuksa w taki sposób, aby działał tylkodash
. Możemy to zrobić, uruchamiając ponownie komputer zainit=/bin/dash
pomocą wiersza polecenia systemu Linux, aby nic się nie uruchamiałodash
, lub (o wiele wygodniej) tworząc kontener systemu Linux zaunshare -Urfp /bin/dash
pomocą terminala (unshare
tak naprawdę nie tworzy pustego systemu operacyjnego, ale symulujejeden; zwłaszcza wnętrze kontenera myśli, że jest rootem,dash
myśli, że jest init, itd., tak jak by to było w przypadku rzeczywistego pustego systemu operacyjnego). Oświadczenie: Właściwie nie testowałem tego jeszcze na gołym metalu, tylko w środkuunshare
, ale teoretycznie powinno to działać w obie strony.Wreszcie, kiedy już to skonfigurujemy, musimy po prostu spojrzeć na PID; ponieważ jesteśmy w systemie pustym, system inicjujący (tutaj powłoka) będzie miał PID 1, więc wykonanie Perla będzie miało PID od 2 do 12 włącznie. Nasz program wygląda więc tak:
Oto przykładowy przebieg:
źródło
unshare
nie obsługuje żadnych flag-Urfp
.unshare
jest całkiem nowy (jest to interfejs do funkcji systemu operacyjnego, który jest również całkiem nowy), a błędy zostały naprawione dopiero w ciągu ostatniego roku. Jeśli używasz 2-letniej wersji, nic dziwnego, że ma bardzo ograniczoną funkcjonalność.Bash + sed,
414038 bajtówWypróbuj online!
źródło
sed: invalid option -- '/'
. sed (GNU sed) 4.2.2JavaScript, 42 bajty
Przetestuj to za pomocą tego skrzypka - pamiętaj, aby wyczyścić pamięć lokalną, aby zresetować odliczanie.
Dzięki steenbergh, Lmis i obarakon za wiele bajtów!
źródło
y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)
może zaoszczędzić bajt.sessionStorage
do testowania z łatwiejszym resetem (wystarczy użyć nowej karty), ale oczywiście +2 bajty.l=localStorage;l.l=-~l.l;alert(10-l.l||l)
aby zapisać bajt, usunę mójconsole.log
tutaj, ale wolałbym to alboa
oszacowanie, gdy wartość w magazynie lokalnym nie wynosi 0.C #,
197160159125 bajtówZaoszczędzono 34 bajty dzięki mleku
I sformatowana wersja (z
ReadKey
dodanym, aby można było wyświetlić dane wyjściowe):Jest dłuższy, niż się spodziewałem, więc prawdopodobnie jest miejsce na grę w golfa.
źródło
File.Exists
iFile.Create
zamiastReadAllText
iWriteAllText
. Wystarczy sprawdzić, czy nazwa pliku istnieje, nie oba z zawartością pliku. Ponadtonamespace System.IO
możesz usunąć przestrzeń nazw zSystem.Console.Write
. 125 bajtów:namespace System.IO{class P{static void Main(){var n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Write(n*n/n);}}}
Dyalog APL ,
332822/20? bajtyNie jestem pewien, czy jest to poprawne, ponieważ składa się z funkcji (którą należy wywołać za pomocą fikcyjnego argumentu). Jednak wszystkie programy APL (czysto funkcjonalne lub nie) mają ten sam status, a niektóre wersje APL nie mają tradycyjnych programów, a jedynie funkcje. W ramach kompensacji dodałem dwa bajty, aby go nazwać, chociaż nie jest to konieczne do uzyskania pożądanego efektu.
Zauważ, że polega to na nieoficjalnym dziwactwie, które
∘←
przypisuje się globalnie.6::
przy każdym błędzie wartości⊢c
zwrot c∘←10
który jest globalnie ustawiony na 10⋄
teraz÷÷c
zwraca dwukrotnie odwrócony (błędy na zero) c∘←
który jest globalnie ustawiony nac-1
jeden mniej niż okWypróbuj APL online!
Z pewnością ważna wersja 28-bajtowa:
Działa poprzez ustawienie c na 11, jeśli brakuje, a następnie odjęcie 1 od c , dwukrotne odwrócenie (co daje błąd div-by-zero, jeśli c -1 wynosi 0), przypisanie do c i wyprowadzenie nowej wartości.
Stara 33-bajtowa wersja:
Działa poprzez redefinicję się przy każdym uruchomieniu, ale z jedną nową końcową linią mniej. Zwraca dwukrotnie odwróconą liczbę pozostałych linii (mniej dwóch), co daje błąd div-by-zero, gdy pozostały tylko dwie linie (nagłówek i rzeczywisty kod).
źródło
Perl,
3736 bajtówWystępuje awaria, gdy wartość początkowa osiągnie -1 (co spowodowałoby wydrukowanie 0), gdy zapisuje się nad
=~
operatorem.Zapisano bajt za pomocą
sysopen
zamiastopen
. To pozwala miSTDOUT
najpierw wydrukować , używając wartości zwracanej jako trybu pliku (1
akaO_WRONLY
), zanim$~
zostanie ponownie przypisany.Przykładowe użycie
źródło
Perl 6 ,
6058 bajtówPotrzebuje znaku nowej linii po
=finish
.die
można zastąpić1/0
.Wyjaśnienie:
Później dostaje listę linii
=finish
($=finish.lines
) odejmuje to10
, a jeśli wynik nie0
jest, drukuje go, w przeciwnym raziedie
jest.Ostatnią rzeczą, którą robi, jest otwarcie się w trybie dołączania i dodanie kolejnej linii na końcu.
źródło
say $*PERL.compiler.version
)Python 2, 65 bajtów
Zainspirowany odpowiedzią L3viathan .
Można zmniejszyć do 60 bajtów, jeśli możesz nazwać plik pojedynczym znakiem,
x
a następnie zastąpić__file__
go'x'
. W takim przypadku należy wymienić75
z70
.źródło
Jolf, 20 bajtów
Wypróbuj tutaj! Błędy podczas
0
drukowania. Modyfikuje kod Wyjaśnienie, które nastąpi.źródło
Applesoft BASIC, 21 bajtów (tokenizowany)
Zamień
<CTRL-F>
i<CTRL-H>
ich dosłowne wersje. Zauważ, że modyfikuje to tylko program w pamięci; ponowne załadowanie go z dysku spowoduje zresetowanie odliczania.Przykładowy przebieg
Wyjaśnienie
PRINT 9 + 1
robi to, czego można oczekiwać.CALL 2066
wywołuje procedurę języka maszynowego 6502 w lokalizacji pamięci 2066, która jest późniejEND :
.END
zatrzymuje program, tak aby procedura języka maszynowego (która dla interpretera Applesoft jest śmieciem) nie jest wykonywana.Procedura w języku maszynowym po prostu zmniejsza wartość
9
wPRINT 9 + 1
. Demontaż:Gdy licznik osiągnie 0, jest „zmniejszany” do
/
; próba uruchomienia programu spowoduje błąd składniowy.źródło
*> <> ,
2018 bajtówTo faktycznie działa na Linuksie (i
\n
chyba cokolwiek obsługuje pliki o nazwie ). Tworzy plik o nazwie\n
przy pierwszym uruchomieniu i wyjściach10
. Kontynuuje generowanie o jedną liczbę mniejszą przy każdym kolejnym uruchomieniu, z wyjątkiem miejsca, w0
którym zamiast tego ulega awarii.Wyjaśnienie
źródło
PHP 57 bajtów
tak naprawdę nie ulega awarii, ale kończy działanie (bez odliczania), gdy uderza
0
. Czy to wystarczy?Uruchom z
-r
.źródło
C #, 156 bajtów
Grałem przez chwilę w grę @ TheLethalCoder i byłem w stanie zaoszczędzić 3 bajty, zmieniając kolejność instrukcji i eliminując int.parse (). Jestem pewien, że wciąż jest miejsce na ulepszenia.
Nie golfowany:
Meta-pytanie: Może być hack-y potraktować pracę TheLethalCoder jako punkt wyjścia do mojej odpowiedzi. Czy byłoby lepiej (gdy mam przedstawiciela) dodać to jako komentarz do ich odpowiedzi? Nie próbuję z nimi konkurować, chcę po prostu pokazać swoje umiejętności gry w golfa, wzajemne budowanie.
źródło
PowerShell V2.0, 49 bajtów
(Pierwszy w historii kod golfowy, nie mogłem znaleźć zasad obliczania bajtów. Użyłem kalkulatora Łańcuch bajtów online)
Bieganie:
źródło
Java, 343 bajty
Moja pierwsza próba golfa
bez golfa
źródło
java.io.*
i unikając używania w pełni kwalifikowanych nazw konstruktorów, a możesz wyciąć kolejne 8, korzystając z faktu, że „print” automatycznie zaostrzy swoje argumenty:import java.io.*;class M{public static void main(String[] a) throws Exception{if(!new File("x").exists()) try(PrintWriter p=new PrintWriter("x")){p.print(10);}int b=new java.util.Scanner(new File("x")).nextInt();try(PrintWriter p=new PrintWriter("x")){p.print(b/b*b-1);System.out.print(b);}}}
?
operatora opartego na istnieniu pliku, gdy czytaszb
:import java.io.*;class M{public static void main(String[] a) throws Exception{int b=new File("x").exists()?new java.util.Scanner(new File("x")).nextInt():10;try(PrintWriter p=new PrintWriter("x")){p.print(b/b*b-1);System.out.print(b);}}}
import java.io.*;class A{public static void main(String[]a)throws Exception{File f=new File("f");int b=f.exists()?new FileInputStream(f).read()-48:10;new PrintWriter(f).printf("%d",b/b*b-1).close();System.out.print(b);}}
SQLite,
142137Można to prawdopodobnie zrobić znacznie sprytniej.
141136 znaków dla kodu:Plus 1 za nazwę pliku
x
wsqlite3 x '…'
.źródło
JavaScript, 74 bajty
x=typeof x!=typeof 1?10:x!=1?x-=1:_
l=localStorage;l.a=typeof l.a!=typeof""?10:l.a!=1?l.a=--l.a:_;alert(l.a)
źródło
alert
lub podobnego, to tylko fragment REPL.Ruby,
9487846159 bajtówProszę zostawić sugestie poniżej.
Dzięki @ ConorO'Brien za pomysły (niektórzy bezwstydnie oderwali się od jego odpowiedzi).
źródło
puts i
=>p i
new
isize
zamiastopen
ilength
.Rubinowy, 52 + 1 = 53 bajty
Zakłada, że plik ma nazwę
a
(+1 bajt).Bieganie
źródło
a
(co jest tylko +1).Python 2, 89 bajtów
źródło
__file__
więc skorzystałem z tego w mojej odpowiedzi.len
s
, ponieważ muszę czytać, a następnie szukać, a następnie pisać. Toprint x/x*x
działałoby, ale nie poprawia liczby bajtów.TI-BASIC (TI-84 Plus) (15 bajtów)
Ans powinna wynosić 0 (wartość domyślna) przed pierwszym uruchomieniem.
Ponieważ
AnsAns/Ans
jest to ostatni wiersz programu, zostanie on wyprowadzony i zapisany w Ans, chyba że Ans wynosi 0, w którym to przypadku występuje błąd dzielenia przez 0.źródło
JavaScript, 41
l=localStorage;l.l=-~l.l;alert(11-l.l||I)
źródło
a
zamiast tego,l
kiedy to napisałem, i zmieniłem to bez zastanowienia, ponieważ myślałem, że wygląda to bardziej zabawnie ... było za późno i herby , dzięki za zwrócenie na to uwagi.GNU Smalltalk,
70, 68 bajtów66 bajtów kod +2 bajty dla flagi „-S”
EDYCJE
Grał w golfa
Test
Ważny
Musisz uruchomić gst jako root, aby mógł zmodyfikować domyślny obraz lub określić własny obraz za pomocą -I .
źródło
PHP, 45 bajtów
Szczerze mówiąc, nie jestem pewien, czy to się liczy.
Zamieszczę link do przykładu, ale wszyscy testerzy online, których znam, nie pozwalają
session_start()
na użycie.Będzie to odliczało za każdym razem, gdy odświeżysz stronę, aż do 0, kiedy
die
polecenie zostanie uruchomione.źródło
QBIC , 70 bajtów
Otwiera plik
a.b
(lub tworzy go, gdy nie zostanie znaleziony przy pierwszym uruchomieniu), wczytuje rekord 1 doe
. Jeśli ten rekord nie zostanie znaleziony, załóż 10, w przeciwnym razie pod 1. We==0
, zgłoś błąd. Napisze
doa.b
.Dostęp do plików nie jest wbudowany w QBIC, zależy to w dużej mierze od bazowej QBasic.
źródło
Partia, 72 bajty
Należy wywołać przy użyciu pełnej nazwy pliku, w tym rozszerzenia. Ostatnia linia nie może mieć końcowego nowego wiersza. Działa, pisząc
-1
do końca ostatniego wiersza, dzięki czemu za każdym razem ocenia się o 1 mniej.goto g
błędy, ponieważ nie ma etykiety:g
.źródło
R, 52 bajty
Zasadniczo używa
ls()
do wyświetlania nazw wszystkich globalnie przechowywanych obiektów. Jeśli założymy, że środowisko globalne jest puste i jeszcze"x"
nie istnieje, wygenerujx=10
, w przeciwnym razie, jeślix!=0
odejmij1
, wywołaj brakujący argument, który zwróci błąd.źródło
!
i zmieniając kolejność argumentów ów i else, a kolejne dwa, zmieniającx>0
nax
. (Ponadtoexists("x")
jest nieco starsze niż"x"%in%ls()
, choć równa pod względem liczby bajtów.)Pakiet Windows, 61 bajtów
źródło
JavaScript, 44 bajty
źródło