Розміри паперу та конвертів


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, тому при обчисленні висот ширина множиться на sqrt (2), а потім округляється вгору або вниз до найближчого міліметра, в результаті чого вимірювання в таблиці вище. Це може допомогти гольфу знизити код.
  3. У послідовних розмірах для серії, коли ви спускаєтесь по таблиці, ширина для одного розміру стає висотою для наступного. Це також може допомогти вам розіграти код.

Правила:

  1. Це код-гольф. В результаті застосовуються стандартні правила. Оцінка базується на підрахунку байтів. Найнижчий рахунок виграє.
  2. Ніяких дурних лазів , ми були там раніше ... Ми не будемо через це повторюватися.
  3. Якщо ви можете це зашифрувати, то, будь ласка, також подумайте про приєднання посилання до робочого примірника вашого коду, щоб інші програмісти та гольфісти могли дізнатися, як працює ваш код. Це не є обов'язковим, але я хотів би заохотити інших робити це, щоб ми могли все навчитися один одному. Я, звичайно, хотів би дізнатися більше про мови інших гравців, де це можливо.

Удачі.


Bn - середнє геометричне значення An і An + 1, а Cn - середнє геометричне значення An і Bn.
Адам

Відповіді:


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

Не хвилюйтесь, все в назві коду гольфу ...;) Я не розумів, що карта дозволила посилатися на незапропоновані ключі в такому об'єкті ...? Мені доведеться скоріше скористатися цим ...
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 , приймаючи введення як 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

@WallyWest Ні, лише 32-бітні цілі числа, підписані.
Ніл

О Я бачу! Дізнайтеся щось нове щодня!
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 байт: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 відредаговано. А також зменшено до 56 байт
tsh



3

APL (Діалог) , 31 28 байт

-2 завдяки ngn.

Повний орган програми. Передбачає, що ⎕IO( I ndex O rigin) бути 0, що є типовим для багатьох систем. Підказки для цифри, потім листа, обидва від STDIN. Друкує до STDOUT.

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

Спробуйте в Інтернеті!

Трохи модифікована версія дозволяє перевірити всі можливості одразу: Спробуйте в Інтернеті!

⍳2 перші два ices ndices, тобто 0 і 1

⎕- відніміть це з числового введення

 помножте чотири з цим

()+ Додати наступне

 введення символів…

'BC'⍳ … Ɩ 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.