[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
- 上一篇 »css排版之-标准文档流
- 下一篇 »在PHP中利用wsdl创建标准webservice