【问题标题】:How to improve slicing of elements in python如何改进python中元素的切片
【发布时间】:2022-12-20 08:40:16
【问题描述】:

我正在尝试解决 AoC 的第 5 天。我能够解决第一部分。问题的目标如下:

规则以下面的data 变量的形式给出。

板条箱以相同的配置开始:

    [D]    
[N] [C]    
[Z] [M] [P]
 1   2   3 

将单个板条箱从堆栈 2 移动到堆栈 1 的行为与以前相同:

[D]        
[N] [C]    
[Z] [M] [P]
 1   2   3 

然而,将三个板条箱从堆栈 1 移动到堆栈 3 的操作意味着这三个移动的板条箱保持相同的顺序,从而产生了这个新配置:

        [D]
        [N]
    [C] [Z]
    [M] [P]
 1   2   3

接下来,当两个板条箱从第 2 层移到第 1 层时,它们也保持它们的顺序:

        [D]
        [N]
[C]     [Z]
[M]     [P]
 1   2   3

最后,一个箱子仍然从堆栈 1 移动到堆栈 2,但现在移动的是箱子 C:

        [D]
        [N]
        [Z]
[M] [C] [P]
 1   2   3

在此示例中,CrateMover 9001 将板条箱置于完全不同的顺序:MCD

在重新安排过程完成之前,更新您的模拟,以便精灵知道他们应该站在哪里以准备卸载最后的补给品。重新排列过程完成后,哪个板条箱最终出现在每个堆叠的顶部?

下面是我的代码:

data ="""move 1 from 2 to 1
    move 3 from 1 to 3
    move 2 from 2 to 1
    move 1 from 1 to 2"""

    first = ['Z', 'N']
    second = ['M', 'C', 'D']
    third = ['P']
    stack_numbers = {1: first, 2: second, 3: third}
for i in data.splitlines():
    i = i.strip()
    temp = re.findall(r'\d+', i)
    res = list(map(int, temp))
    n = res[0]
    move_from = stack_numbers[res[1]]
    move_to = stack_numbers[res[2]]
    for i in range(n):
        a = move_from[i:]
        move_to.append(a)
        res[1] = move_from[:i]
        res[2] = move_to
print(first, second, third)
seq = first.pop() + second.pop() + third.pop()
print(seq)

基本上,我在这里尝试使用切片。我正在尝试从给定的堆栈中切片 range(n) 中的元素,并尝试使用切片将它们附加到所需的堆栈,并将它们从 move_from 关联的堆栈中删除。但是,我无法达到预期的结果。

预期输出如问题描述中给出的那样,即MCD。我通过运行上面的 for 循环得到的实际输出如下:

['Z', 'N', ['M', 'C', 'D'], ['M', 'C', 'D'], ['C', 'D']] ['M', 'C', 'D', ['Z', 'N', ['M', 'C', 'D'], ['M', 'C', 'D'], ['C', 'D']]] ['P', ['Z', 'N', ['M', 'C', 'D']], ['N', ['M', 'C', 'D']], [['M', 'C', 'D']]]
['C', 'D', 'Z', 'N', ['M', 'C', 'D'], ['M', 'C', 'D'], ['C', 'D'], ['M', 'C', 'D']]

我到底需要在这里改变什么?另外,这样做的有效方法是什么?因为我的解决方案是一种蛮力方式。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    我对列解析的方法如下。肯定有更好的方法,但只要它有效......

    with open('data.txt','r') as f:
            lines = [line.split(' ') for line in f]
    instructions = [tuple(map(int,(line[1], line[3], line[5].strip()))) for line in lines[10:]]
    cols = []
    for n in range(9):
        col = []
        for line in lines[:8]:
            col.append(line[n].removesuffix(']').removeprefix('['))
        cols.append(col)
    

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2014-10-14
      • 2018-08-17
      • 2012-09-23
      相关资源
      最近更新 更多