用紙と封筒のサイズ


17

仕事

文字(A、B、C)、および数字(0-10)を指定して、一致する標準用紙サイズ(シリーズAおよびB)または一致する標準封筒サイズ(Cシリーズ)のサイズをミリメートルの形式で出力します。aaaa x bbbbここでaaaaおよびbbbbは、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. 高さと幅の比率は2の平方根にほぼ等しいため、高さの計算では、幅にsqrt(2)を掛けてから、最も近いミリメートルに切り上げまたは切り捨てます。上記の表の測定値。これはあなたのコードを下るのに役立つかもしれません。
  3. テーブルを下るときのシリーズの連続したサイズでは、あるサイズの幅が次のサイズの高さになります。これは、あなたのコードをゴルフダウンするのにも役立ちます。

ルール:

  1. これはコードゴルフです。結果として標準ルールが適用されます。スコアはバイトカウントに基づきます。最低カウントが勝ちます。
  2. 愚かな抜け穴ありません、私たちは以前にそこにいました...私たちはこれを二度とやりません
  3. コードを作成できる場合は、他のプログラマーやゴルファーがコードの仕組みを学ぶことができるように、作業中のコードのインスタンスへのリンクを添付することも検討してください。これは必須ではありませんが、私たち全員が互いに学び合うことができるように、他の人にこれを行うことを奨励したいと思います。可能な限り他のゴルファーの言語についてもっと学びたいと思います。

幸運を祈ります。


BnはAnとAn + 1の幾何平均であり、CnはAnとBnの幾何平均です。
アダム

回答:


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

@WallyWestヒントをありがとう。私はのために、さまざまな代替品で遊んのだ.7071.2しばらくの間、と私が働いていた何かを見つけたときだけちょっとあきらめた:P
ETHproductions

心配する必要はありません。すべてコードゴルフの名前で...;)私は、マップがそのようなオブジェクト内の引用符で囲まれていないキーを参照できることを認識していませんでした...?すぐにそれを使用する必要があります
...-WallyWest

1
@WallyWestとは関係ありません。いつでも.map使用{key1:1,key2:2,key3:3}[myKey]できます。有効な変数名でない場合にのみキーを引用する必要があります。
ETHproductions


6

C(gcc)113 111 90 78 70バイト

-lmTIOで実行する必要がありますが、オプションがなくてもコンピューターで正常に動作します。

pizzapants184のおかげで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ような入力を取ることによってchar、およびint
pizzapants184

1
91バイト+ -lmに変更(a^66?a^67:0.5:0.25:0)してabs(a-66)/(a-63.)
-pizzapants184


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


Batch、@ Neilでは小数は使用できませんか?私はh*.707より良いだろうと思っていただろうh*41/29か?気をつけて、巧妙な近似の使用!
ウォーリーウェスト

@WallyWestいいえ、32ビットの符号付き整数のみ。
ニール

ああなるほど!毎日新しいことを学びましょう!
ウォーリーウェスト

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)
ニール

1
または、代替の出力形式を使用する場合は58バイト:L=>N=>[N+1,N].map(p=>1000.2/2**(p/2-{A:2,B:4,C:3}[L]/8)|0)
Neil

@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 最初の2つのɩndices、つまり0と1

⎕- 数値入力からそれを引きます

 それと4を掛けます

()+ 次を追加

 文字入力…

'BC'⍳ … ' sɩndexこの文字列(「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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.