[PHP] 巧思轻松描述标准输入和标准输出 [AtCoder]

介绍

用PHP解决AtCoder的时候,接收标准输入感觉很麻烦。但是,根据您的聪明才智,您将能够舒适地接收标准输入,因此我将总结其方法。 (顺便说一下,标准输出也被设计了一点。)

问题

练习 A - 欢迎来到 AtCoder

你得到一个整数 $a,b,c$ 和一个字符串 $s$。

并排显示$a+b+c$和字符串$s$的计算结果。

  • $1 le a,b,c le 1000$
  • $1 勒 |s| 勒 100$

标准输入

使用fgets 函数获得标准输入。

<?php

$line1 = fgets(STDIN); // 1行目を取得
$line2 = fgets(STDIN); // 2行目を取得
$line3 = fgets(STDIN); // 3行目を取得

var_dump($line1); // string(3) "1
"
var_dump($line2); // string(5) "2 3
"
var_dump($line3); // string(6) "test
"

fgets每次执行函数都可以接收到第一行、第二行等的标准输入。 STDIN 是标准输入文件指针。

现在,存在以下三个问题。

  • 包含尾随换行符
  • 第2行$b$和$c$值合并为一个字符串
  • 整数值的类型是string而不是int

因此,我们将把在这个标准输入中得到的字符串格式化成易于处理的形式。

首先,使用trim 函数删除尾随换行符。

<?php

$line1 = trim(fgets(STDIN)); // 1行目を取得
$line2 = trim(fgets(STDIN)); // 2行目を取得
$line3 = trim(fgets(STDIN)); // 3行目を取得

var_dump($line1); // string(1) "1"
var_dump($line2); // string(3) "2 3"
var_dump($line3); // string(4) "test"

trim 函数将删除字符串开头和结尾的空格(空格、换行符等)。我能够删除换行符。

然后使用explode函数在第二行分别检索$b$和$c$的值。

<?php

$line1 = trim(fgets(STDIN));               // 1行目を取得
$line2 = explode(' ', trim(fgets(STDIN))); // 2行目を取得
$line3 = trim(fgets(STDIN));               // 3行目を取得

var_dump($line1); // string(1) "1"
var_dump($line2); // array(2) { [0] => string(1) "2" [1] => string(1) "3" }
var_dump($line3); // string(4) "test"

explode 函数将分隔符指定为第一个参数,将要拆分的字符串指定为第二个参数。通过这样做,您可以将每个分隔符拆分的字符串作为一个数组。

最后,将第一行和第二行中的$a,b,c$转换为int类型投掷array_map 函数。

<?php

$line1 = (int)trim(fgets(STDIN));                               // 1行目を取得
$line2 = array_map('intval', explode(' ', trim(fgets(STDIN)))); // 2行目を取得
$line3 = trim(fgets(STDIN));                                    // 3行目を取得

var_dump($line1); // int(1)
var_dump($line2); // array(2) { [0] => int(2) [1] => int(3) }
var_dump($line3); // string(4) "test"

我对单个值使用强制转换,对数组使用array_map 函数。 Cast 可以通过在值前写入(int) 转换为int 类型。此外,通过将'intval' 指定为第一个参数并将数组指定为第二个参数,array_map 函数可以将数组的每个元素转换为 int 类型。

类型转换有两个优点:

  • 避免了由于类型的自动转换而导致的意外错误重复
  • 类型自动转换时,只需要在接收到标准输入时进行一次。

好吧,仅此一项就使标准输入更易于处理,但是每次都编写这些描述很麻烦。因此,从这里开始,我们将通过以下两个技巧使其变得更容易。

  • 功能化
  • 使用list

首先,运行接收标准输入的进程。

<?php

function strings() { return explode(' ', trim(fgets(STDIN))); }
function ints() { return array_map('intval', strings()); }
function doubles() { return array_map('doubleval', strings()); }

$line1 = ints();    // 1行目を取得
$line2 = ints();    // 2行目を取得
$line3 = strings(); // 3行目を取得

var_dump($line1); // array(1) { [0] => int(1) }
var_dump($line2); // array(2) { [0] => int(2) [1] => int(3) }
var_dump($line3); // array(1) { [0] => string(4) "test" }

我创建了 3 个函数。每个过程如下。

  • strings:接收一行标准输入为字符串类型
  • ints:接收一行标准输入为int类型
  • doubles:以double类型接收一行标准输入

    * 全部作为一个数组接收,其元素是用空格分隔的字符串。

只有这些函数,当你想接收数组以外的值时,你会遇到麻烦。所以,我们使用list语言构造,将得到的数组值赋给每个变量。

<?php

function strings() { return explode(' ', trim(fgets(STDIN))); }
function ints() { return array_map('intval', strings()); }
function doubles() { return array_map('doubleval', strings()); }

list($a)     = ints();    // 1行目を取得
list($b, $c) = ints();    // 2行目を取得
list($s)     = strings(); // 3行目を取得

var_dump($a); // int(1)
var_dump($b); // int(2)
var_dump($c); // int(3)
var_dump($s); // string(4) "test"

有了这个,现在可以处理当您想要接收数组以外的值时。我认为接收标准输入变得非常容易。

标准输出

标准输出基本上使用echo 语言结构。

<?php

function strings() { return explode(' ', trim(fgets(STDIN))); }
function ints() { return array_map('intval', strings()); }
function doubles() { return array_map('doubleval', strings()); }

list($a)     = ints();    // 1行目を取得
list($b, $c) = ints();    // 2行目を取得
list($s)     = strings(); // 3行目を取得

echo $a + $b + $c, ' ', $s, "
"; // 出力

echo可以通过排列逗号分隔的值来输出每个值。常量PHP_EOL 可用于换行符,但使用 更快,因为没有处理来引用该值。

但是,就这样,每次都输入半角空格和换行符是很麻烦的。所以让我们为标准输出创建一个方便的函数。

<?php

function strings() { return explode(' ', trim(fgets(STDIN))); }
function ints() { return array_map('intval', strings()); }
function doubles() { return array_map('doubleval', strings()); }
function o(...$args) { echo implode(' ', $args), "
"; }

list($a)     = ints();    // 1行目を取得
list($b, $c) = ints();    // 2行目を取得
list($s)     = strings(); // 3行目を取得

o($a + $b + $c, $s); // 出力

我为标准输出创建了一个函数o...$args 参数是可变长度参数,可以指定任意数量的参数。指定的参数作为数组传递给$args

函数o 使用implode 函数。 implode 是一个函数,通过将分隔符指定为第一个参数并将数组指定为第二个参数,可以获取将数组的每个值与分隔符组合在一起的字符串。所以o输出由空格分隔的参数值并在末尾输出换行符的函数将会

模板

最后创建一个模板。每次写代码都要创建上面的函数会比较麻烦,所以提前准备好模板比较方便。

<?php

function strings() { return explode(' ', trim(fgets(STDIN))); }
function ints() { return array_map('intval', strings()); }
function doubles() { return array_map('doubleval', strings()); }
function o(...$args) { echo implode(' ', $args), "
"; }

function main() {

}

main();

这是个人喜好,但我认为如果创建main函数并在其中编写处理更容易。

基于模板,此问题的代码如下所示:

示例代码

<?php

function strings() { return explode(' ', trim(fgets(STDIN))); }
function ints() { return array_map('intval', strings()); }
function doubles() { return array_map('doubleval', strings()); }
function o(...$args) { echo implode(' ', $args), "
"; }

function main() {

        list($a)     = ints();    // 1行目を取得
        list($b, $c) = ints();    // 2行目を取得
        list($s)     = strings(); // 3行目を取得

        o($a + $b + $c, $s); // 出力
}

main();

概括

  • 标准输入问题
    • 尾随换行符:trim 函数删除换行符
    • 多个值合并为一个字符串:explode将空格分隔的字符串转换为元素为的数组
    • 所有类型均为字符串类型:使用强制类型转换和array_map 函数进行类型转换
  • 标准输入的独创性
    • 功能化减少描述量
    • 使用list接收数组以外的值
  • 别出心裁的标准输出
    • 制作函数,使换行符自动包含在末尾
    • 使用可变长度参数允许在由空格分隔的单行上输出字符

原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308629172.html