Размеры бумаги и конвертов

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)
ETHproductions
источник
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

Нил
источник
Разве десятичные дроби невозможны в партии, @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)

Благодаря Нейлу, сохраните много байтов, используя альтернативный формат вывода.

ТТГ
источник
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)
Нейл
@ Нил отредактирован. А также уменьшено до 56 байт
tsh
3

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

-2 благодаря нгн.

Полное тело программы. Предполагается ⎕IO( я ndex O rigin) 0, что по умолчанию во многих системах. Запрашивает номер, затем письмо, оба из STDIN. Печатает на STDOUT.

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

Попробуйте онлайн!

Слегка измененная версия позволяет протестировать все возможности сразу: попробуйте онлайн!

⍳2 первые два ɩ 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.
Джеймс Холдернесс
источник