首页 后端开发 Python教程 火柴棍压缩

火柴棍压缩

Nov 25, 2024 pm 03:56 PM

Matchstick compression

每周挑战 296

穆罕默德·S·安瓦尔 (Mohammad S. Anwar) 每周都会发出“每周挑战”,让我们所有人都有机会为每周两次的任务提出解决方案。我的解决方案首先用Python编写,然后转换为Perl。这对我们所有人来说都是练习编码的好方法。

挑战,我的解决方案

任务 1:字符串压缩

任务

您将获得一串字母字符,$chars。

编写一个脚本,使用游程编码来压缩字符串,如示例所示。

压缩单元可以是单个字符,也可以是计数后跟一个字符。

奖励:编写一个解压缩函数。

我的解决方案

由于正则表达式的强大功能,这是一项非常简单的任务。 Python 和 Perl 都允许替换值是一个函数。因此,我有一个名为 sc 的函数,它将多个字母转换为数字和字母。例如如果输入是aaa,它将返回3a。

def sc(match):
    m = match.group(0)
    return str(len(m)) + m[0]
登录后复制
登录后复制

然后就是根据需要调用这个函数了。

def string_compress(s: str) -> str:
    return re.sub(r'(([a-z])+)', sc, s)
登录后复制
登录后复制

解压缩函数(仅限Python)以类似的方式工作。它采用数字后跟字母的模式,并将其更改为重复指定次数的字母。

def usc(match):
    m = match.group(0)
    return m[-1] * int (m[:-1])

def string_decompress(s: str) -> str:
    return re.sub(r'(\d+[a-z])', usc, s)
登录后复制
登录后复制

为了从命令行执行,我使用 argparse 模块来查看是否指定了 --decompress 选项。

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--decompress", help="decompress the input", action='store_true')
    parser.add_argument("str", help="the string to compress/decompress")
    args = parser.parse_args()

    if args.decompress:
        result = string_decompress(args.str)
    else:
        result = string_compress(args.str)
    print(result)
登录后复制

示例

$ ./ch-1.py abbc
a2bc

$ ./ch-1.py aaabccc
3ab3c

$ ./ch-1.py abcc
ab2c

$ ./ch-1.py --decompress a2bc
abbc

$ ./ch-1.py --decompress 3ab3c
aaabccc

$ ./ch-1.py --decompress ab2c
abcc
登录后复制

任务2:火柴方

任务

给你一个整数数组,@ints。

编写一个脚本来查找是否可以使用给定数组 @ints 中的棍子制作一个正方形,其中 $ints[ì] 是第 i 根棍子的长度。

我的解决方案

这会有点长,所以请系好安全带。我检查的第一件事是木棍的总和是否能被四整除。如果不是,没有可能的解决方案,我可以返回 false

我还可以检查没有一根棍子比一侧长。如果发生这种情况,我也会返回 false。

通过这两项检查,所有示例都会给出正确的结果。然而,它会错误地报告 4 3 3 3 3 为真,而实际上并非如此。

尝试二

查看示例和我自己的想法,我认为解决方案是匹配一对值来匹配每一侧。因此,对于示例 3 4 1 4 3 1,我们有两对 3 和 1 棍子,组成四根棍子。这将解决 4 3 3 3 3 问题,因为 3 没有匹配的。

但是如果棍子是 4 4 3 1 2 1 1,这将不起作用,因为一侧使用三根棍子(一根 2 和两根 1)

尝试三

所以我的下一次尝试有点复杂,我认为这是一个很好的解决方案......直到它不是。对于这次尝试,我从最长的棍子开始。如果不是边的长度,我就拿完成边所需的下一根最长的棍子,然后重复,直到没有可能的解决方案。使用此方法,以下解决方案是正确的。

  • 4 4 3 1 2 1 1
  • 9 5 4 3 3 3 3 3 3
  • 9 6 3 5 4 3 3 3
  • 9 6 3 5 4 3 3 2 1

我以为这就是解决方案,直到我意识到 9 5 3 1 5 2 2 3 3 3 不起作用。第一条边是 9,下一条边是 5 3 1,第三条边会失败,只有 5 3 而没有 1。

尝试四

此时,我开始怀疑是否有可能想出一个不涉及暴力的解决方案。所以我睡在上面,在平板电脑上写下了很多东西(我正在度假,所以不能使用我的白板),然后又睡在上面。我的结论是使用递归函数是唯一的解决方案。

也许我只是想太多了,或者也许有一个我刚刚想到的真正简单的解决方案(就像上周的情况)。

最终代码

还在读书吗?干得好:)

对于这个任务,我有一个名为 make_side 的递归函数。它需要一个剩余棍棒的列表(Perl 中的 arrayref)以及所需的长度。然后它会遍历剩余的棍子(首先是最高的)。然后发生以下三件事之一:

  • 如果棍子比要求的长度长,我会跳过它。
  • 如果是需要的长度,我就返回。
  • 如果它很短,我会使用它并再次调用该函数以使用另一根棍子。该调用会删除已使用的棍子,并根据已使用的棍子的长度减少所需的长度。

该函数将返回所使用的棍子列表,如果未找到有效的棍子组合,则返回 None(Perl 中的 undef)。

def sc(match):
    m = match.group(0)
    return str(len(m)) + m[0]
登录后复制
登录后复制

拼图的最后一块,我执行第一部分中提到的检查(总和可以被四整除,长度不能超过边长),然后调用上面的函数。如果返回 None,我返回 false。如果所有的棍子都被使用,我返回true。

def string_compress(s: str) -> str:
    return re.sub(r'(([a-z])+)', sc, s)
登录后复制
登录后复制

示例

def usc(match):
    m = match.group(0)
    return m[-1] * int (m[:-1])

def string_decompress(s: str) -> str:
    return re.sub(r'(\d+[a-z])', usc, s)
登录后复制
登录后复制

以上是火柴棍压缩的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1672
14
CakePHP 教程
1428
52
Laravel 教程
1332
25
PHP教程
1277
29
C# 教程
1257
24
Python与C:学习曲线和易用性 Python与C:学习曲线和易用性 Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

学习Python:2小时的每日学习是否足够? 学习Python:2小时的每日学习是否足够? Apr 18, 2025 am 12:22 AM

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Python vs.C:探索性能和效率 Python vs.C:探索性能和效率 Apr 18, 2025 am 12:20 AM

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

Python vs. C:了解关键差异 Python vs. C:了解关键差异 Apr 21, 2025 am 12:18 AM

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

Python标准库的哪一部分是:列表或数组? Python标准库的哪一部分是:列表或数组? Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

Python:自动化,脚本和任务管理 Python:自动化,脚本和任务管理 Apr 16, 2025 am 12:14 AM

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

科学计算的Python:详细的外观 科学计算的Python:详细的外观 Apr 19, 2025 am 12:15 AM

Python在科学计算中的应用包括数据分析、机器学习、数值模拟和可视化。1.Numpy提供高效的多维数组和数学函数。2.SciPy扩展Numpy功能,提供优化和线性代数工具。3.Pandas用于数据处理和分析。4.Matplotlib用于生成各种图表和可视化结果。

Web开发的Python:关键应用程序 Web开发的Python:关键应用程序 Apr 18, 2025 am 12:20 AM

Python在Web开发中的关键应用包括使用Django和Flask框架、API开发、数据分析与可视化、机器学习与AI、以及性能优化。1.Django和Flask框架:Django适合快速开发复杂应用,Flask适用于小型或高度自定义项目。2.API开发:使用Flask或DjangoRESTFramework构建RESTfulAPI。3.数据分析与可视化:利用Python处理数据并通过Web界面展示。4.机器学习与AI:Python用于构建智能Web应用。5.性能优化:通过异步编程、缓存和代码优

See all articles