Kertas dan Ukuran Amplop

17

Tugas

Diberi huruf (A, B, C), dan angka (0-10), menampilkan ukuran ukuran kertas standar yang cocok (Seri A dan B) atau ukuran amplop standar yang cocok (seri C) dalam milimeter dalam format aaaa x bbbbdi mana aaaadan bbbbapakah pengukuran lebar dan tinggi dalam milimeter sesuai ISO216 (Seri A & B) atau ISO296 (Seri C)

Untuk mempermudah, saya akan mengutip tabel Ukuran Kertas Wikipedia

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

Jadi contoh input dan output:

**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

Hal yang perlu diperhatikan:

  1. Format "210 x 297" atau "1000 x 1414" dll. Meskipun ini adalah format yang lebih disukai, Anda dapat memilih untuk menghilangkan "x" dari output Anda, yaitu dalam bentuk array atau dua angka atau apa pun yang menggelitik keinginan Anda selama pengukuran lebar dikeluarkan sebelum ketinggian.
  2. Rasio antara tinggi dan lebar kira-kira setara dengan akar kuadrat dari 2, sehingga dalam perhitungan ketinggian, lebar dikalikan dengan sqrt (2), dan kemudian dibulatkan ke atas atau ke bawah ke milimeter terdekat, sehingga menghasilkan pengukuran pada tabel di atas. Ini dapat membantu menurunkan kode Anda.
  3. Dalam ukuran berturut-turut untuk seri saat Anda turun tabel, lebar untuk satu ukuran menjadi tinggi untuk yang berikutnya. Ini juga dapat membantu Anda mengurangi kode Anda.

Aturan:

  1. Ini adalah kode-golf. Aturan standar berlaku sebagai hasilnya. Skor akan didasarkan pada jumlah byte. Hitungan terendah akan menang.
  2. Tidak ada celah konyol , kita pernah ke sana sebelumnya ... Kita tidak akan melalui ini lagi.
  3. Jika Anda dapat mengkodekannya, silakan pertimbangkan melampirkan tautan ke instance kode Anda yang berfungsi sehingga programmer dan pegolf lain dapat mempelajari cara kerja kode Anda. Ini tidak wajib, tetapi saya ingin mendorong orang lain untuk melakukan ini sehingga kita semua dapat saling belajar. Saya tentu ingin belajar lebih banyak tentang bahasa pegolf lain jika memungkinkan.

Semoga berhasil.

WallyWest
sumber
Bn adalah rata-rata geometrik dari An dan An + 1, dan Cn adalah rata-rata geometrik dari An dan Bn.
Adám

Jawaban:

9

JavaScript (ES7), 57 byte

Disimpan 1 byte berkat @WallyWest

s=>n=>[n,n-1].map(x=>.707**x*{A:841,B:1e3,C:917}[s]+.2|0)
Produksi ETH
sumber
3
Kerja bagus ... Anda bisa membuatnya 57 dengan s=>n=>[n,n-1].map(x=>.707**x*{A:841,B:1e3,C:917}[s]+.2|0)dan masih akan memiliki presisi yang sama dalam output Anda.
WallyWest
@WallyWest Terima kasih atas tipnya. Saya telah bermain - main dengan berbagai pengganti untuk .7071dan .2untuk sementara waktu dan hanya sedikit menyerah ketika saya menemukan sesuatu yang berhasil: P
ETHproduksi
Jangan khawatir, semua atas nama kode golf ...;) Saya tidak menyadari peta mengizinkan seseorang untuk referensi kunci yang tidak dikutip dalam suatu objek seperti itu ...? Saya harus segera menggunakannya ...
WallyWest
1
@WallyWest Itu tidak ada hubungannya .map, Anda dapat menggunakan {key1:1,key2:2,key3:3}[myKey]kapan saja Anda inginkan. Anda hanya perlu mengutip kunci jika itu bukan nama variabel yang valid.
ETHproduksi
Cemerlang, terima kasih atas tipnya ...
WallyWest
6

C (gcc) , 113 111 90 78 70 byte

Perlu -lmdijalankan pada TIO, tetapi berfungsi dengan baik di komputer saya tanpa opsi.

Disimpan 20 byte berkat pizzapants184 .

Kembalikan nilai dengan pointer.

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

Penjelasan:

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;
}
Colera Su
sumber
1
94 byte + -lm dengan mengambil input sebagai chardanint
pizzapants184
1
91 byte + -lm dengan mengubah (a^66?a^67:0.5:0.25:0)keabs(a-66)/(a-63.)
pizzapants184
3

Python 2 , 103 97 93 84 83 81 byte

def f(l,n):w=[841,1000,917][ord(l)-65];h=int(w/.707);exec"w,h=h/2,w;"*n;print w,h

Cobalah online!

TFeld
sumber
3

Batch, 105 byte

@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
sumber
Apakah desimal tidak dimungkinkan dalam Batch, @Neil? Saya akan berpikir h*.707akan lebih baik daripada h*41/29? Pikirkan Anda, penggunaan perkiraan yang cerdik!
WallyWest
@WallyWest Tidak, bilangan bulat bertanda 32-bit saja.
Neil
Oh begitu! Pelajari sesuatu yang baru setiap hari!
WallyWest
3

JavaScript, 53 byte

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

Simpan banyak byte dengan menggunakan format output alternatif, terima kasih kepada Neil.

tsh
sumber
1
66 byte: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
Atau 58 byte jika Anda menggunakan format output alternatif:L=>N=>[N+1,N].map(p=>1000.2/2**(p/2-{A:2,B:4,C:3}[L]/8)|0)
Neil
@Neil diedit. Dan juga dikurangi menjadi 56 byte
tsh
3

Java (OpenJDK 8) , 59 byte

f->s->new double[]{s=1e3*Math.pow(.707,s+f%3/4d)-.2,s/.707}

Cobalah online!

Terinspirasi oleh entri C @Colera Su , kemudian ditingkatkan sendiri.

  • 14 byte disimpan berkat Kevin Cruijssen
Olivier Grégoire
sumber
1
1000bisa 1e3.
Kevin Cruijssen
1
75 byte
Kevin Cruijssen
3

APL (Dyalog) , 31 28 byte

-2 Terima kasih kepada ngn.

Badan program penuh. Diasumsikan ⎕IO( I ndex O rigin) 0, yang merupakan default pada banyak sistem. Meminta nomor, lalu surat, keduanya dari STDIN. Mencetak ke STDOUT.

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

Cobalah online!

Versi yang sedikit dimodifikasi memungkinkan kami menguji semua kemungkinan sekaligus: Cobalah secara online!

⍳2 dua ɩ informasi pertama, yaitu 0 dan 1

⎕- kurangi dari input numerik

 kalikan empat dengan itu

(... )+ tambahkan berikut ini

 input karakter ...

'BC'⍳ ... ɩ ndex dalam string ini ("A" akan memberikan 2, karena indeks melampaui yang terakhir)

8÷⍨ bagi dengan 8

2* meningkatkan 2 pangkat itu

1E3÷ 1000 dibagi dengan itu

.2+ tambahkan ⅕ ke sana

 lantai (bulat ke bawah)

Adm
sumber
@ H.PWiz Ya. Salah ketik. Terima kasih.
Adám
2

Befunge, 69 56 55 byte

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

Cobalah online!

Penjelasan

Kami tidak memiliki kemewahan titik apung atau apa pun seperti fungsi daya di Befunge, jadi kami menghitung ukuran dasar untuk karakter format yang diberikan, f , sebagai berikut:

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

Kami kemudian berulang kali memutar dan membagi dimensi ini untuk mendapatkan subdivisi yang sesuai untuk nomor ukuran yang diberikan.

"}"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.
James Holderness
sumber