Sayıları Artırma, Birden Çok Oturum


30

İyi Akşamlar Golf Ajanları,

Göreviniz ünlü eğlence devi Eviltronic Arts adına. Dünya köleleştirme ve eğlence konusundaki nefret dolu planlarının bir parçası olarak, mümkün olduğu kadar çok SimStation V kopyası satmaları gerekir. Bu, yazılımın birkaç kez başlattıktan sonra gizemli bir şekilde çalışmayı durdurması gerektiği anlamına gelir.

Amacınız, çalıştırılma sayısını sayan bir program yazmaktır. Program başka bir şey yapmamalı, sonra tamsayıyı stdout'a yazmalıdır. İlk çalıştırıldığında "1" döndürmelidir. Bir sonraki "2" vb. Programın en azından "14" sayısına ulaşması gerekir, ancak gerekli bir üst sınır yoktur.

Ancak, programınız yeni dosyalar yazmamalıdır. Kendisine, kayıt defterine, hatta internete erişmek kesinlikle sorun değil. Ancak, kullanıcılarımızdan bazıları yeni dosyalardan şüpheleniyor ve yalnızca üzerine yazacak! Sinir! Yasal olarak satın aldıkları yazılımlardaki sınırlamaları aşmak!

Program kararlı bir tercüman veya kabuk kabul edemez - tüm tercüman ve tüm bilgisayarların çalıştırılması arasında yeniden başlatılması durumunda program hala çalışmalıdır.

Olabildiğince tespit edilememesi gerektiğinden, en kısa kaynak kodu kazanacaktır.

İyi şanslar ajanlar. Eğlence endüstrisi size güveniyor.


Yanıtlar:


21

bash betiği, 39 , 37 , 21 18

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

Kısa ve tatlı, kod golf ilk gönderim :)


1
Değiştir echoile id: D
thejh


Ha? Burada stderr ile etkileşime giren hiçbir şey yok. Ancak doğru, dosyanın zamanla daha da büyümesini sağlar.
thejh

17'ye kadar golf oynayabilir: Newline ile değiştirin ;ve takip eden newline'ı kaldırın. Hatta çok daha güzel görünecek :-)
Tomas

Komut dosyasının yalnızca başlangıç ​​boyutu alakalı mı? Bunun her koşunun boyutunda artacağını düşünün.
unclemeat

18

Python, 40 , 39 , 38 karakter

Ayrıca çalışma zamanında böyle bir üst sınır yoktur:

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

Gördüğünüz gibi programın boyutu yavaş yavaş artıyor, ancak asıl problemde böyle bir kısıtlama yoktu. Gönderilen programın büyüklüğünün önemli olduğuna inanıyorum


Senin koymak zorunda olduğunu sanmıyorum a+, aiyi çalışmalı.
beary605

@ beary605: Tavsiyen için Teşekkürler
Abhijit

10

PHP 48 bayt

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

Basit, kendini değiştiren bir yaklaşım. 99 kez çalıştırdıktan sonra, olağanüstü çökecektir.

$ 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

Tek boşluk gereksiz mi?
John Dvorak

1
@JanDvorak Programdaki tek boşluk gerekli, aksi halde teknik özelliklere uymayan 10 uygulamadan sonra çökecek. 100. yürütmeden sonra, noktalı virgül üzerine yazılır ve bu da sözdizimi hatasına neden olur.
primo

Var 35 karakter için PHP çözüm , beni yendi ister misin? :)
Tomas


5

Yakut: 31 21 karakter

(Bu bir yeniden yazılmış halidir Abhijit 'ın Python çözümü . Eğer baz fikir gibi Eğer benim yaptığım gibi, onun cevabını upvote.)

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

Örnek çalışma:

bash-4.2$ ruby increment.rb 
1

bash-4.2$ ruby increment.rb 
2

bash-4.2$ ruby increment.rb 
3

1
Kullanarak <<bazı karakterleri kaydedebilirsiniz: `open (0 $
,?

Hamuru. Veri dosyalarının kapatılmasını sağlama alışkanlığının en iyisi… :( Thank you, @steenslag.
manatwork

5

* sh, 17

curl -L x.co/z7Uk

Bir web servisi kullanarak, şu ana kadar mevcut olan diğer çözümlerden farklı bir yaklaşım. Limit: Makinemin hafızası.


JavaScript, 40

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

Bir program olarak sayılmaz, ama yine de çok uzun. Yerel bir dosyada Firefox'ta çalışmıyor. Sınır: 2 ^ 31.


Neden alert(localStorage.a=~~localStorage.a+1)41 olmasın ve teknik olarak javascript programı konuşuyorken sadece 33 olan script etiketleri olmadan olacaktı
David Mulder

@DavidMulder Oh, sağ
kopyalayın

2
33'e kadar:alert((l=localStorage).a=~~l.a+1)
nitro2k01 31:13

@ nitro2k01: Yanlış şeyler kopyaladığım görülüyor, çünkü O hakkında konuştuğum 33 kişiydi :) 41 senaryo etiketleri de dahil olmak üzere aynı şeydi ~ (uyarıdan önce bildirimi yaptım, çünkü bu kadardı: a=localStorage;alert(a.b=~~a.b+1)seninki kadar) daha güzel görünüyor: D
David Mulder

1
@WallyWest Hayır, aslında bitsel ters çevirir ve JavaScript'in tuhaf tür dönüştürme kurallarını kötüye kullanır
kopyalayın

4

PHP 31 37 karakter

Kendini değiştirme. Tekdüze sayar. Metin düzenleyicinizin yardımcı olmaya çalışmadığından ve 1'den sonra yeni bir satır karakteri girmediğinden emin olun. Yalnızca PHP <5.3.2'de (düzgün) çalışacaktır çünkü kapatma sırasında açık dosya tanımlayıcılarını kapatmak için php'ye dayanmaktadır. Veya dosya tanımlayıcılarını sızdırmak kabul edilebilir mi?

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

Orijinal sürüm (36 karakter), tüm PHP sürümleri:

<?file_put_contents(__FILE__,1,8)?>1

2
"Bu unary sayılır" ... Uzun zamandır gördüğüm en iyi Golf Hack!
lochok

Sana meydan okuyorum. 35 karakter için PHP çözümü ve
Tomas

1
Vay canına, beni kendi yöntemlerinle yendiğini görüyorum! Tebrikler! :-) Ve yöntemimin gelişimi için teşekkürler. Cevabımı ekledim ve size bunun için bir kredi verdim.
Tomas

@ Tomlar size borçluyum. Bana meydan okumasaydın, bu cevaba tekrar bakmazdım.
Tim Seguine

Tim, bu tam olarak birbirimize meydan okumaktan neşe ve heyecan! :)
Tomas

2

Python, 50

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

Primo'nun cevabıyla aynı yaklaşımı kullanır ve 100. turda da benzer şekilde çöker.


2

J (58)

Bunu bir komut dosyası olarak çalıştırmanız gerekiyor, açıkça J komut satırından çalışmayacak.

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

J'de, tercümanın kullandığı belirteç, ;:işlev olarak kullanılabilir; bu nedenle xJ kodu varsa ;:x, J belirteçlerini içerir, yani:

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

Yani:

  • echo m=.1: m1 olarak ayarlayın ve ekrana yazın
  • k=.1{ARGV: içinde 2. elemanı ARGV(script ismi) içinde sakla k.
  • ... 1!:2[k: aşağıdaki dizeyi dosyaya yazın k:
  • ;:1!:1[k: oku k, geçerli betiği ve tokenize
  • (<":m+1)(<3)}: 3. simgeyi dize temsili ile değiştirin m + 1
  • ;:^:_1: bir dizge oluşturarak tokenizer'ı tersten çalıştırın
  • exit: tercümandan çıkın (bir script çalıştırsanız bile bunu kendisi yapmaz)

2

PHP, 34 33 karakter

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

Güncelleme için Tim'e teşekkürler! Eski çözümüm:

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

Sorun olduğunu $_SESSION[A]olduğunu ""- boş dize - birinci tekrarda, ancak session_start()getiri 1, onu ekleyebilir ve tek seferde iki ya da üç sinekleri öldürmek!

Doğru sözdizimi ile çözüm (35 karakter):

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

İki nedenden ötürü bir saniyeliğine karar vereceğim. "Ancak, programınız herhangi bir yeni dosya yazmamalıdır.": Bir oturum açmak geçici bir dosya oluşturduğundan, bunun bu çözüm için bir sorun olup olmadığından emin değilim. Ayrıca, varsayılan oturum gc 24 dakika sonra gerçekleşir. Bu gerçekten “çoklu seanslar” olarak sayılıyor mu? Belki OP yorum yapabilir.
Tim Seguine

Tim, program hiç dosya yazmıyor. Tercümanın yaptıklarından sorumlu değilim. HTML sayfası ile aynı tarayıcıda önbellekte bazı dosyalar oluşturmaktan sorumlu değildir, sql sorgusu diskte oluşturulan geçici tablolar için sorumlu değildir. Zaman aşımı için olduğu gibi, kurallarda belirtilmemiştir :) Neyse, değilim neden emin değilim ama makinemde tezgah hala birkaç saatten fazla duruyor !!!
Tomas

Evet, bu yüzden OP'nin ne düşündüğünü görmek için bekleyeceğimi söylüyorum. Kesinlikle çok gri bir alan buldun. Btw kapanış php etiketine ihtiyacınız yok. bu yüzden 34 char sürümü yeterli. Bir gelişme için bir fikrim var, ama önce test etmem gerekecek.
Tim Seguine

Tamam, 33 karaktere indirdim. Daha iyisini yapmana cüret ediyorum. ;)
Tim Seguine

@TimSeguine Aaaah, tonunuzda ne değişiklik var! :-) Artık yazımdaki kuralları umursamıyorsun! :-D
Tomas

2

Haskell - 36 bayt

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

Basitçe +1adlandırıldığı varsayılan kaynak dosyanın sonuna eklenir a.hs. .hsUzatma ghc ve GHCi hem de zorunludur.



1

Toplu iş - 41

Örnek kullanım durumu göz önüne alındığında, muhtemelen bu tekniğin uygulanabilir bir yöntem olduğunu varsaymıyorum - Bu betiği içeren .bat dosyasını yeniden adlandırır -

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

Bunu denilen bir dosyaya kaydedin 0.bat- ve kullanarak arayın 0.bat 2>nul. 2>nulstderr'i nul'e yönlendirir, çünkü bu script, betiği içeren dosyayı yeniden adlandırır, bir kez cmd açıkça betiği göremez (EOF'a basmadan önce) ve hatayı döndürür.The batch file cannot be found.

Her komut dosyası ardışık çağrı elbette olacak 1.bat 2>nul ... 2.bat 2>nul ... 3.bat 2>nul ... etc ...


Bu fikre dayanarak, php cevabımın unary sayma yanıtımın bir çeşitlemesini yapabilirsiniz ve bundan daha da kısa olduğunu düşünüyorum.
Tim Seguine

1

mIRC betiği, 28/22 bayt

"Takma adlar" sekmesine girilirse, "takma ad", 22 bayt atlanabilir.

alias x inc %i | echo -ag %i

1

Python, 49 48 karakter

Bunun sadece Windows'ta 48 karakter olacağını fark ettim \r\n. Aksi takdirde 49 olmalıdır.

n=1

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

@Grc tarafından yöntemin ucuz bir dökümü


1

C, 190 Karakterler. Yalnızca Win NT'de çalışır

#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);
}

Nasıl çalıştığını oldukça basit düşünüyorum, ama yine de gerekirse bir açıklama ekleyebilirim :-)
Abhijit

1

C #, 142 karakter

int v=(Microsoft.Win32.Registry.CurrentUser.GetValue("c") as int?)??0+1;Console.Write(v);Microsoft.Win32.Registry.CurrentUser.SetValue("c",v);

Z gibi daha kısa bir ad kullanabilirsiniz, sizi bir kaç karakterden çeker.
değil.

Ayrıca boşlukları da kaldırmalısınız.
Timtech

1
Her seferinde uzun API adını aramak yerine, onu aşağıdaki gibi bir değişkende saklayın: var a = Microsoft.Win32.Registry.CurrentUser; a.GetValue (); a.SetValue ();
Xantix

1

Tcl, 63 veya 73 bayt

  • Bazı web servislerinde 73:

    package require http
    puts [set [http::geturl http://example.com/c](data)]
    
  • kendini değiştirmek 63:

    proc a a {puts [string le $a]};puts -nonewline [open $argv0 a] a; a a
    

1

C # - 201 239 234 karakter

İlk 255 kez çalışır, sonra 0'a kaydırılır. İlk çalıştırmada hiçbir şey çıkarmaz.

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);}}}

Main.cs olarak kaydedin, derleyin

gmcs Main.cs

Gmcs 2.10.8.1 ve Mono çalışma zamanı 2.10.8.1-5ubuntu2 ile test edilmiştir


1
Aslında ben yaptım. "Program en az 14 numaraya ulaşabilmelidir"
lochok

Şimdi 255 kez çalışıyor.
user3188175

1

Powershell, 47 Bayt

komut dosyasının adlandırıldığını varsayar a.ps1

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

Programın kendisini değiştirerek üzerine yazar 0ile ilk satırda 1, 2, 3vb.

Ayrıca her iki örneği replaceing başka 8 bayt kurtarabilecek a.ps1ile 1ve adında bir dosya olarak komut kurtaran 1bu biraz benim için uzaklarda olmasına rağmen.

Dosya 'a.ps1' olarak kaydedilmemişse, ikinci satırı bununla değiştirin.

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

0 sayımı başlatmak için ilk satırda

Linebreak, dosyayı ikiye bölmenin en kolay yolunu sunar

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

Bu dosya 'a.ps1' alır ve hatlarında bir dizi olarak okur, o zaman yineleme ile içinden [0..1]ve ayar bu değişkenler $nolarak atıldı [int]ve $tsırasıyla böylece 0ilk satırda olur $nve 'kod 'ikinci satırda olur$t

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

Bu, ,1,2dizi gösterimini, iki elemanlı bir dizi oluşturmak için kullandı; bunlardan biri $nönceden artmış olarak kaydedilmiş ve kapalı parantez kullanılarak stdout'a çıkarılan sayı , ikincisi dosyadan ikinci metin satırı ve sonra da çıktı. 'a.ps1' isimli dosyaya

Hem girdi hem de çıktı dizge dizileri olduğundan, asgari biçimlendirmeye gerek duyulur ve hemen hemen her şey yorumlayıcı tarafından kabul edilir.


1

Zsh (coreutils yok), 32 bayt

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

(Sondaki yeni satırı not edin) Komut dosyasının uzunluğunu kullanır. Her başvuruda, yukarıda gösterilen son satır , komut dosyasına yeni bir satır ekleyecektir :( truedolayısıyla aynıdır ) /2.

Çevrimiçi deneyin!


0

Pas / kargo-script, 283 bayt

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);}

Farklı kaydet wve çalıştır 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

Çok hızlı yinelemeyin yoksa sıkışır .

Kısmen ungolfed:

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);
}

99999'dan sonra kırılacak;


0

GNU sed, 13 + 1 (n bayrağı) = 14 bayt

$=;$eecho>>s

Çalıştır: sed -nf ss

Varsayım kaynak dosya adı olarak adlandırılır s. Toplam bayt olarak sayılan koddan sonra izleyen bir satırsonu gereklidir. Açıklama:

$=           # 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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.