Выбор размера шрифта в Scroll Word


32

Word и кнопки изменяют размер шрифта в соответствии с этими правилами:A

  1. Начальный размер шрифта 11.
  2. Если нажать, когда размер шрифта равен 1, размер остается равным 1.
  3. Размер шрифта изменяется с 1 точкой в ​​диапазоне 1 - 12.
  4. Размер шрифта изменяется с 2 точками в диапазоне 12 - 28.
  5. Варианты выбора: 28, 36, 48, 72 и 80 в диапазоне от 28 до 80.
  6. Размер шрифта изменяется с 10 точками в диапазоне 80 - 1630.
  7. Размер шрифта изменяется с 8 точками в диапазоне 1630 - 1638.
  8. Если нажата, когда размер шрифта равен 1638, размер остается 1638.A

задача

В максимально возможном количестве байтов определите размер получаемого шрифта при наличии набора нажатий кнопок в любом приемлемом формате.

Примеры

[3,-1,2], значение : результат 18.AAAAA

Некоторые возможные форматы '^^^v^^', [1 1 1 -1 1 1], [True,True,True,False,True,True], ["+","+","+","-","+","+"], "‘‘‘’‘‘", "⛄️⛄️⛄️🌴⛄️⛄️", 111011, "CaB"и т.д. ...

[2]: 14

[-1]: 10

[13]: 80

[-11,1]: 2

[11,-1]: 36

[170,-1]: 1630

[2000,-2,100]: 1638


3
Нужно ли брать набор нажатий кнопок в этом точном формате? Например, будет ли все или некоторые из них хорошо , а также: "^vvv^v^^^v", [-1, 1, 1, -1, 1, -1], [0, 1, 0, 1, 1, 0, 1]?
orlp

@ или да Первоначально я написал их в, но я нашел форматы глупо. Я вставлю их прямо сейчас.
Адам

2
Как насчет "😀😀😀😟😀😀" или "⛄️⛄️⛄️🌴⛄️⛄️"
Ник Т

3
@NickT Это нормально.
Адам

Ответы:


6

MATL , 49 47 45 байт

11: 9:E10+'$*H'o8:163 10*1638v11ihl180h&Ys0))

Формат ввода - [1 1 -1 1 1 -1 -1 -1]или [2 -1 2 -3], с дополнительными запятыми.

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

11:         % Push [1 2 ... 11]
9:          % Push [1 2 ... 9]
E10+        % Times 2, plus 10: gives [12 14 ... 28]
'$*H'       % Push this string
o           % Convert to double: gives ASCII codes, that is, [36 48 72]
8:163       % Push [8 9 ... 163]
10*         % Times 10: gives [80 90 ... 1630]
1638        % Push 1638
v           % Concatenate everything into a column vector
11          % Push 11
ih          % Input array and concatenate with 11
l180h       % Push [1 180]
&Ys         % Cumulative sum with limits 1 and 180
0)          % Get last value
)           % Index into column vector of font sizes. Implicitly display

Наконец, язык игры в гольф. Я начинал удивляться ...
Адам

2
@ Adám Нам нужен ответ в APL :)
orlp

@APL не является языком игры в гольф. 8 × 6 = 48, а не 68
Адам

1
@APL не упоминаемый пользователь, ни пользователь вообще.
Мэтью Ро

43

Слово VBA, 199 147 126 116 102 100 87 85 байт

Зачем подражать, когда можно сделать ?!

Объявлена ​​функция в ThisDocumentмодуле, которая принимает ввод nв виде Array(true,true,false,true)и выводит в селектор размера шрифта Word :P

Golfed:

Sub a(n):Set f=Content.Font:For Each i In n
If i Then f.Grow Else f.Shrink
Next:End Sub

Ungolfed:

Sub a(n)
    Set f=ThisDocument.Content.Font
    For Each i In n
        If i Then 
            f.Grow 
        Else 
            f.Shrink
    Next
    ''  Implicitly output font size to MS Word Font Size Selector 
End Sub

.GIF использования

Я. GIF!

Благодарность

-21 благодаря @ Adám (удаленный Selection.WholeStory:звонок)

-10 благодаря @ Adám (допустим, чистая среда; удалить f.size=11:вызов)

-14 благодаря @ Adám (дерзкий селектор размера шрифта для выходного слова)

-2 благодаря @ Adám (bool ParamArray)

-13 для перехода ParamArray n()на nи ожидание ввода в качестве логического массива

-2 для перехода от модуля кода к ThisDocumentмодулю

Старая версия 114 байт

Принимает входные данные nкак ParamArray, в форме true,true,false,trueи выводит слово vbe.

Sub a(ParamArray n()):Set f=Selection.Font:For Each i In n
If i Then f.Grow Else f.Shrink
Next:Debug.?f.Size:End Sub

Старая версия, 199 байт

Принимает ввод в виде 170,-4,6,-1(принимает числа больше 1 по величине)

Sub a(ParamArray n()):Selection.WholeStory:Set f=Selection.Font:f.Size=12:For Each i In n
If i>1 Then
For j=i To 0 Step -1:f.Grow:Next
Else
For j=i To 0:f.Shrink:Next:End If:Next:Debug.?f.Size:End Sub

1
+1 (я бы дал больше, если бы мог). Почему ты Set f=.Size = 12?
Адам

1
Кроме того, вам нужно выбрать всю историю? разве текущий выбор не достаточно?
Адам

1
Не нужно разрешать несколько прогонов. Вы можете предполагать чистую окружающую среду.
Адам

1
Кстати, я изменяю заголовок OP, чтобы не было никакого смысла в том, что фактическая эмуляция должна быть сделана. Реальное использование тоже хорошо!
Адам


11

JavaScript (ES6), 103 101 байт

Принимает ввод как массив -1/ 1.

a=>a.map(k=>[1,12,28,36,48,72,80,1630,1638].map((v,i)=>n+=n>v&&k*[1,1,6,4,12,-16,2,-2,-8][i]),n=11)|n

Тест

Сохранено 2 байта благодаря ETHproductions


1
Совет: всякий раз, когда у вас есть a&&(b=c), вы можете сохранить байт с помощью a?b=c:0. Здесь, я думаю, вы даже можете сохранить два сn+=n>v&&k*[...][i]
ETHproductions

9

Python 2, 111 107 байт

i=10;r=range
for d in input():i+=d*(0<i+d<179)
print(r(1,12)+r(12,29,2)+[36,48,72]+r(80,1631,10)+[1638])[i]

Требуется ввод в [-1, 1, 1, -1, ...]формате. Это работает с примерами для некоторых дополнительных байтов:

for d in input():i=min(max(0,i+d),179)

Вы можете сохранить 3 байта, используя `if 0 <i <179: i + = d` внутри цикла for. Расходы на перевод строки и пробел в противном случае были бы 5.
ElPedro

Или i+=[0,d][0<i<179]может работать
NonlinearFruit

@NonlinearFruit Работает, но входит с тем же количеством байтов для меня (108). Выглядит гораздо круче и лучше, чем ifзаявление.
ElPedro

1
Оба предложения неверны. Это будет означать, что если мы ударим 0или 179мы застряли там навсегда.
orlp

@ orlp Хороший вопрос. Пропустил тот.
ElPedro

6

Октав, 93 89 87 байт

Входной массив может иметь целые числа больше 1 или меньше -1 для представления множества действий

L=11;for k=input(''),L=min(max(L+k,1),180);end;[1:11 [6:14 18 24 36 40:5:815 819]*2](L)

Благодаря Adám, язык изменен на Octave только для того, чтобы можно было использовать прямую индексацию в массиве.

Сохранено 2 байта благодаря rahnema1.

Тест

По идоне


1
Сохраните 3 байта, удалив первый оператор и изменив последний на [1:12,14:2:28,36,48,72,80:10:1630,1638](L).
Адам

@ Adám Хорошая идея, но тогда она работает только в Октаве
Луис Мендо

@ LuisMendo, спасибо, исправил.
Мохсен Носратиниа

1
@LuisMendo Так? Измените язык только на Octave.
Адам

2
[1:11 [6:14 18 24 36 40:5:815 819]*2]некоторые байты могут быть сохранены!
rahnema1

4

Рубин, 106 байт

Мне удалось сбрить пару байтов из решения Python (и это заняло некоторое время для бритья).

->n{[*1..12,*(14..28).step(2),36,48,72,*(80..1630).step(10),1638][n.inject(11){|a,b|[0,179,a+b].sort[1]}]}

Это анонимная функция, которая принимает данные в форме [1, -1, 1, 1, ...]. Похоже, что он довольно хорошо справляется с вводом в форме [170,-12], но я не могу гарантировать, что он будет работать 100% времени, поэтому я буду осторожен и скажу, что он работает [1, -1, 1, 1, ...].

Трюки, которые я использовал:

  • [0,179,a+b].sort[1]: Это ограничение a+bот 0 до 179, которые являются действительными индексами массива font-size.

  • Использование оператора splat для диапазонов преобразует их в массивы, поэтому из них генерируются доступные размеры шрифта [*1..12,*(14..28).step(2),36,48,72,*(80..1630).step(10),1638]. Который является плоским массивом, содержащим значения от каждого из сплющенных элементов:

    • 1..12это диапазон от 1 до 12 (включительно). Оператор splat превращает его в значения 1, 2, 3, ..., 11, 12.
    • (14..28).step(2)является перечислителем для данного диапазона, где каждый шаг увеличивается на 2. Оператор splat превращает его в значения 14, 16, 18, ..., 26, 28.
    • Отдельные значения ( 36, 48, 72, 1638) объединяются в своей позиции в массив большого размера шрифта.
  • Я использовал метод inject(/ reduce), который использует каждый элемент входного массива, в то же время сокращая их до переменной «memo» (как выражается в ruby). Я инициализирую это как 11, и тело каждой итерации вставки должно установить эту переменную памятки в результат добавления текущего элемента ввода к текущему значению памятки, а затем зафиксировать его между 0 и 180.

Приветствую оператора сплат!


2

PHP, 116 байт

сначала генерирует индекс размера (от 1 до 180 включительно),
затем сопоставляет его с размером точки и печатает результат.

for($s=11;$d=$argv[++$i];$s=min($s+$d,180)?:1);echo$s>12?$s>20?$s>23?$s*10-160-2*($s>179):24+(12<<$s-21):$s*2-12:$s;

берет +Nи -1из аргументов командной строки.
( -Nтакже принимается; просто позаботьтесь о том, чтобы размер не перепрыгивал ниже нуля!)

Беги с -nr.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.