Kiat bermain golf PHP: Membaca / menulis file dan CLI

8

Saya telah berpartisipasi dalam sejumlah tantangan kode PHP golf baru-baru ini dan beberapa teknik yang digunakan untuk membaca data dari file seperti fopen()dan fread()atau file_get_contents()benar - benar memberikan pemukulan kode saya pada hitungan char. Terutama metode yang disediakan untuk membaca di input baris perintah.

Pertanyaan saya adalah, apa cara tercepat (paling tidak menekan tombol) untuk membaca dan menulis ke isi file, dan apa cara tercepat (paling tidak menekan tombol) untuk membaca baris dari prompt?

(Catatan: Karena ini golf kode, saya tidak bisa menggunakan perpustakaan eksternal.)

Dan Prince
sumber

Jawaban:

6

Anda dapat membaca satu baris STDINdalam 13 karakter:

fgets(STDIN);

seperti yang terlihat di sini .

Membaca dari file:

file('filename')

mengembalikan array baris file .

Menggunakan fputsalih-alih fwriteakan menghemat karakter dalam menulis, tetapi saya tidak bisa memikirkan cara yang lebih pendek daripada:

fputs(fopen('filename','w')); //use 'a' if you're appending to a file instead of overwriting

yang sedikit lebih pendek dari:

file_put_contents('filename');
Gareth
sumber
Bagus! Apakah Anda punya saran untuk menulis ke file?
Dan Prince
@DanPrince Saya telah menambahkan sedikit pada tulisan. Tidak dapat melihat sesuatu yang lebih pendek pada saat ini.
Gareth
6

Bergantung pada format input, fgetcsv dan fscanf juga dapat menjadi byte saver.

Misalnya, anggap setiap baris input Anda terdiri dari dua bilangan bulat yang dipisahkan spasi. Untuk membaca nilai-nilai ini ke dalam array, Anda bisa menggunakan salah satu dari:

$x=split(' ',fgets(STDIN)); // 27 bytes
$x=fgetcsv(STDIN,0,' ');    // 24 bytes
$x=fscanf(STDIN,'%d%d');    // 24 bytes

Atau jika Anda ingin membacanya masing-masing ke dalam variabel yang berbeda:

list($a,$b)=split(' ',fgets(STDIN)); // 36 bytes
list($a,$b)=fgetcsv(STDIN,0,' ');    // 33 bytes
fscanf(STDIN,'%d%d',$a,$b);          // 27 bytes
primo
sumber
0

Untuk membaca file non-fisik (baca input)

Jika Anda memiliki satu input baris, gunakan -Fdan $argnbaca dari STDIN. Ini hanya 5 byte dan jauh lebih pendek dari metode lain.

Contoh: Coba online!

Pada dasarnya -Fjalankan kode Anda sekali untuk setiap baris input dan isi $argndengan string dari baris input tersebut. Informasi lebih lanjut: https://www.php.net/manual/en/features.commandline.options.php


Jika Anda memiliki input multi jalur, gunakan $argv. $argvadalah array yang dimulai dari indeks 1berisi semua argumen yang Anda berikan ke kode Anda. Jadi Anda bisa menggunakan $argv[1]dan sebagainya, yang hanya 8 byte. Anda juga dapat melewati beberapa argumen dan mengulanginya dengan for(;$a=$argv[++$i];)yang biasanya lebih pendek dari metode lain.

Contoh 1: Cobalah online!

Contoh 2: Cobalah secara online!

Informasi lebih lanjut: https://www.php.net/manual/en/reserved.variables.argv.php

Night2
sumber