0

だから私は「地図」を与えられたこの課題を持っています

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

島の宝の数を数え (x は場所を示します)、座標のリストを作成するプログラムを作成してください。例では宝物)、次の形式でレポートを出力します。 宝物が 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)ソリューションを投稿するために:

# 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 に答える
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 Sebastianif-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 に答える
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 に答える
0

2 次元グリッドは、ある種の配列で非常に簡単に表現できます。配列内の座標 x、y を検索する方法を理解できる方法で、すべてのグリッドを格納する配列を作成します。

配列のインデックスを反復処理して、すべての宝物を確認します。

海岸線は単なる周囲の測定値ですが、より単純に表され、見つけたすべての文字が何らかの数字に相当します。もう一度ループを実行して、これらの文字を探し、それらに遭遇したら、海岸線の実行中の合計を増やします。

*これらすべてを 1 回のループで実行することも、他の簡単な方法で実行することもできます。これを実行する最善の方法は、これを実行する方法を理解できるように分割することです。

于 2012-10-24T20:54:48.900 に答える
0

これを行う非常に簡単な方法は、すべての単一文字を反復処理することです (現在の col/row_ を記録し、「x」または海岸記号の 1 つであることを確認します。そのように:

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

海岸線の長さを取得するには、各海岸文字のインスタンスを数えるだけです。

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

次に、それらを追加できます。

>>> 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 に答える
-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 に答える