首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多重转换错误的平均影响

多重转换错误的平均影响
EN

Code Golf用户
提问于 2021-03-31 03:30:37
回答 4查看 357关注 0票数 8

想象一下四个人站成一排。第一个看温度计,把温度告诉右边的人。这种情况一直持续到最后一个人在一张纸上写下温度。不幸的是,由于一个错误的沟通,线上的每个人都把温度转换成他们喜欢的单位,而不知道它已经是哪一个了。

假设人们喜欢的单位是celsiusfahrenheitfahrenheitcelsius。第一种是20°C,第二种是华氏,第二种是华氏68度,第三种是在不知道自己已经收到了华氏154.4°C的情况下,最后由第四人将其转换为华氏68°C。

任务:

您将得到两个输入:温度(t)和许多人(n)。您的程序(或函数)应该返回原始温度和由此产生的温度之间的平均差值,用于每一种可能的n人员。

有两个温度单位:°F和°C。要在它们之间进行转换,可以使用F=\frac95C+32C=\frac59(F-32)

您可以选择您的程序是接收到以°F或°C输入的温度,第一个人应该始终收到准确的温度,只有在必要时才转换为他们的首选单元。

作为一个例子,我们将使用输入的温度为41°F,只有3人。有8种可能的温度优惠:

代码语言:javascript
复制
FFF   41°F  ->  41.0  ->  105.8  ->  222.44  ->  222.44°F
FFC   41°F  ->  41.0  ->  105.8  ->   41.00  ->  105.80°F
FCF   41°F  ->  41.0  ->    5.0  ->   41.00  ->   41.00°F
FCC   41°F  ->  41.0  ->    5.0  ->  -15.00  ->    5.00°F
CFF   41°F  ->   5.0  ->   41.0  ->  105.80  ->  105.80°F
CFC   41°F  ->   5.0  ->   41.0  ->    5.0  ->    41.00°F
CCF   41°F  ->   5.0  ->  -15.0  ->    5.00  ->    5.00°F
CCC   41°F  ->   5.0  ->  -15.0  ->  -26.11  ->  -15.00°F

与41°F的平均距离为54.88°F,是程序的输出。

I/O:

温度应该用浮子、十进制或某种分数来表示。精度应该在合理的范围内;对于在低温下输入少于10个人的输入,在前四位小数位中不应该出现浮点误差或不精确。

您可以将输入和输出的温度表示为°F或°C,但必须是一致的(尽管输入可以输出不同的单位,只要它们不改变)。温度可能是负的。人数永远不会少于两人。

输出被称为高于温度,尽管从技术上讲它是多重温度的算术平均值。

测试用例:

对于所有测试用例,输入单元与输出单元相同。

代码语言:javascript
复制
41°F   2   ->  25.2
41°F   3   ->  54.88
41°F   4   ->  77.236444...
41°F   10  ->  295.4268...
20°C   4   ->  57.21218...
-1°C   2   ->  12.133...
-20°C  2   ->  6.2222...
-40°F  4   ->  0

其他:

这是密码-高尔夫,最短的答案以字节为单位的每种语言都赢了!

EN

回答 4

Code Golf用户

发布于 2021-03-31 06:17:28

Dyalog Unicode,41 字节数

代码语言:javascript
复制
(|40+⎕)+.×(|÷≢)1-1.8*1(-,+)⍨⍣(⎕-2)⊢1-3|⍳4

在网上试试!

一个完整的程序。取人数,然后是初始温度。为了便于测试,TIO版本封装在一个功能中。正如我在一项评论中指出的那样,最初和最后的单位都不重要,只要它们是平等的。

数学

该代码利用了华氏温度转换在-40 (-40°F = -40°C)的固定点这一事实。然后,我们可以将所有的温度读数增加40,然后整个转换序列减少为\frac95的(正负)整数幂。

F+40=\frac95(C+40), \quad C+40 = \frac59(F+40)

由于每个温度值都被40的常量值所抵消,所以两个偏移温度值之间的差值与原始温度值的差值相同。因此,只需将偏移量应用于初始温度,而忽略其直到结束。

让我们打电话给r = \frac95

现在到计数所有转换路径的部分。假设初始读数是华氏温度。然后:

  • 初始转换:F→F (r^0)或F→C (r^{-1})。
  • 最终转换:F→F (r^0)或C→F (r^1)。
  • 所有内部转换:C→F (r^1)或F→C (r^{-1})。

因此,任务简化为查找(r^0 + r^{-1})(r^1+r^{-1})^{n-2}(r^1+r^0)扩展中的所有单个术语。然后插入r值,将差异的平均值计算为1,然后与初始温度相乘(用偏移量)。

代码

代码语言:javascript
复制
(|40+⎕)+.×(|÷≢)1-1.8*1(-,+)⍨⍣(⎕-2)⊢1-3|⍳4

⊢1-3|⍳4  ⍝ A fancy way to create an array of 0 ¯1 1 0
         ⍝ which represents the powers in (1+r^-1)(r+1)
⍣(⎕-2)   ⍝ Repeat n-2 times...
1(-,+)⍨  ⍝ multiply the given polynomial with (r+r^-1)
         ⍝ and list all powers
1.8*     ⍝ Plug in r = 1.8 and evaluate the powers
1-       ⍝ Difference of each value from 1
(|÷≢)    ⍝ Average of absolute differences from 1
+.×      ⍝ Product and sum with...
(|40+⎕)  ⍝ Absolute difference between -40 and t
票数 6
EN

Code Golf用户

发布于 2021-03-31 04:41:39

Python 3,126个字节

代码语言:javascript
复制
f=lambda t,n,x=0,i=0,j=0:(f(i and 9*t/5+32or t,n,x or t,i+1,0)+f(5/9*(t-32),n,x or t,i+1,1))/2if i-n else abs(t+(32+.8*t)*j-x)

在网上试试!

j是0还是1取决于当前的温度是F还是C。

i表示我们已经执行的转换数。我们执行两种可能的转换,并取答案的平均值。

x是一个额外的变量,用于跟踪原始温度。

票数 2
EN

Code Golf用户

发布于 2021-03-31 07:09:12

JavaScript (Node.js),84字节

代码语言:javascript
复制
T=>U=>g=(N,p)=>(--N?g(N,~-p)+g(N,p+1|0):Math.abs(U**p-1)*(1+U)*(T+40))/2,C=5/9,F=9/5

在网上试试!

布布勒已经计算出了正确的公式,所以我想在这里删除不正确的公式(许多错误)。您可以从布布勒柱阅读更多关于数学公式的内容。你可以从这篇文章的历史中找到一个基于这个公式的解决方案。

但是计算二项式系数需要花费太多的字节。因此,使用递归得到了一个较短的解。和递归函数:

U=\begin{cases} 5/9 && \text{Input is ℃} \\ 9/5 && \text{Input is ℉} \end{cases}
g_U\left(n,p\right) = \begin{cases} \left(g_U\left(n-1,p+1\right)+g_U\left(n-1,p-1\right)\right)/2 & n > 1 \\ \left|U^{p}-1\right| & n = 1 \end{cases}
f(T,U,N)=\left(1+U\right)\left(T+40\right)\left(g_U\left(N-1,0\right)+g_U\left(N-1,-1\right)\right)/4
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/222642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档