Angka Bertambah, Lebih Dari Beberapa Sesi


30

Good Evening Golf Agents,

Misi Anda adalah atas nama raksasa hiburan terkenal Eviltronic Arts. Sebagai bagian dari rencana jahat mereka untuk perbudakan dan hiburan dunia, mereka harus menjual sebanyak mungkin salinan SimStation V. Ini berarti bahwa perangkat lunak harus berhenti bekerja secara misterius, setelah memulainya beberapa kali.

Tujuan Anda adalah menulis program yang menghitung berapa kali program itu dijalankan. Program harus melakukan apa pun selain menulis bilangan bulat ke stdout. Pertama kali dijalankan, seharusnya mengembalikan "1". "2" selanjutnya dan seterusnya. Program harus setidaknya dapat mencapai angka "14", tetapi tidak ada batas atas yang diperlukan.

Namun, program Anda tidak boleh menulis file baru. Mengakses sendiri, atau registri, atau bahkan internet sama sekali tidak masalah. Tetapi beberapa pengguna kami curiga terhadap file baru, dan hanya akan menimpanya! Saraf! Mengalahkan batasan pada perangkat lunak yang mereka beli secara sah!

Program tidak dapat menggunakan interpreter atau shell yang stabil - program tersebut masih harus bekerja jika seluruh komputer interpreter nay shell nay di-restart saat dijalankan.

Karena harus tidak terdeteksi mungkin, kode sumber terpendek akan menang.

Agen keberuntungan. Industri hiburan mengandalkan Anda.


Jawaban:


21

skrip bash, 39 , 37 , 21 18

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

Singkat dan manis, kiriman pertama saya di kode golf :)


1
Ganti echodengan id: D
thejh

itu menambahkan output yang tidak perlu ke file, yang akan diarahkan ke stderr
Rozuur

Hah? Di sini tidak ada yang berinteraksi dengan stderr. Tapi benar, itu membuat file tumbuh lebih besar dari waktu ke waktu.
thejh

dapat di-golf hingga 17: Ganti ;dengan newline dan hapus trailing newline. Bahkan akan terlihat jauh lebih baik :-)
Tomas

Apakah hanya ukuran awal skrip yang relevan? Mempertimbangkan bahwa ini akan bertambah besar setiap kali dijalankan.
hapus klasifikasi

18

Python, 40 , 39 , 38 karakter

Juga tidak ada batas atas pada runtime:

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

Seperti yang Anda lihat, ukuran program secara bertahap meningkat tetapi tidak ada batasan seperti itu dalam masalah aslinya. Saya percaya, ukuran dari program yang diajukan adalah yang terpenting


Saya tidak berpikir Anda perlu menempatkan a+, aharus bekerja dengan baik.
beary605

@ beary605: Terima kasih atas Tipnya
Abhijit

10

PHP 48 byte

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

Pendekatan modifikasi diri yang sederhana. Setelah berjalan 99 kali, itu akan crash dengan spektakuler.

$ 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

bukankah ruang putih tunggal tidak perlu?
John Dvorak

1
@ JanDvorak Ruang putih tunggal diperlukan dalam program ini, jika tidak maka crash hanya setelah 10 eksekusi, yang tidak memenuhi spesifikasi. Setelah eksekusi ke-100, titik koma ditimpa, yang menyebabkan kesalahan sintaksis.
Primo

Punya solusi PHP untuk 35 karakter , ingin mengalahkan saya? :)
Tomas


5

Ruby: 31 21 karakter

(Ini adalah penulisan ulang dari Abhijit 's solusi Python . Jika Anda menyukai ide dasar, upvote jawabannya, seperti yang kulakukan.)

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

Contoh dijalankan:

bash-4.2$ ruby increment.rb 
1

bash-4.2$ ruby increment.rb 
2

bash-4.2$ ruby increment.rb 
3

1
Menggunakan <<Anda dapat menyimpan beberapa karakter: `open ($ 0,? A) <<" + 1 "; p 1 \`
steenslag

Doh. Kebiasaan lama yang baik untuk memastikan file data ditutup ... :( Terima kasih, @steenslag.
manatwork

5

* sh, 17

curl -L x.co/z7Uk

Menggunakan layanan web, pendekatan yang berbeda dari solusi lain yang ada sejauh ini. Batas: Memori mesin saya.


JavaScript, 40

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

Hampir tidak dihitung sebagai sebuah program, tapi itu cukup lama. Tidak berfungsi di Firefox dalam file lokal. Batas: 2 ^ 31.


Mengapa tidak alert(localStorage.a=~~localStorage.a+1)41 dan secara teknis program javascript akan tanpa tag skrip yang hanya 33
David Mulder

@ Davidvidul Oh, benar
salin

2
Turun ke 33:alert((l=localStorage).a=~~l.a+1)
nitro2k01

@ nitro2k01: Sepertinya saya menyalin hal-hal yang salah, karena itu adalah 33 yang saya bicarakan O :) 41 adalah hal yang sama termasuk tag skrip ~ (well, saya melakukan decleration sebelum peringatan, karena itu sama saja lama: a=localStorage;alert(a.b=~~a.b+1)meskipun milikmu terlihat lebih baik: D
David Mulder

1
@WallyWest Tidak, ini sebenarnya membalikkan bitwise dan menyalahgunakan aturan konversi tipe aneh JavaScript
salin

4

PHP 31 37 karakter

Memodifikasi sendiri. Itu penting di unary. Berhati-hatilah karena editor teks Anda tidak berusaha membantu dan menyisipkan karakter baris baru setelah 1. Hanya akan berfungsi (dengan benar) dalam PHP <5.3.2 karena ia bergantung pada php untuk menutup deskriptor file yang terbuka saat shutdown. Atau dapatkah bocor deskriptor file?

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

Versi asli (36 karakter), semua versi PHP:

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

2
"Itu penting sekali ..." Peretasan Golf Terbaik yang pernah kulihat sejak lama!
lochok

Aku menantang kamu. Solusi PHP untuk 35 karakter , dan dalam desimal :)
Tomas

1
Wow, saya melihat Anda telah mengalahkan saya dengan metode Anda sendiri! Selamat! :-) Dan terima kasih untuk peningkatan metode saya. Saya telah memasukkannya dalam jawaban saya dan memberi Anda penghargaan untuk itu.
Tomas

@ Thomas Aku berhutang budi padamu. Jika Anda tidak menantangku, saya tidak akan melihat jawaban ini lagi.
Tim Seguine

Tim, itulah kegembiraan dan kegembiraan karena saling menantang! :)
Tomas

2

Python, 50

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

Ini menggunakan pendekatan yang sama seperti jawaban primo dan juga crash pada menjalankan ke-100.


2

J (58)

Anda perlu menjalankan ini sebagai skrip, itu tidak akan bekerja dari baris perintah J jelas.

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

Di J, tokenizer yang digunakan penerjemah tersedia sebagai ;:fungsi, jadi jika xberisi kode J, ;:xberisi token J, yaitu:

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

Begitu:

  • echo m=.1: set mke 1, dan tulis ke layar
  • k=.1{ARGV: simpan elemen ke-2 di ARGV(nama skrip) di k.
  • ... 1!:2[k: tulis string berikut ke file di k:
  • ;:1!:1[k: baca k, skrip saat ini, dan tokenize
  • (<":m+1)(<3)}: ganti token ke-3 dengan representasi string dari m + 1
  • ;:^:_1: jalankan tokenizer secara terbalik, menghasilkan string
  • exit: keluar dari juru bahasa (tidak melakukannya sendiri meskipun Anda menjalankan skrip)

2

PHP, 34 33 karakter

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

Terima kasih kepada Tim atas pembaruannya! Solusi lama saya:

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

Masalahnya adalah bahwa $_SESSION[A]adalah ""- string kosong - di iterasi pertama, tetapi sebagai session_start()hasil 1, Anda dapat menambahkannya dan membunuh dua atau tiga lalat dalam satu tembakan!

Solusi dengan sintaks yang benar (35 karakter):

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

Saya akan mengadakan penilaian sesaat karena dua alasan. "Namun, program Anda tidak boleh menulis file baru.": Saya tidak yakin apakah ini bukan masalah untuk solusi ini, karena membuka sesi membuat file sementara. Sesi default gc juga terjadi setelah 24 menit. Apakah itu benar-benar dihitung sebagai "lebih dari beberapa sesi"? Mungkin OP bisa berkomentar.
Tim Seguine

Tim, program ini tidak menulis file apa pun. Saya tidak bertanggung jawab atas apa yang dilakukan penerjemah. Itu sama dengan halaman HTML tidak bertanggung jawab untuk browser membuat beberapa file dalam cache, permintaan sql tidak bertanggung jawab untuk membuat tabel sementara pada disk dll. Adapun batas waktu, itu tidak ditentukan dalam aturan :) Pokoknya, saya tidak yakin kenapa tapi di mesin saya konter masih bertahan lebih dari beberapa jam !!!
Tomas

Ya, itu sebabnya saya mengatakan saya akan menunggu untuk melihat apa yang dipikirkan OP. Anda pasti menemukan area yang sangat abu-abu. Anda tidak perlu menutup tag php btw. jadi versi 34 char kamu sudah cukup. Saya punya ide untuk perbaikan, tetapi saya harus mengujinya terlebih dahulu.
Tim Seguine

Oke, saya turun ke 33 karakter. Saya berani Anda melakukan yang lebih baik. ;)
Tim Seguine

@TimSeguine Aaaah, betapa perubahan nada Anda! :-) Sekarang Anda tidak terlalu peduli dengan aturan di postingan saya! :-D
Tomas

2

Haskell - 36 byte

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

Cukup tambahkan +1ke akhir file sumber, yang dianggap bernama a.hs. The .hsekstensi adalah wajib di kedua GHC dan ghci.



1

Angkatan - 41

Dengan contoh use case saya mungkin tidak akan berasumsi bahwa teknik ini adalah yang layak - Ini mengubah nama file bat. Yang berisi skrip -

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

Simpan ini ke file yang disebut 0.bat- dan panggil menggunakan 0.bat 2>nul. 2>nulpengalihan stderr ke nul yang diperlukan karena skrip ini akan mengganti nama file yang berisi skrip, setelah itu cmd itu jelas tidak dapat lagi melihat skrip (sebelum hits EOF) dan akan mengembalikan kesalahanThe batch file cannot be found.

Setiap panggilan naskah yang berurutan tentu saja harus 1.bat 2>nul ... 2.bat 2>nul ... 3.bat 2>nul ... etc ...


Berdasarkan ide ini, Anda dapat melakukan variasi jawaban penghitungan php saya di unary dan saya pikir ini bahkan lebih pendek dari ini.
Tim Seguine

1

skrip mIRC, 28/22 byte

Jika dimasukkan ke tab "alias", "alias" dapat dihilangkan dengan membuat 22 byte.

alias x inc %i | echo -ag %i

1

Python, 49 48 karakter

Saya menyadari ini hanya akan menjadi 48 karakter pada Windows karena \r\n. Kalau tidak, harus 49.

n=1

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

Metode murah dari @grc


1

C, 190 Karakter. Hanya bekerja pada 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);
}

Saya pikir itu cukup sederhana bagaimana cara kerjanya, tetapi masih jika diperlukan saya dapat menambahkan penjelasan :-)
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);

Anda dapat menggunakan nama yang lebih pendek seperti z, membuat Anda memiliki beberapa karakter.
Notalie.

Anda juga harus menghapus spasi putih.
Timtech

1
Alih-alih memanggil nama API yang panjang setiap kali, simpan dalam variabel seperti: var a = Microsoft.Win32.Registry.CurrentUser; a.GetValue (); a.SetValue ();
Xantix

1

Tcl, 63 atau 73 byte

  • Dengan beberapa layanan web, 73:

    package require http
    puts [set [http::geturl http://example.com/c](data)]
    
  • memodifikasi sendiri adalah 63:

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

1

C # - 201 239 234 karakter

Bekerja untuk 255 kali pertama, lalu membungkus ke 0. Ini tidak akan menghasilkan apa pun pada eksekusi pertama.

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

Simpan sebagai Main.cs, kompilasi dengan

gmcs Main.cs

Diuji dengan gmcs 2.10.8.1 dan Mono runtime 2.10.8.1-5ubuntu2


1
Sebenarnya - saya lakukan. "Program ini setidaknya harus mencapai angka 14"
lochok

Ini berfungsi sekarang untuk 255 kali.
user3188175

1

Powershell, 47 Bytes

menganggap skrip dinamai a.ps1

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

Script akan menimpa dirinya mengganti 0pada baris pertama dengan 1, 2, 3dan sebagainya.

bisa juga menyimpan 8 byte lainnya dengan mengganti kedua contoh a.ps1dengan 1dan menyimpan skrip sebagai file bernama 1meskipun ini agak jauh bagi saya.

Ganti baris kedua dengan ini jika file tidak disimpan sebagai 'a.ps1'.

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

0 pada baris pertama untuk menginisialisasi hitungan

Linebreak menyediakan cara termudah untuk membagi file menjadi dua

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

ini mengambil file 'a.ps1' dan membacanya sebagai larik baris, kemudian kita mengulanginya dengan [0..1]dan mengaturnya ke variabel $nyang dilemparkan sebagai [int]dan $tmasing - masing, sehingga 0pada baris pertama menjadi $ndan kode ' 'Pada baris kedua menjadi$t

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

Ini menggunakan ,1,2notasi array, untuk membuat array dari dua elemen, satu menjadi nomor yang disimpan dalam $npra-kenaikan dan di-output ke stdout dengan menggunakan tanda kurung implisit, yang kedua adalah baris kedua teks dari file, dan kemudian juga output ke file bernama 'a.ps1'

karena input dan output adalah array dari string maka diperlukan pemformatan minimal, dan hampir semuanya diasumsikan oleh penerjemah.


1

Zsh (tanpa coreutils), 32 byte

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

(Perhatikan baris tambahan) Menggunakan panjang skrip. Pada setiap doa, baris terakhir yang ditunjukkan di atas akan menambahkan :(identik dengan true) dan baris baru ke skrip, karenanya /2.

Cobalah online!


0

Karat / skrip kargo, 283 byte

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

Simpan sebagai wdan jalankan dengan 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

Jangan beralih terlalu cepat atau itu akan macet .

Sebagian tidak diserang:

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

Akan pecah setelah 99999;


0

GNU sed, 13 + 1 (n flag) = 14 byte

$=;$eecho>>s

Jalankan: sed -nf ss

Asumsinya adalah nama file sumber dipanggil s. Newline tambahan diperlukan setelah kode, yang dihitung dalam total byte. Penjelasan:

$=           # 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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.