ขนาดกระดาษและซองจดหมาย


17

งาน

ให้ตัวอักษร (A, B, C) และตัวเลข (0-10) เอาท์พุทขนาดของขนาดกระดาษมาตรฐานที่ตรงกัน (Series A และ B) หรือขนาดซองจดหมายมาตรฐานที่ตรงกัน (ชุด C) ในหน่วยมิลลิเมตรaaaa x bbbbที่ไหนaaaaและbbbbมีการวัดความกว้างและความสูงเป็นมิลลิเมตรตามมาตรฐาน ISO216 (Series A & B) หรือ ISO296 (Series C)

เพื่อให้ง่ายขึ้นฉันจะอ้างอิงจากตารางขนาดกระดาษของ 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

ตัวอย่างของอินพุตและเอาต์พุต:

**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
อดัม

ขอให้เรายังคงอภิปรายนี้ในการแชท
Leo

คำตอบ:


9

JavaScript (ES7), 57 ไบต์

บันทึก 1 ไบต์ขอบคุณ @WallyWest

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

ไม่ต้องกังวลเลยในนามของ code golf ... ;) ฉันไม่รู้ว่าแผนที่อนุญาตให้ใครคนหนึ่งอ้างถึงคีย์ที่ไม่ได้อ้างถึงภายในวัตถุเช่นนั้น ... ? ฉันจะต้องใช้มันในไม่ช้า ...
WallyWest

1
@WallyWest ที่ไม่มีส่วนเกี่ยวข้อง.mapคุณสามารถใช้งานได้{key1:1,key2:2,key3:3}[myKey]ทุกเวลาที่ต้องการ คุณจะต้องพูดคีย์ถ้าพวกเขาไม่ใช่ชื่อตัวแปรที่ถูกต้อง
ETHproductions

ยอดเยี่ยมขอบคุณสำหรับเคล็ดลับ ...
WallyWest

6

C (gcc) , 113 111 90 78 70 ไบต์

มันต้อง-lmทำงานบน TIO แต่ทำงานได้ดีบนคอมพิวเตอร์ของฉันโดยไม่มีตัวเลือก

ที่บันทึกไว้ 20 ไบต์ขอบคุณที่pizzapants184

ส่งคืนค่าตามตัวชี้

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


ทศนิยมเป็นไปไม่ได้ในแบทช์ @Neil หรือไม่ ผมจะมีความคิดh*.707จะดีกว่าh*41/29? ใจใช้ความคิดสร้างสรรค์ของการประมาณ!
WallyWest

@WallyWest ไม่จำนวนเต็มลงชื่อ 32 บิตเท่านั้น
Neil

อ้อเข้าใจแล้ว! เรียนรู้สิ่งใหม่ทุกวัน!
WallyWest

3

JavaScript ขนาด 53 ไบต์

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

บันทึกไบต์จำนวนมากโดยใช้รูปแบบเอาต์พุตอื่นขอบคุณ Neil


1
66 bytes: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)
Neil

@Neil แก้ไขแล้ว และยังลดลงไป 56 ไบต์
TSH

3

Java (OpenJDK 8) , 59 ไบต์

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

ลองออนไลน์!

แรงบันดาลใจจากรายการ C ของ @Colera Suจากนั้นปรับปรุงด้วยตัวเอง

  • บันทึกไปแล้ว 14 ไบต์ขอบคุณ Kevin Cruijssen

1
10001e3สามารถ
Kevin Cruijssen



3

APL (Dyalog) , 31 28 ไบต์

-2 ขอบคุณ ngn

โปรแกรมร่างกายเต็ม ถือว่า⎕IO( I ndex O rigin) 0เป็นค่าเริ่มต้นในหลาย ๆ ระบบ แสดงตัวเลขและตามด้วยตัวอักษรทั้งสองจาก STDIN พิมพ์ไปยัง STDOUT

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

ลองออนไลน์!

เวอร์ชันดัดแปลงเล็กน้อยให้เราทดสอบความเป็นไปได้ทั้งหมดในครั้งเดียว: ลองออนไลน์!

⍳2 สองคนแรกɩ ndices คือ 0 และ 1

⎕- ลบออกจากอินพุตตัวเลข

 คูณด้วยสี่

(... )+ เพิ่มสิ่งต่อไปนี้

 การป้อนอักขระ ...

'BC'⍳ … 's ภาคผนวกในสายนี้ ("A" จะให้ 2 เป็นดัชนีเกินกว่าที่ผ่านมา)

8÷⍨ หารด้วย 8

2* ยกระดับ 2 ให้เป็นพลังของสิ่งนั้น

1E3÷ 1,000 หารด้วย

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