PHP-Golftipps: Lesen / Schreiben von Dateien und der CLI


8

Ich habe in einer Reihe von PHP - Code Golf teilnehmend Herausforderungen vor kurzem und einige der Techniken , die verwendet werden , um Daten aus einer Datei zu lesen, wie fopen()und fread()oder file_get_contents()meinem Code auf der char Zählung ein Schlagen wirklich geben. Insbesondere die Methoden zum Einlesen der Befehlszeileneingabe.

Meine Frage ist, was ist der schnellste Weg (am wenigsten Tastenanschläge), um den Inhalt einer Datei zu lesen und zu schreiben, und was ist der schnellste Weg (am wenigsten Tastenanschläge), um eine Zeile von der Eingabeaufforderung zu lesen?

(Hinweis: Da dies Code Golf ist, kann ich keine externen Bibliotheken verwenden.)

Antworten:


6

Sie können eine Zeile STDINmit 13 Zeichen lesen :

fgets(STDIN);

wie hier gesehen .

Lesen aus einer Datei:

file('filename')

Gibt ein Array von Zeilen der Datei zurück .

Wenn Sie fputsanstelle von verwenden, fwritewird beim Schreiben ein Zeichen gespeichert, aber ich kann mir keinen kürzeren Weg vorstellen als:

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

das ist etwas kürzer als:

file_put_contents('filename');

Großartig! Haben Sie Ratschläge zum Schreiben in eine Datei?
Dan Prince

@ DanPrince Ich habe ein bisschen zum Schreiben hinzugefügt. Ich kann im Moment nichts kürzeres sehen.
Gareth

6

Je nach Eingabeformat können fgetcsv und fscanf häufig auch Byte-Sparer sein.

Angenommen, jede Zeile Ihrer Eingabe besteht aus zwei durch Leerzeichen getrennten Ganzzahlen. Um diese Werte in ein Array einzulesen, können Sie Folgendes verwenden:

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

Oder wenn Sie jeden von ihnen in eine andere Variable einlesen möchten:

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

Nicht-physische Dateien lesen (Eingabe lesen)

Wenn Sie einen einzeiligen Eingang haben, verwenden Sie -Fund $argn, um aus STDIN zu lesen. Dies ist nur 5 Bytes und viel kürzer als andere Methoden.

Beispiel: Probieren Sie es online aus!

Grundsätzlich wird -FIhr Code einmal für jede einzelne Zeile der Eingabe ausgeführt und $argnmit einer Zeichenfolge dieser Eingabezeile gefüllt. Weitere Informationen: https://www.php.net/manual/en/features.commandline.options.php


Wenn Sie einen mehrzeiligen Eingang haben, verwenden Sie $argv. $argvist ein Array, das ausgehend vom Index 1alle Argumente enthält, die Sie an Ihren Code übergeben. Sie können also $argv[1]usw. verwenden, was nur 8 Bytes entspricht. Sie können auch mehrere Argumente übergeben und diese durchlaufen, for(;$a=$argv[++$i];)was normalerweise kürzer als bei anderen Methoden ist.

Beispiel 1: Probieren Sie es online aus!

Beispiel 2: Probieren Sie es online aus!

Weitere Informationen: https://www.php.net/manual/en/reserved.variables.argv.php

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.