在控制台输入时,用户输入从 0 到 long 左右的任何数字。Max 该数字放置在秤的左盘上。三者的力量需要平衡这些天平。嗯,就是如果输入的是7,那么我们在7的左边放3,右边放9和1,权重不能重复。也就是说,您不能两次输入 1。
目标是用最短的线路解决这个问题。它有多难读并不重要。
到目前为止,我已经能够得到这个三行解决方案:
List<List<long>> weights = new List<List<long>> { new List<long> { long.Parse(Console.ReadLine()) }, new List<long>() };
while (weights[0].Sum() != weights[1].Sum()) weights[weights[0].Sum() > weights[1].Sum() ? 1 : 0].Add((long)Math.Pow(3, ((Func<long, long, bool>)((number, power) => number > (long)((Math.Pow(3, power) - 1) / 2)))(weights[0].Sum() > weights[1].Sum() ? weights[0].Sum() - weights[1].Sum() : weights[1].Sum() - weights[0].Sum(), ((Func<long, long>)(number => (long)Math.Ceiling(Math.Log(number, 3))))(weights[0].Sum() > weights[1].Sum() ? weights[0].Sum() - weights[1].Sum() : weights[1].Sum() - weights[0].Sum())) ? ((Func<long, long>)(number => (long)Math.Ceiling(Math.Log(number, 3))))(weights[0].Sum() > weights[1].Sum() ? weights[0].Sum() - weights[1].Sum() : weights[1].Sum() - weights[0].Sum()) : ((Func<long, long>)(number => (long)Math.Ceiling(Math.Log(number, 3))))(weights[0].Sum() > weights[1].Sum() ? weights[0].Sum() - weights[1].Sum() : weights[1].Sum() - weights[0].Sum()) - 1));
Console.WriteLine(JsonSerializer.Serialize(weights));
我相信你想要的可以使用 Linq 的 Agreggate 方法或使用 lambda 来实现,但是 while 的存在非常令人困惑。是否可以用它做点什么?
这是我最初的解决方案,我试图将其压缩为一行:
class Program
{
static void Main(string[] args)
{
long weight = long.Parse(Console.ReadLine());
List<List<long>> weights = new List<List<long>>
{
new List<long>(),
new List<long>()
};
weights[0].Add(weight);
FindThreeDegreeWeights(weights);
Console.WriteLine(JsonSerializer.Serialize(weights));
}
static long MinPowerOfThreeNotLessThan(long number)
{
long power = (long)Math.Ceiling(Math.Log(number, 3));
return power;
}
static bool IsNumberGreaterThanSumOfPreviousPowersOfThree(long number, long power)
{
long sum = (long)((Math.Pow(3, power) - 1) / 2);
return number > sum;
}
static void FindThreeDegreeWeights(List<List<long>> weights)
{
long leftSum = weights[0].Sum();
long rightSum = weights[1].Sum();
if (leftSum == rightSum)
return;
if (leftSum > rightSum)
{
long difference = leftSum - rightSum;
long upperDegree = MinPowerOfThreeNotLessThan(difference);
if (IsNumberGreaterThanSumOfPreviousPowersOfThree(difference, upperDegree))
{
weights[1].Add((long)Math.Pow(3, upperDegree));
}
else
{
weights[1].Add((long)Math.Pow(3, upperDegree - 1));
}
}
else
{
long difference = rightSum - leftSum;
long upperDegree = MinPowerOfThreeNotLessThan(difference);
if (IsNumberGreaterThanSumOfPreviousPowersOfThree(difference, upperDegree))
{
weights[0].Add((long)Math.Pow(3, upperDegree));
}
else
{
weights[0].Add((long)Math.Pow(3, upperDegree - 1));
}
}
FindThreeDegreeWeights(weights);
}
}
也许它会有用:在Python中转换为平衡三元系统的整数算法(删除了零)
更新
这是使用 @MBo 算法的单行解决方案(但我自己想出了):
如果答案中的三的幂为正,则将其与数字一起放置。
也可以使用 Linq: