2017-05-23 5 views
-3

私は、いくつかのカップを引数にとり、その数のカップでビルドできるスタックの最大高さを返す関数( 'def stackHeights')を記述する必要があります。たとえば、7つのカップがある場合は、高さ3のスタックを構築できますが、最下行に1つのカップしか持たず、4が必要なので、高さ4のスタックには足りません。Python - スタッキングカップ?

「ヒント:しばらく使用して、上から下に構築

出力:

>>> stackHeight (7) 
3 
>>> stackHeight (3) 
2 
>>> stackHeight (12) 
4 

これは私が今持っているものです。

def stackHeight(nCups): 
    nCups = int(input()) 
    cups = {} 
    for i in range(nCups): 
     line = input().split() 
     if line[0].isnumeric(): 
      cups[int(line[0])/2] = line[1] 
     else: 
      cups[int(line[1])] = line[0] 
      print("\n".join([cups[k] for k in sorted(cups.keys())])) 

私が間違って何をやっているコードは「doesnの? tはfを実行するようです何らかの理由で。私はまだかなりプログラミングに新しいので、クラスタを残念に留意してください。

+1

プログラムは 'input()'に達するたびに停止し、入力を待っています。関数内で 'input()'を呼び出すべきではありません。 –

+0

関数に2つの 'input'ステートメントがあります。最初の引数は入力引数を上書きするためのもので、無意味で重複しています。ループの中に別のものがある。私は、あなたの関数の記述にテキスト入力が必要なものは何も見ていないので、なぜそれがありますか? –

答えて

0

あなたのコードにはかなりの問題があります。まず第一に、あなたはinput()方法が何回もあり、input()はユーザー入力を待っている間にプログラムをフリーズします。おそらくinput("string that tells the user what to put here")が必要です。また、変数nCupsがありますが、nCupsinput()に設定されているため、変数のポイントを完全に無意味にしています。また、あなたの例でそれがどのようにしたいのであれば、ループの中でprint()を望んでいません。もう1つのことは、cups={}を実行すると辞書になりますが、後でインデックスの整数が使用されるため、リスト[]が必要です。

0

あなたは数字の列を参照しているが、n番目の数を計算するための式を有し、Triangular Numbersと呼ばれる:

T'(n) = (sqrt(8n+1)-1)/2

T(n) = n(n+1)/2

次の式を使用して、あなたはこれを反転させることができます

そしてこうしてあなたのコードは次のようになります。

def stackHeight(nCups): 
    return ((8*nCups+1)**0.5-1) // 2 

とテスト:

>>> def stackHeight(nCups): 
...  return ((8*nCups+1)**0.5-1)//2 
... 
>>> stackHeight(7) 
3.0 
>>> stackHeight(3) 
2.0 
>>> stackHeight(12) 
4.0