Consejos de golf PHP: lectura / escritura de archivos y CLI

8

He participado en un número de código PHP de golf retos recientemente y algunas de las técnicas que se utilizan para leer datos de un archivo, como fopen()y fread(), o file_get_contents()realmente dar mi código de una paliza en el recuento de carbón. Especialmente los métodos proporcionados para leer en la entrada de línea de comando.

Mi pregunta es, ¿cuál es la forma más rápida (menos pulsaciones de teclas) para leer y escribir en el contenido de un archivo, y cuál es la forma más rápida (menos pulsaciones de teclas) para leer una línea desde el indicador?

(Nota: como se trata de código golf, no puedo usar ninguna biblioteca externa).

Dan Prince
fuente

Respuestas:

6

Puede leer una línea de STDIN13 caracteres:

fgets(STDIN);

como se ve aquí .

Lectura de un archivo:

file('filename')

devuelve una matriz de líneas del archivo .

Usar en fputslugar de fwriteahorrará un carácter al escribir, pero no puedo pensar en una forma más corta que:

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

que es marginalmente más corto que:

file_put_contents('filename');
Gareth
fuente
¡Excelente! ¿Tienes algún consejo para escribir en un archivo?
Dan Prince
@DanPrince He agregado un poco en la escritura. Sin embargo, no puedo ver nada más corto en este momento.
Gareth
6

Dependiendo del formato de entrada, fgetcsv y fscanf a menudo también pueden ser protectores de bytes.

Por ejemplo, suponga que cada línea de su entrada consta de dos enteros separados por espacios. Para leer estos valores en una matriz, puede usar uno de:

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

O si desea leer cada uno de ellos en una variable diferente:

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
fuente
0

Para leer archivos no físicos (lectura de entrada)

Si tiene una sola entrada de línea, use -Fy $argnpara leer desde STDIN. Esto es solo 5 bytes y mucho más corto que otros métodos.

Ejemplo: ¡ Pruébelo en línea!

Básicamente -Fejecuta su código una vez para cada línea de la entrada y llena la $argncadena de esa línea de entrada. Más información: https://www.php.net/manual/en/features.commandline.options.php


Si tiene una entrada de varias líneas, use $argv. $argves una matriz que a partir del índice 1contiene todos los argumentos que pasa a su código. Entonces puede usar $argv[1]y así sucesivamente, que son solo 8 bytes. También puede pasar varios argumentos y recorrerlos con lo for(;$a=$argv[++$i];)que generalmente es más corto que otros métodos.

Ejemplo 1: ¡ Pruébelo en línea!

Ejemplo 2: ¡ Pruébelo en línea!

Más información: https://www.php.net/manual/en/reserved.variables.argv.php

Noche2
fuente