バックグラウンド
フランスでは、おそらく欧州連合の残りの部分では、販売のために利用可能な任意の食品はしなければならないで、そのパッケージに、それを構成する成分をリスト重量パーセントの降順。ただし、以下の場合を除き、正確な割合を示す必要はありません。カバーのテキストまたは画像で成分が強調表示されてい。
たとえば、パッケージに大きな赤いトマトと美しいバジルの葉だけが表示されている私のバジルトマトソースには、次の表示があります。
原材料:トマト80%、玉ねぎ、バジル1.4%、海塩、つぶしたニンニク、生の砂糖、エキストラバージンオリーブオイル、黒胡pepper。
食いしん坊に聞こえるかもしれませんが… どのくらいの玉ねぎを食べますか正確ますか?
チャレンジ
最終的に不完全な降順の重量パーセントのリストが与えられた場合、レシピで見つかる可能性のある最小および最大重量パーセントの完全なリストを出力します。
- 関数または完全なプログラムのいずれかを作成できます。
- 入力は任意の合理的な形態(例えば、数値や文字列のリストの配列)であってもよいです。小数値は、少なくとも小数点以下1桁までサポートする必要があります。重量パーセントの欠落は、一貫性のある明確な方法(
0、'?'またはnullなど)で表すことができます。あなたは、入力が常に有効なレシピに関連する(されると仮定することができます[70]し、[∅, ∅, 50]例えば、無効です)。 - 出力は、(例えば、最小及び最大の重量百分率の両方のための1つのアレイ、又は二重の単一のリスト)は、任意の合理的な形態であり得ます。最小と最大のパーセントは、任意の順序であっても(ことができる
[min, max]と[max, min]の両方許容可能です)。正確な重量の割合は、他の割合とは異なる方法で処理する必要はなく、等しい最小値と最大値で表すことができます。
コードゴルフの標準ルール適用されます。コードを入力している間、私のパスタ皿は冷めているので、最短の提出が勝ちます。
例
この問題は一見しただけでは難しいため、ここではいくつかのケースの段階的な解決策を示します。
[40, ∅, ∅]
それぞれxとy2つの不足している割合を呼び出しましょう。
- 最初の成分の後に40%である
xため、40%を超えることはできません。[40, [?, 40], [?, ?]] - 2つの欠落している割合の合計は常に60%です。その結果:
- 最大値を
x取る場合、最小値を取るため、60%-40%= 20%になります。y[40, [?, 40], [20, ?]] - 最小値を
x取る場合、最大値を取ります。しかし、より低くすることはできませんyxy、この場合、x=y= 60%/ 2 = 30%です。[40, [30, 40], [20, 30]]
- 最大値を
[70, ∅, ∅, 5, ∅]
のは、それぞれ呼ぶことにしましょうx、yとz3つの欠落している割合。
- の最小および最大パーセンテージは
z、必ず0%〜5%です。zしばらく= 0%と仮定しましょう。2つの欠落したパーセンテージの合計は常に25%です。その結果:[70, [?, ?], [?, ?], 5, [0, 5]]yその最小限を取る場合値を、5%、次いで、xそのとる最大 5%= 20% -従って25%の値を、。[70, [?, 20], [5, ?], 5, [0, 5]]- 最大値を
y取る場合、最小値を取る。しかし、より低くすることはできませんxxy、ので、この場合、x=y= 25%/ 2 = 12.5%です。[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- ここで
z= 5%と仮定した場合、すべてが正常であることを確認しましょう。欠落している2つの割合の合計は常に20%です。その結果:yその最小限を取る場合5%の値をx、最大値をとる 5%= 15% -従って20%の値を、。このケースは、以前に計算された範囲に既に含まれています。- 最大値を
y取る場合、最小値を取る。しかし、より低くすることはできませんので、この場合、= = 20%/ 2 = 10%です。このケースは、以前に計算された範囲に既に含まれていますが、ではありません。xxyxyyx[70, [10, 20], [5, 12.5], 5, [0, 5]]
テストケース
Input: [∅]
Output: [100]
Input: [70, 30]
Output: [70, 30]
Input: [70, ∅, ∅]
Output: [70, [15, 30], [0, 15]]
Input: [40, ∅, ∅]
Output: [40, [30, 40], [20, 30]]
Input: [∅, ∅, 10]
Output: [[45, 80], [10, 45], 10]
Input: [70, ∅, ∅, ∅]
Output: [70, [10, 30], [0, 15], [0, 10]]
Input: [70, ∅, ∅, 5, ∅]
Output: [70, [10, 20], [5, 12.5], 5, [0, 5]]
Input: [30, ∅, ∅, ∅, 10, ∅, ∅, 5, ∅, ∅]
Output: [30, [10, 25], [10, 17.5], [10, 15], 10, [5, 10], [5, 10], 5, [0, 5], [0, 5]]
[40, ∅, ∅]、入力から出力への段階的な説明を追加し[70, ∅, ∅, 5, ∅]ます。テストケースを見ずに課題を明確にする必要がありますが、現在はそうではありません。私がそれを正しく理解している場合[40, ∅, ∅]:100%に60以上が必要で、これら2つに分けられ∅ます。最初の値∅は30以上∅でなければなりません(そうでない場合、2番目の値はそれより上になりますが、順番が揃っていれば不可能です)。さらに、それはを超えることはできない40ので、最初∅は[30,40]になり、2番目はになり[(100-40-40=)20, (100-40-30=)30]ます。
[min,max]/ [max,min]または混合が許可されていますか?
[min,max]と[max,min]境界線は許容できますが、あいまいな結果につながることはないので、大丈夫だと思います。
[70, 12, 11, 5, 2]あなたの2番目の例ではうまくいかないのですか?動作する場合、の最小値はx未満です12.5。