Dicas de golfe em PHP: Leitura / gravação de arquivos e a CLI


8

Tenho participado de vários desafios de golfe com códigos PHP recentemente e algumas das técnicas usadas para ler dados de um arquivo como fopen()e / fread()ou file_get_contents()realmente dão ao meu código uma batida na contagem de caracteres. Especialmente os métodos fornecidos para leitura na entrada da linha de comando.

Minha pergunta é: qual é a maneira mais rápida (menos pressionamentos de teclas) de ler e gravar no conteúdo de um arquivo e qual é a maneira mais rápida (menos pressionamentos de teclas) de ler uma linha no prompt?

(Nota: Como se trata de código golf, não posso usar nenhuma biblioteca externa.)

Respostas:


6

Você pode ler uma linha de STDIN13 caracteres:

fgets(STDIN);

como visto aqui .

Lendo de um arquivo:

file('filename')

retorna uma matriz de linhas do arquivo .

Usar em fputsvez de fwritesalvará um personagem na escrita, mas não consigo pensar em uma maneira mais curta do que:

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

que é marginalmente mais curto que:

file_put_contents('filename');

Ótimo! Você tem algum conselho sobre como gravar em um arquivo?
Dan Prince

@ DanPrince Eu adicionei um pouco na escrita. Não posso ver nada mais curto nisso no momento.
Gareth

6

Dependendo do formato de entrada, o fgetcsv e o fscanf também podem ser economizadores de bytes.

Por exemplo, suponha que cada linha da sua entrada consista em dois números inteiros separados por espaço. Para ler esses valores em uma matriz, você pode usar um dos seguintes:

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

Ou se você quiser ler cada um deles em uma variável 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

0

Para ler arquivos não físicos (entrada de leitura)

Se você tiver uma entrada de linha única, use -Fe $argnpara ler em STDIN. Isso é apenas 5 bytes e muito mais curto que outros métodos.

Exemplo: Experimente online!

Basicamente, -Fexecuta seu código uma vez para cada linha da entrada e preenche $argna sequência dessa linha de entrada. Mais informações: https://www.php.net/manual/en/features.commandline.options.php


Se você tiver uma entrada com várias linhas, use $argv. $argvé uma matriz que, a partir do índice, 1contém todos os argumentos que você passa para o seu código. Então você pode usar $argv[1]e assim por diante, que tem apenas 8 bytes. Você também pode passar vários argumentos e fazer um loop neles com os for(;$a=$argv[++$i];)quais geralmente é mais curto que outros métodos.

Exemplo 1: Experimente online!

Exemplo 2: Experimente online!

Mais informações: https://www.php.net/manual/en/reserved.variables.argv.php

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.