Mẹo chơi gôn PHP: Đọc / ghi tệp và CLI


8

Tôi đã được tham gia vào một số mã golf PHP thách thức thời gian gần đây và một số kỹ thuật được sử dụng để đọc dữ liệu từ một tập tin như fopen()fread()hay file_get_contents()thực sự cung cấp cho mã của tôi một đập vào số char. Đặc biệt là các phương pháp được cung cấp để đọc trong đầu vào dòng lệnh.

Câu hỏi của tôi là, cách nhanh nhất (ít nhất là gõ phím) để đọc và ghi vào nội dung của tệp và cách nhanh nhất (ít nhất là gõ phím) để đọc một dòng từ dấu nhắc là gì?

(Lưu ý: Vì đây là mã golf, tôi không thể sử dụng bất kỳ thư viện bên ngoài nào.)

Câu trả lời:


6

Bạn có thể đọc một dòng từ STDIN13 ký tự:

fgets(STDIN);

như đã thấy ở đây .

Đọc từ một tập tin:

file('filename')

trả về một mảng các dòng của tập tin .

Sử dụng fputsthay vì fwritesẽ tiết kiệm một ký tự bằng văn bản, nhưng tôi không thể nghĩ ra một cách ngắn hơn:

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

ngắn hơn một chút so với:

file_put_contents('filename');

Tuyệt quá! Bạn có lời khuyên nào về việc viết vào một tập tin không?
Dan Prince

@DanPrince Tôi đã thêm một chút về văn bản. Không thể nhìn thấy bất cứ điều gì ngắn hơn về điều đó vào lúc này.
Gareth

6

Tùy thuộc vào định dạng đầu vào, fgetcsvfscanf thường có thể là trình tiết kiệm byte.

Ví dụ: giả sử mỗi dòng đầu vào của bạn bao gồm hai số nguyên cách nhau. Để đọc các giá trị này thành một mảng, bạn có thể sử dụng một trong:

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

Hoặc nếu bạn muốn đọc từng biến thành một biến khác nhau:

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

0

Để đọc các tệp phi vật lý (đọc đầu vào)

Nếu bạn có một đầu vào dòng đơn, hãy sử dụng -F$argnđọc từ STDIN. Đây chỉ là 5 byte và ngắn hơn rất nhiều so với các phương thức khác.

Ví dụ: Hãy thử trực tuyến!

Về cơ bản -Fchạy mã của bạn một lần cho mỗi dòng đầu vào và điền $argnvào chuỗi của dòng đầu vào đó. Thêm thông tin: https://www.php.net/manual/en/features.commandline.options.php


Nếu bạn có một đầu vào nhiều dòng, sử dụng $argv. $argvlà một mảng bắt đầu từ chỉ mục 1chứa tất cả các đối số bạn truyền vào mã của mình. Vì vậy, bạn có thể sử dụng $argv[1]và chỉ có 8 byte. Bạn cũng có thể truyền nhiều đối số và lặp lại chúng với các đối for(;$a=$argv[++$i];)số thường ngắn hơn các phương thức khác.

Ví dụ 1: Hãy thử trực tuyến!

Ví dụ 2: Hãy thử trực tuyến!

Thêm thông tin: https://www.php.net/manual/en/reserved.variabled.argv.php

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.