纸张和信封尺寸


17

任务

给定字母(A,B,C)和数字(0-10),以格式输出以毫米为单位的匹配标准纸张尺寸(A和B系列)或匹配标准信封尺寸(C系列)的尺寸aaaa x bbbb其中aaaabbbb是根据ISO216(A和B系列)或ISO296(C系列)以毫米为单位的宽度和高度测量值

为了使事情变得更容易,我将引用维基百科的纸张尺寸表

ISO paper sizes in portrait view
Format  A series    B series    C series
Size     mm × mm      mm × mm    mm × mm
0       841 × 1189  1000 × 1414 917 × 1297
1       594 × 841    707 × 1000 648 × 917
2       420 × 594    500 × 707  458 × 648
3       297 × 420    353 × 500  324 × 458
4       210 × 297    250 × 353  229 × 324
5       148 × 210    176 × 250  162 × 229
6       105 × 148    125 × 176  114 × 162
7        74 × 105     88 × 125   81 × 114
8        52 × 74      62 × 88    57 × 81
9        37 × 52      44 × 62    40 × 57
10       26 × 37      31 × 44    28 × 40

所以输入和输出的例子:

**Test case 1**
Input: A4
Output: 210 x 297

**Test Case 2**
Input: B6
Output: 125 x 176

**Test Case 3**
Input: C2
Output: 458 x 648

注意事项:

  1. 格式为“ 210 x 297”或“ 1000 x 1414”等。虽然这是首选格式,但您可以选择从输出中省略“ x”,即以数组或两个数字的形式或您喜欢的任何形式只要在高度之前输出宽度测量值即可。
  2. 高度与宽度之间的比率大致等于2的平方根,因此在计算高度时,宽度乘以sqrt(2),然后向上或向下舍入到最接近的毫米,从而得出上表中的测量值。这可能有助于降低您的代码。
  3. 在您下到表格中的一系列连续尺寸中,一个尺寸的宽度变为下一个尺寸的高度。这也可以帮助您精简代码。

规则:

  1. 这是代码高尔夫球。因此适用标准规则。分数将基于字节数。最低计数将获胜。
  2. 没有愚蠢的漏洞,我们以前去过那里...我们再也不会经历这个。
  3. 如果您可以编写代码,则还请考虑将链接附加到您的代码的工作实例,以便其他程序员和高尔夫球手了解您的代码如何工作。这不是强制性的,但我想鼓励其他人这样做,以便我们都能互相学习。我当然想尽可能地了解其他高尔夫球手的语言。

祝你好运。


Bn是An和An + 1的几何平均值,而Cn是An和Bn的几何平均值。
亚当

Answers:


9

JavaScript(ES7),57个字节

@WallyWest节省了1个字节

s=>n=>[n,n-1].map(x=>.707**x*{A:841,B:1e3,C:917}[s]+.2|0)

3
做得很好...您可以将其设置为57,s=>n=>[n,n-1].map(x=>.707**x*{A:841,B:1e3,C:917}[s]+.2|0)并且在输出中仍然具有相同的精度。
WallyWest '17

@WallyWest感谢您的提示。我会打得四处各种替代.7071.2了一段时间,只是有点放弃了,当我发现一些工作:P
ETHproductions

不用担心,所有这些都是以代码高尔夫的名义...;)我没有意识到地图不允许像这样的对象中引用未加引号的键...?我很快就要使用它了
WallyWest

1
@WallyWest与无关.map,您可以{key1:1,key2:2,key3:3}[myKey]随时使用。仅当键不是有效的变量名时才需要用引号引起来。
ETHproductions

辉煌,谢谢你的提示...
WallyWest '17

6

C(GCC) 113个 111 90 78 70字节

它需要-lm在TIO上运行,但是如果没有该选项,则可以在我的计算机上很好地运行。

多亏了pizzapant184,节省了20个字节。

通过指针返回值。

f(a,b,c,d)int*c,*d;{float x=1e3*pow(.707,b+a%3/4.)+.2;*c=x,*d=x/.707;}

说明:

f(a,b,c,d)int*c,*d;{          // calling by char, but receive as int
    float x = 1e3 * pow(.707, // float gives enough precision 
            a % 3 / 4.        // series: a%3/4.=.5,0,.25 when a=65,66,67
            + b) - .2;        // magic number to get correct roundings
    *c = x, *d = x / .707;
}

1
94字节+ -lm通过将输入作为a charint
pizzapants184 '17

1
91字节+ -lm通过更改(a^66?a^67:0.5:0.25:0)abs(a-66)/(a-63.)
pizzapant184 '17


3

批次,105个字节

@set/aA=1189,B=1414,C=1297,h=%1,w=h*29/41
@for /l %%i in (1,1,%2)do @set/at=w,w=h/2,h=t
@echo %w% x %h%

41/29≅√2


@Neil批处理中不能使用小数吗?我会想到h*.707会比h*41/29?请注意,巧妙使用近似值!
WallyWest '17

@WallyWest否,仅32位有符号整数。
尼尔

哦,我懂了!每天学些新东西!
WallyWest '17

3

JavaScript,53个字节

L=>N=>[N+1,N].map(p=>1091/2**(p/2+~{B:2,C:1}[L]/8)|0)

感谢Neil,使用其他输出格式可以节省许多字节。


1
66个字节:L=>N=>(g=p=>1000.2/2**(N/2+p-{A:2,B:4,C:3}[L]/8)|0)(.5)+' x '+g(0)
Neil

1
如果使用备用输出格式,则为58个字节:L=>N=>[N+1,N].map(p=>1000.2/2**(p/2-{A:2,B:4,C:3}[L]/8)|0)
尼尔于2008年

@Neil编辑。并且也减少到56个字节
tsh



3

APL(Dyalog)31 28字节

-2感谢ngn。

完整的程序主体。假定⎕IOI ndex O rigin)为0,这在许多系统上都是默认的。提示输入数字,然后输入字母,均来自STDIN。打印到STDOUT。

.2+1E3÷2*8÷⍨('BC'⍳⍞)+4×⎕-⍳2

在线尝试!

稍作修改的版本使我们可以一次测试所有可能性: 在线尝试!

⍳2 前两个ɩ ndices,即0和1

⎕- 从数字输入中减去

 乘以四

()+  添加以下内容

 字符输入…

'BC'⍳ …的ɩ在此字符串中(“ A”将给出2,因为索引超出最后一个)

8÷⍨ 除以8

2* 提高2的力量

1E3÷ 1000除以

.2+ 加上⅕

 地板(向下)


@ H.PWiz是的。错别字。谢谢。
亚当

2

Befunge,69 56 55字节

"}"8*~3%:"L"*7vv\p00-1_$..@
")"*":":-*!!\+<>2/00g:^:&\/

在线尝试!

说明

在Befunge中,我们没有浮点数或幂函数之类的东西,因此我们计算给定格式字符f的基本大小,如下所示:

fn = f % 3
width = 1000 - (n * 76 + 7) * !!n
height = width * 58 / 41

然后,我们反复旋转并划分这些尺寸,以得到给定尺寸数字的适当细分。

"}"8*                         Push 1000 for later use in the width calculation.
     ~                        Read the format character from stdin.
      3%                      Convert into a number in the range 0 to 2.
        :"L"*7v               Calculate width = 1000 - (fn * 76 + 7) * !!fn
        -*!!\+<                  where fn is the format number derived above.
")"*":":                  /   Calculate height = width * 58 / 41.
                         \    Swap so the width is above the height on the stack.
                      v:&     Read the numeric size from stdin and duplicate for testing.
                      _       While not zero, go left.
                 p00-1        Decrement the size and move it from the stack into memory.
               v/             Swap the width and height.
               >2/            Divide the new width by 2.
                  00g:        Restore the size from memory and duplicate for testing.
                      _       While not zero, repeat this loop.
                       $      When zero, continue to the right and drop the size.
                        ..@   Output the width and height, then exit.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.