Zwiększanie liczb w wielu sesjach

30

Dobry wieczór agentów golfowych,

Twoim zadaniem jest w imieniu znanego giganta rozrywki Eviltronic Arts. W ramach nikczemnego planu zniewolenia świata i rozrywki muszą sprzedać jak najwięcej kopii SimStation V. Oznacza to, że oprogramowanie musi tajemniczo przestać działać po kilkukrotnym uruchomieniu.

Twoim celem jest napisanie programu, który zlicza liczbę uruchomień. Program nie może robić nic innego niż zapisywać liczbę całkowitą na standardowe wyjście. Przy pierwszym uruchomieniu powinien zwrócić „1”. Następne „2” i tak dalej. Program musi być w stanie osiągnąć co najmniej liczbę „14”, ale nie jest wymagany górny limit.

Twój program nie może jednak zapisywać żadnych nowych plików. Dostęp do samego siebie, rejestru, a nawet Internetu jest absolutnie OK. Ale niektórzy z naszych użytkowników są podejrzliwi wobec nowych plików i po prostu je zastąpią! Nerw! Pokonując ograniczenia oprogramowania, które legalnie kupili!

Program nie może założyć stabilnego interpretera lub powłoki - program musi nadal działać, jeśli cały komputer tłumacza zostanie zrestartowany między uruchomieniami.

Ponieważ musi być możliwie niewykrywalny, wygra najkrótszy kod źródłowy.

Powodzenia agenci. Branża rozrywkowa na ciebie liczy.

Lochok
źródło

Odpowiedzi:

21

skrypt bash, 39 , 37 , 21 18

wc -l<$0;echo>>$0

Krótkie i słodkie, moje pierwsze zgłoszenie w kodzie golfowym :)

Rozuur
źródło
1
Wymienić echoz id: D
thejh
dołącza niepotrzebne dane wyjściowe do pliku, który zostanie przekierowany do stderr
Rozuur
Co? Nic tu nie wchodzi w interakcje ze stderr. Ale racja, z czasem plik się powiększa.
thejh
można grać w golfa do 17: Zamień ;znak nowej linii i usuń znak nowej linii. Będzie nawet ładniej wyglądać :-)
Tomas
Czy istotny jest tylko początkowy rozmiar skryptu? Biorąc pod uwagę, że zwiększy się to przy każdym uruchomieniu.
nieprzyzwoite
18

Python, 40 , 39 , 38 znaków

Ponadto nie ma takiego górnego limitu czasu wykonywania:

open(__file__,'a').write("+1");print 1

Jak widać, rozmiar programu stopniowo rośnie, ale nie było takiego ograniczenia w pierwotnym problemie. Uważam, że liczy się rozmiar przesłanego programu

Abhijit
źródło
Nie sądzę, że musisz to umieścić a+, apowinno działać dobrze.
beary605
@ beary605: Dzięki za wskazówkę
Abhijit
10

PHP 48 bajtów

<?=$n=1 ;fputs(fopen(__FILE__,c),'<?=$n='.++$n);

Proste podejście do samodzielnej modyfikacji. Po uruchomieniu 99 razy, spektakularnie się zawiesi.

$ php increment.php
1
$ php increment.php
2
$ php increment.php
3

$ php increment.php
97
$ php increment.php
98
$ php increment.php
99
$ php increment.php
PHP Parse error:  syntax error, unexpected T_STRING, expecting ',' or ';' in increment.php on line 1
primo
źródło
czy pojedyncze białe znaki nie są niepotrzebne?
John Dvorak
1
@JanDvorak Pojedyncza biała spacja jest niezbędna w programie, w przeciwnym razie zawiesiłaby się po zaledwie 10 wykonaniach, które nie spełniają specyfikacji. Po 100. wykonaniu średnik jest nadpisywany, co powoduje błąd składniowy.
primo
Masz rozwiązanie PHP na 35 znaków , chcesz mnie pokonać? :)
Tomas
7

skrypt bash, 37

n=1;echo $n;sed -ie s/$n/$((n+1))/ $0
Geoff Reedy
źródło
5

Rubin: 31 21 znaków

(Jest to przepisać Abhijit „s rozwiązanie Python . Jeśli podoba Ci się pomysł bazowej upvote jego odpowiedź, tak jak ja).

open($0,?a)<<"+1";p 1

Przykładowy przebieg:

bash-4.2$ ruby increment.rb 
1

bash-4.2$ ruby increment.rb 
2

bash-4.2$ ruby increment.rb 
3
człowiek w pracy
źródło
1
Za pomocą <<możesz zapisać niektóre znaki: `open (0 $
,? A
Doh Dobry stary zwyczaj zamykania plików danych… :( Dziękuję, @steenslag.
manatwork
5

* sh, 17 lat

curl -L x.co/z7Uk

Korzystanie z usługi sieci Web - inne podejście niż inne dotychczasowe rozwiązania. Limit: pamięć mojej maszyny.


JavaScript, 40

alert(localStorage.a=~~localStorage.a+1)

Nie liczy się jako program, ale i tak jest dość długi. Nie działa w przeglądarce Firefox w pliku lokalnym. Limit: 2 ^ 31.

Kopiuj
źródło
Dlaczego nie alert(localStorage.a=~~localStorage.a+1)41 i technicznie rzecz biorąc, program javascript byłby bez tagów skryptowych, które byłyby tylko 33
David Mulder
@DavidMulder Och, racja
skopiuj
2
Do 33:alert((l=localStorage).a=~~l.a+1)
nitro2k01,
@ nitro2k01: Wygląda na to, że skopiowałem niewłaściwe rzeczy, bo to było 33, o którym mówiłem O :) 41 było tym samym, w tym znaczniki skryptu ~ (no cóż, deklinację wykonałem przed alertem, bo to jest tak samo długie: a=localStorage;alert(a.b=~~a.b+1)chociaż twoje wygląda ładniej: D
David Mulder
1
@WallyWest Nie, to faktycznie bitowe odwracanie i narusza dziwne reguły konwersji JavaScript
skopiuj
4

PHP 31 37 znaków

Własna modyfikacja. Liczy się w jednym. Uważaj, aby twój edytor tekstu nie próbował być pomocny i wstawił znak nowej linii po 1. Będzie działał (poprawnie) w PHP <5.3.2, ponieważ polega na php do zamykania otwartych deskryptorów plików podczas zamykania. Czy też dopuszczalne jest przeciekanie deskryptorów plików?

<?fputs(fopen(__FILE__,a),1)?>1

Wersja oryginalna (36 znaków), wszystkie wersje PHP:

<?file_put_contents(__FILE__,1,8)?>1
Tim Seguine
źródło
2
„To się liczy” - najlepszy hack golfowy, jaki widziałem od dłuższego czasu!
lochok
Wyzywam cię. Rozwiązanie PHP na 35 znaków i jest dziesiętne :)
Tomas
1
Wow, widzę, że pobiłeś mnie własną metodą! Gratulacje! :-) I dziękuję za ulepszenie mojej metody. Uwzględniłem to w mojej odpowiedzi i wyraziłem za to uznanie.
Tomas
@Tomas Jestem ci winien kredyt. Gdybyś mnie nie rzucił, nie spojrzałbym na tę odpowiedź ponownie.
Tim Seguine
Tim, to właśnie radość i emocje, jakie stawiają sobie wyzwania! :)
Tomas
2

Python, 50

n=1;
print n
open(__file__,'r+').write("n="+`n+1`)

Używa tego samego podejścia co odpowiedź primo i podobnie ulega awarii przy 100 biegu.

grc
źródło
2

J (58)

Musisz uruchomić to jako skrypt, to oczywiście nie zadziała z linii poleceń J.

echo m=.1
exit(;:^:_1(<":m+1)(<3)};:1!:1[k)1!:2[k=.1{ARGV

W J tokenizer, którego używa interpreter, jest dostępny jako ;:funkcja, więc jeśli xzawiera kod J, ;:xzawiera tokeny J, tj .:

    ;: 'echo 1 2 3+4 5 6'
+----+-----+-+-----+
|echo|1 2 3|+|4 5 6|
+----+-----+-+-----+

Więc:

  • echo m=.1: ustaw mna 1 i zapisz na ekranie
  • k=.1{ARGV: zapisz drugi element w ARGV(nazwie skryptu) w k.
  • ... 1!:2[k: wpisz następujący ciąg do pliku w k:
  • ;:1!:1[k: czytaj k, bieżący skrypt i tokenizuj
  • (<":m+1)(<3)}: zamień trzeci token na ciąg znaków reprezentujący m + 1
  • ;:^:_1: uruchom tokenizer w odwrotnej kolejności, generując ciąg
  • exit: zamknij interpreter (nie robi tego sam, nawet jeśli uruchomisz skrypt)
marinus
źródło
2

PHP, 34 33 znaków

<?=$_SESSION[A]+=session_start();

Dzięki Tim za aktualizację! Moje stare rozwiązanie:

<?=session_start()+$_SESSION[A]++;

Problemem jest to, że $_SESSION[A]jest ""- pusty ciąg znaków - w pierwszej iteracji, ale jakosession_start() zwraca 1, można go dodać i upiec dwie lub trzy muchy w jeden strzał!

Rozwiązanie z poprawną składnią (35 znaków):

<?=session_start()+$_SESSION[A]++?>
Tomas
źródło
Orzekam przez sekundę z dwóch powodów. „Jednak twój program nie może zapisywać żadnych nowych plików.”: Nie jestem pewien, czy nie jest to problem dla tego rozwiązania, ponieważ otwarcie sesji tworzy plik tymczasowy. Również domyślna sesja gc dzieje się po 24 minutach. Czy to naprawdę liczy się jako „w wielu sesjach”? Może OP może skomentować.
Tim Seguine
Tim, program nie zapisuje żadnych plików. Nie jestem odpowiedzialny za to, co robi tłumacz. Jest tak samo, jak strona HTML nie jest odpowiedzialna za tworzenie przez przeglądarkę niektórych plików w pamięci podręcznej, zapytanie sql nie jest odpowiedzialne za tworzenie tymczasowych tabel na dysku itp. Jeśli chodzi o limit czasu, nie został określony w regułach :) W każdym razie nie jestem jasne, dlaczego, ale na mojej maszynie licznik nadal utrzymuje się przez więcej niż kilka godzin !!!
Tomas
Tak, dlatego mówię, że poczekam, aby zobaczyć, co myśli OP. Na pewno znalazłeś bardzo szary obszar. Nie potrzebujesz zamykającego tagu php btw. więc Twoja wersja 34 znaków jest wystarczająca. Mam pomysł na ulepszenie, ale najpierw muszę go przetestować.
Tim Seguine
Okej, zmniejszyłem to do 33 znaków. Wyzywam cię, żebyś zrobił lepiej. ;)
Tim Seguine
@ TimSeguine Aaaah, co za zmiana w twoim tonie! :-) Teraz nie przejmujesz się tak bardzo zasadami w moim poście! :-D
Tomas
2

Haskell - 36 bajtów

main=do appendFile"a.hs""+1";print$1

Po prostu dodaje +1się na końcu pliku źródłowego, który zakłada się, że ma nazwę a.hs. .hsRozszerzenie jest obowiązkowe zarówno GHC i ghci.

Gajówka
źródło
1

TI-Basic, 9 znaków

:X+1->X:X
Timtech
źródło
1

Partia - 41

Biorąc pod uwagę przykładowy przypadek użycia, prawdopodobnie nie założyłbym, że ta technika jest wykonalna - zmienia nazwę pliku .bat zawierającego skrypt -

@set/aa=%~n0+1
@echo %a%&@ren %0 %a%.bat

Zapisz to w pliku o nazwie 0.bat- i zadzwoń za pomocą 0.bat 2>nul. 2>nulprzekierowuje stderr na nul, co jest konieczne, ponieważ ten skrypt zmieni nazwę pliku zawierającego skrypt, gdy to zrobi, cmd oczywiście nie będzie już widział skryptu (zanim osiągnie EOF) i zwróci błądThe batch file cannot be found.

Oczywiście każde kolejne wywołanie skryptu musi być 1.bat 2>nul ... 2.bat 2>nul ... 3.bat 2>nul ... etc ...

nieprzyzwoity
źródło
Opierając się na tym pomyśle, możesz wykonać odmianę mojej odpowiedzi php liczenia w jednym i myślę, że jest ona jeszcze krótsza.
Tim Seguine,
1

skrypt mIRC, 28/22 bajtów

Jeśli umieścisz w zakładce „aliasy”, „alias” można pominąć, tworząc 22 bajty.

alias x inc %i | echo -ag %i
FIQ
źródło
1

Python, 49 48 znaków

Uświadomiłem sobie, że będzie to tylko 48 znaków w systemie Windows z powodu \r\n . W przeciwnym razie powinno być 49.

n=1

print n;print>>open(__file__,'r+'),"n=",n+1

Tanie odrywanie metody przez @grc

jamylak
źródło
1

C, 190 znaków. Działa tylko w Win NT

#include <stdio.h>
int main(int c,char *v[]){
char f[100];sprintf(f,"%s:s",v[0]);
if (FILE *fp=fopen(f,"r"))fscanf(fp,"%d",&c);
FILE *fp=fopen(f,"w");printf("%d",c-1);fprintf(fp,"%d",++c);
}
Abhijit
źródło
Myślę, że to dość proste, jak to działa, ale mimo to mogę dodać wyjaśnienie :-)
Abhijit
1

C #, 142 znaki

int v=(Microsoft.Win32.Registry.CurrentUser.GetValue("c") as int?)??0+1;Console.Write(v);Microsoft.Win32.Registry.CurrentUser.SetValue("c",v);
ZafarYousafi
źródło
Możesz użyć krótszej nazwy, takiej jak Z, zmniejszysz o kilka znaków.
It'sNotALie.
Powinieneś także usunąć białe znaki.
Timtech
1
Zamiast wywoływać długą nazwę API za każdym razem, przechowuj ją w zmiennej takiej jak: var a = Microsoft.Win32.Registry.CurrentUser; a.GetValue (); a.SetValue ();
Xantix
1

Tcl, 63 lub 73 bajty

  • W przypadku niektórych usług sieciowych jest to 73:

    package require http
    puts [set [http::geturl http://example.com/c](data)]
    
  • sama modyfikacja to 63:

    proc a a {puts [string le $a]};puts -nonewline [open $argv0 a] a; a a
    
Johannes Kuhn
źródło
1

C # - 201 239 234 znaków

Działa przez pierwsze 255 razy, a następnie zawija do zera. Nie wypisze niczego przy pierwszym wykonaniu.

namespace System.IO{class s{static void Main (string[]a){char f='|';if(f!='|'){Console.Write (255);}string p=Reflection.Assembly.GetCallingAssembly().Location;byte[]d=File.ReadAllBytes(p);d[769]++;d[780]++;File.WriteAllBytes(p,d);}}}

Zapisz jako Main.cs, skompiluj z

gmcs Main.cs

Testowane z Gcsunt 2.10.8.1 i Mono runtime 2.10.8.1-5ubuntu2

użytkownik3188175
źródło
1
Właściwie to zrobiłem. „Program musi być co najmniej w stanie osiągnąć liczbę 14”
lochok
Działa teraz 255 razy.
user3188175
1

PowerShell, 47 bajtów

zakłada, że ​​skrypt ma nazwę a.ps1

0
[int]$n,$t=(gc a.ps1)[0..1];,(++$n),$t>a.ps1

Skrypt zastąpi Sama zastępując 0na pierwszej linii z 1, 2,3 i tak dalej.

może także zaoszczędzić kolejne 8 bajtów przez replaceing obie instancje a.ps1z 1i zapisywania skryptu jako plik o nazwie1 choć jest to trochę daleko dla mnie.

Zastąp drugi wiersz tym, jeśli plik nie jest zapisany jako „a.ps1”.

[int]$n,$t=(gc($s=$MyInvocation.MyCommand.Name))[0..1];,(++$n),$t>$s

0 w pierwszej linii, aby zainicjować zliczanie

Podział wiersza zapewnia najłatwiejszy sposób podzielenia pliku na dwie części

[int]$n,$t=(gc a.ps1)[0..1]

to pobiera plik „a.ps1” i wczytuje go jako tablicę wierszy, następnie iterujemy go [0..1]i ustawiamy zmienne, $nktóre są rzutowane odpowiednio [int]i $todpowiednio, tak aby 0pierwszy wiersz stał $nsię kodem „ „w drugim wierszu pojawi się$t

,(++$n),$t>a.ps1

Wykorzystano ,1,2notację tablicową, aby utworzyć tablicę dwóch elementów, z których jeden jest liczbą zapisaną w$n inkrementacji i wyprowadzany na standardowe wyjście za pomocą niejawnych nawiasów, drugi jest drugim wierszem tekstu z pliku, a następnie również danymi wyjściowymi do pliku o nazwie „a.ps1”

ponieważ zarówno dane wejściowe, jak i wyjściowe są tablicami ciągów, wymagane jest minimalne formatowanie i interpreter przyjmuje prawie wszystko.

colsw
źródło
1

Zsh (bez coreutils), 32 bajty

a=`<$0`
<<<$[$#a/2-15]
>>$0<<<:

(Zwróć uwagę na końcowy znak nowej linii). Używa długości skryptu. Przy każdym wywołaniu ostatnia linia pokazana powyżej zostanie dołączona :(identyczna z true) i nowy wiersz w skrypcie, stąd /2.

Wypróbuj online!

Funkcja Gamma
źródło
0

Skrypt rdzy / ładunku, 283 bajty

Oneliner:

use std::fs::File;use std::io::Write;fn main(){let c=     0; let mut v = vec![];::std::io::Read::read_to_end(&mut File::open("w").unwrap(),&mut v);let mut q=&mut File::create("w").unwrap();q.write(&v[..53]);q.write(format!("{:6}",c+1).as_bytes());q.write(&v[59..]);println!("{}",c);}

Zapisz jako wi uruchom z cargo-script:

$ cargo-script script w
   Compiling w v0.1.0 (file:///home/vi/.cargo/script-cache/file-w-b4d6541706fabb11)
    (warnings skipped...)
    Finished release [optimized] target(s) in 1.47 secs
0
$ cargo-script script w
    (compilation output skipped)
1
$ cargo-script script w
...
2
$ cargo-script script w 2> /dev/null
3
$ cargo-script script w 2> /dev/null
4
$ cargo-script script w 2> /dev/null
5
$ cargo-script script w 2> /dev/null
6
$ cargo-script script w 2> /dev/null
7
$ cargo-script script w 2> /dev/null
8
$ cargo-script script w 2> /dev/null
9
$ cargo-script script w 2> /dev/null
10
$ cargo-script script w 2> /dev/null
11

Nie powtarzaj zbyt szybko, bo utknie .

Częściowo niestrzeżony:

use std::fs::File;use std::io::Write;fn main(){let c=     0;
    let mut v = vec![];
    ::std::io::Read::read_to_end(&mut File::open("w").unwrap(),&mut v);
    let mut q = &mut File::create("w").unwrap();
    q.write(&v[..53]);
    q.write(format!("{:6}",c+1).as_bytes());
    q.write(&v[59..]);
    println!("{}", c);
}

Zepsuje się po 99999;

Vi.
źródło
0

GNU sed, 13 + 1 (flaga n) = 14 bajtów

$=;$eecho>>s

Uruchom: sed -nf ss

Zakłada się, że nazwa pliku źródłowego jest nazywana s. Końcowy znak nowej linii jest potrzebny po kodzie, który został policzony w bajtach ogółem. Wyjaśnienie:

$=           # print the number of lines of the input file
$eecho>>s    # a shell echo call that appends an empty line to the source file 's'
seshoumara
źródło