0

所以我有这个任务,我得到了一张“地图”

island = \
['     /---------\       ',
 '     |     x    \      ',
 '     /           \--\  ',
 '    /   x            | ',
 '    |         x      | ',
 '     \               \ ',
 '      \  x  /\/\     / ',
 '       \---/    \   |  ',
 '                /--/   ']

编写一个程序,计算岛上宝物的数量(x 表示地点)并创建一个坐标列表,例如 [(1,11), ...] ((1,11) 是顶部的实际位置示例中的宝物),然后打印出一份报告,格式为:有 3 个宝物。(1,11) 处有宝藏。在...处有一个宝藏。提示:从第 i 行第 j 列中的符号的(非常短的)表达式开始。

编写一个计算海岸线长度的程序。假设 an'-'和 a'|'1 mile,并且 a '\','/'1.4 miles。(这只是一个非常粗略的估计,原因有很多,其中一些是数学的)。

我什至不知道从哪里开始......有人可以帮助我或至少指出我正确的方向吗?

4

9 回答 9

7

您要做的第一件事是遍历数组

for column, line in enumerate(island):
    print column, line

那给你

0      /---------\       
1      |     x    \      
2      /           \--\  
3     /   x            | 
4     |         x      | 
5      \               \ 
6       \  x  /\/\     / 
7        \---/    \   |  
8                 /--/  

好的,那么在每一行上水平迭代怎么样?完全相同的:

for column, line in enumerate(island):
    for row, cell in enumerate(line):
        print "entry at", row, column, "is", cell

警告:给出长输出!

这应该足以让你开始

于 2012-10-24T20:51:47.853 回答
1

由于人们发布了完整的解决方案,这里有一个 Pythonic 但不高级的解决方案。

segment_lengths = {'\\':1.4,'/':1.4,'-':1,'|':1}
coast_len = 0
treasure_coords = []
for y, line in enumerate(island):
    for x, c in enumerate(line):
        coast_len += segment_lengths.get(c, 0)
        if c == 'x':
            treasure_coords.append((y, x))
print len(treasure_coords), 'treasures found at', treasure_coords
print 'island coast length is', coast_len

印刷:

4 treasures found at [(1, 11), (3, 8), (4, 14), (6, 9)]
island coast length is 49.0

编辑:JF Sebastian提供了一个基于 if-elif 的解决方案:

coast_length = 0
treasure_coords = []
for y, row in enumerate(island):
    for x, c in enumerate(row):
        if c in r'\/':
            coast_length += 1.4
        elif c in '-|':
            coast_length += 1
        elif c == 'x':
            treasure_coords.append((y, x))

print("There are %d treasures." % (len(treasure_coords),))
for y, x in treasure_coords:
    print("There is a treasure at (%2d, %2d)." % (y, x))
print("The length of the coastline is %.1f." % (coast_length,))
于 2012-10-24T21:36:51.860 回答
1

为了发布(半pythonic)解决方案:

# reads as it means - coords where the cell is "x"
treasure_coords = [
    (x, y) for y, row in enumerate(island)
           for x, c in enumerate(row)
           if c == 'x'
]

# slightly more cryptic
coast_length = sum(
    1   if c in '-|'  else
    1.4 if c in '/\\' else
    0
    for c in ''.join(island)
)
于 2012-10-24T21:46:36.197 回答
0

To get the length of the coastline, you just need to count the instances of each coast character.

>>> from itertools import groupby
>>> dict([(k, len(list(g))) for k, g in groupby(sorted(''.join(island)))])
{' ': 162, '-': 16, '/': 9, '\\': 11, 'x': 4, '|': 5}

Then you can add them up:

>>> char_counts = dict([(k, len(list(g))) for k, g in groupby(sorted(''.join(island)))])
>>> char_counts['-'] + char_counts['|'] + 1.4 * (char_counts['/'] + char_counts['\\'])
49.0
于 2012-10-24T21:07:09.667 回答
0

二维网格很容易用某种数组表示。创建一个数组,以您了解如何查找该数组中的坐标 x,y 的方式存储所有网格。

通过遍历数组的索引来检查所有宝藏。

海岸线只是一个周长测量值,但它的表示要简单得多,你找到的每个字符都相当于某个数字。再次运行一个循环,寻找这些角色,当你遇到它们时,增加一些海岸线的运行总和。

*您可以在一个循环中或以其他简单的方式完成所有这些操作……最好的方法是将其分解为多个部分,以便您了解如何执行此操作。

于 2012-10-24T20:54:48.900 回答
0

非常简单的方法就是遍历每个字符(记录当前的 col/row_ 并检查它是否为 'x' 或海岸符号之一。就像这样:

length = 0.0
x = 0
y = 0
for line in island:
    x += 1
    y = 0
    for char in line:
        y += 1
        if char == 'x': print 'There is a treasure at (%d,%d)' % (x, y)
        elif char in ('-', '|'):
            length += 1
        elif char in ('\\', '/'):
            length += 1.4
print 'Coast length is', length

当然,它不会检查海中的宝藏、海岸的完整性等。

于 2012-10-24T21:02:49.733 回答
0

海岸线部分长度的 Pythonic 解决方案:

In [144]: strs
Out[144]: 
['     /---------\\       ',
 '     |     x    \\      ',
 '     /           \\--\\  ',
 '    /   x            | ',
 '    |         x      | ',
 '     \\               \\ ',
 '      \\  x  /\\/\\     / ',
 '       \\---/    \\   |  ',
 '                /--/   ']

In [145]: dic={'\\':1.4,'/':1.4,'-':1,'|':1}

In [146]: sum(dic.get(y,0) for x in strs for y in x)
Out[146]: 48.999999999999979

或者

In [149]: sum(map(lambda x:dic.get(x,0),chain(*strs)))
Out[149]: 48.999999999999979

或(如埃里克所建议):

In [197]: sum(dic.get(x,0) for x in chain(*strs))
Out[197]: 48.999999999999979

对于坐标:

In [185]: [(i,m.start()) for i,x in enumerate(strs) for m in re.finditer('x',x)]
Out[185]: [(1, 11), (3, 8), (4, 14), (6, 9)]
于 2012-10-24T21:55:23.963 回答
0

我是python的初学者,这个问题很有趣,我对这个问题的解决方案如下:感谢@Eric为开始提供了一个想法

island = \
['     /---------\       ',
 '     |     x    \      ',
 '     /           \--\  ',
 '    /   x            | ',
 '    |         x      | ',
 '     \               \ ',
 '      \  x  /\/\     / ',
 '       \---/    \   |  ',
 '                /--/   ']
Distance={
    "-":1.0,
    "|":1,
    "\\":1.4,
    "/":1.4
}
Treasure_Location = []
Miles = []
for row, line in enumerate(island):
    #print(row, line)

    for column, cell in enumerate(line):
        if cell== "x":
            Treasure_Location.append((row, column))

        if cell in Distance:
            z=Distance.get(cell)
            Miles.append(z)

Total_miles= sum(Miles)

print ("Co-ordinates of the Treasure in the Island are:\n")
print("\nTreasure 1: " + str(Treasure_Location[0]))
print("\nTreasure 2: " + str(Treasure_Location[1]))
print("\nTreasure 3: " + str(Treasure_Location[2]))
print("\nTreasure 4: " + str(Treasure_Location[3]))
print("\nThe length of the Coastal line is:"+str(Total_miles))
于 2019-03-31T18:55:02.130 回答
-1

由于每一行都是列表中的一个值,因此您可以使用简单的“in”检查来查看是否有宝藏。

 for line in island:
     if 'x' in island[line]:
         print '%d,%d' %line,island[line].index('x')

获取电源线的简单方法。

于 2012-10-24T21:03:56.047 回答