Scrollen Sie durch die Schriftgrößenauswahl von Word

32

Wörter und Schaltflächen ändern die Schriftgröße nach folgenden Regeln:A

  1. Die Anfangsschriftgröße ist 11.
  2. Wenn gedrückt wird, wenn die Schriftgröße 1 ist, bleibt die Größe 1.
  3. Die Schriftgröße ändert sich mit 1 Punkt im Bereich von 1 bis 12.
  4. Die Schriftgröße ändert sich mit 2 Punkten im Bereich von 12 - 28.
  5. Zur Auswahl stehen 28, 36, 48, 72 und 80 im Bereich von 28 bis 80.
  6. Die Schriftgröße ändert sich mit 10 Punkten im Bereich von 80 - 1630.
  7. Die Schriftgröße ändert sich mit 8 Punkten im Bereich 1630 - 1638.
  8. Wenn bei einer Schriftgröße von 1638 gedrückt wird, bleibt die Schriftgröße bei 1638.A

Aufgabe

Bestimmen Sie die resultierende Schriftgröße in so wenigen Bytes wie möglich, wenn Sie eine Reihe von Tastendrücken in einem angemessenen Format ausführen.

Beispiele

[3,-1,2], was bedeutet : Das Ergebnis ist 18.AAAAA

Einige mögliche Formate sind '^^^v^^', [1 1 1 -1 1 1], [True,True,True,False,True,True], ["+","+","+","-","+","+"], "‘‘‘’‘‘", "⛄️⛄️⛄️🌴⛄️⛄️", 111011, "CaB", etc ...

[2]: 14

[-1]: 10

[13]: 80

[-11,1]: 2

[11,-1]: 36

[170,-1]: 1630

[2000,-2,100]: 1638

Adam
quelle
3
Müssen wir den Satz von Knopfdrücken in genau diesem Format nehmen? Zum Beispiel würde diese ganz oder teilweise in Ordnung sein , wie gut: "^vvv^v^^^v", [-1, 1, 1, -1, 1, -1], [0, 1, 0, 1, 1, 0, 1]?
Orlp
@orlp Ja. Ursprünglich habe ich sie geschrieben, aber ich fand die Formate albern. Ich werde sie sofort einsetzen.
Adám
2
Wie wäre es mit "😀😀😀😟😀😀" oder "⛄️⛄️⛄️🌴⛄️⛄️"
Nick T
3
@ NickT Das ist in Ordnung.
Adám

Antworten:

6

MATL , 49 47 45 Bytes

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

Das Eingabeformat ist [1 1 -1 1 1 -1 -1 -1]oder [2 -1 2 -3], mit optionalen Kommas.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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
Luis Mendo
quelle
Endlich eine Golfsprache. Ich begann mich zu wundern ...
Adám
2
@ Adám Wir brauchen eine Antwort in APL :)
orlp
@APL ist keine Golfsprache. 8 × 6 = 48, nicht 68
Adám
1
@APL ist kein erwähnenswerter Benutzer, auch kein Benutzer.
Matthew Roh
43

Word VBA, 199 147 126 116 102 100 87 85 Bytes

Warum emulieren, wenn Sie es können ?!

Deklarierte Funktion im ThisDocumentModul, die Eingaben nin Form von Array(true,true,false,true)und Ausgaben an den Word-Schriftgrößenselektor annimmt :P

Golf gespielt:

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

Ich bin ein .GIF!

Vielen Dank

-21 danke an @ Adám (entfernter Selection.WholeStory:Anruf)

-10 danke an @ Adám (gehe von einer sauberen Umgebung aus; entferne f.size=11:Anruf)

-14 dank @ Adám (freche Auswahl der Schriftgröße für die Ausgabe von Wörtern)

-2 danke an @ Adám (bool ParamArray)

-13 für den Wechsel ParamArray n()auf nund erwartete Eingabe als Boolean Array

-2 für den Wechsel von einem Codemodul zu dem ThisDocumentModul

Alte Version 114 Bytes

nÜbernimmt Eingaben als ParamArray in Form von true,true,false,trueund gibt das Wort Vbe-Direktfenster aus

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

Ältere Version, 199 Bytes

Nimmt Eingaben in Form von 170,-4,6,-1(akzeptiert Zahlen, die größer als 1 sind)

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
Taylor Scott
quelle
1
+1 (Ich würde mehr geben, wenn ich könnte). Warum tust du das Set f=.Size = 12?
Adám
1
Müssen Sie auch die ganze Geschichte auswählen? reicht die aktuelle auswahl nicht
Adám
1
Keine Notwendigkeit, mehrere Läufe zuzulassen. Sie können von einer sauberen Umgebung ausgehen.
Adám
1
Übrigens ändere ich den OP-Titel so, dass nicht impliziert wird, dass eine tatsächliche Emulation durchgeführt werden muss. Echte Verwendung ist auch in Ordnung!
Adám
2
Verwenden Sie
Adám
11

JavaScript (ES6), 103 bis 101 Byte

Nimmt Eingaben als Array von -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

Prüfung

2 Bytes gespart dank ETHproductions

Arnauld
quelle
1
Ein Tipp: Wann immer Sie möchten a&&(b=c), können Sie mit ein Byte speichern a?b=c:0. Hier kann man mitn+=n>v&&k*[...][i]
ETHproductions
9

Python 2, 111 107 Bytes

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]

Erfordert Eingaben im [-1, 1, 1, -1, ...]Format. Es funktioniert mit den Beispielen für einige zusätzliche Bytes:

for d in input():i=min(max(0,i+d),179)
orlp
quelle
Sie können 3 Bytes sparen, indem Sie in der for-Schleife `if 0 <i <179: i + = d` verwenden. Kosten Sie einen Zeilenvorschub und ein Leerzeichen Einzug sonst wäre 5.
ElPedro
Oder i+=[0,d][0<i<179]könnte funktionieren
NonlinearFruit
@NonlinearFruit Funktioniert, kommt aber bei mir mit der gleichen Byteanzahl an (108). Sieht viel cooler und golfiger aus als ein ifStatement.
ElPedro
1
Beide Vorschläge sind falsch. Es würde bedeuten, dass wenn wir schlagen 0oder 179für immer dort festsitzen.
Orlp
@orlp Guter Punkt. Habe das verpasst.
ElPedro
6

Oktave, 93 89 87 Bytes

Das Eingabearray kann ganze Zahlen größer als 1 oder kleiner als -1 haben, um eine Vielzahl von Aktionen darzustellen

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)

Dank Adám wurde die Sprache in Octave geändert, um nur die direkte Indizierung in ein Array verwenden zu können.

2 Bytes gespart dank rahnema1.

Prüfung

Auf Ideone

Mohsen Nosratinia
quelle
1
Speichern Sie 3 Byte, indem Sie die erste Anweisung entfernen und die letzte in ändern [1:12,14:2:28,36,48,72,80:10:1630,1638](L).
Adám
@ Adám Gute Idee, aber dann funktioniert es nur in Octave
Luis Mendo
@ LuisMendo, danke, behoben.
Mohsen Nosratinia
1
@ LuisMendo Also? Ändern Sie die Sprache nur in Oktave.
Adám
2
[1:11 [6:14 18 24 36 40:5:815 819]*2]Einige Bytes können gespeichert werden!
rahnema1
4

Rubin, 106 Bytes

Ich habe es geschafft, ein paar Bytes von der Python-Lösung zu rasieren (und es hat eine Weile gedauert, bis ich mich rasiert habe).

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

Es ist eine anonyme Funktion, die die Eingabe in Form von [1, -1, 1, 1, ...]. Es scheint ziemlich gut mit Eingaben in der Form umzugehen [170,-12], aber ich kann nicht garantieren, dass es 100% der Zeit funktionieren wird, also gehe ich auf Nummer sicher und sage, dass es funktioniert [1, -1, 1, 1, ...].

Tricks, die ich verwendet habe:

  • [0,179,a+b].sort[1]: Diese Angabe a+bmuss zwischen 0 und 179 liegen. Dies sind die gültigen Indizes des Schriftgrößen-Arrays.

  • Wenn Sie den splat-Operator für Bereiche verwenden, werden diese in Arrays konvertiert, sodass die verfügbaren Schriftgrößen aus generiert werden [*1..12,*(14..28).step(2),36,48,72,*(80..1630).step(10),1638]. Welches ist ein flaches Array, das die Werte von jedem der abgeflachten Elemente enthält:

    • 1..12ist ein Bereich von 1 bis 12 (einschließlich). Der splat-Operator wandelt es in Werte um 1, 2, 3, ..., 11, 12.
    • (14..28).step(2)ist ein Enumerator für den angegebenen Bereich, in dem jeder Schritt um 2 erhöht wird. Der splat-Operator wandelt ihn in die Werte um 14, 16, 18, ..., 26, 28.
    • Die einzelnen Werte ( 36, 48, 72, 1638) sind alle in ihrer Position in dem großen Schriftgrößenarray verkettet.
  • Ich habe die inject(/ reduce) -Methode verwendet, die jedes Element des Eingabearrays verwendet, während sie in eine 'Memo'-Variable reduziert wurde (wie Ruby es ausdrückt). Ich initialisiere dies auf 11, und der Hauptteil jeder Injektionsiteration setzt diese Memovariable auf das Ergebnis des Addierens des aktuellen Elements der Eingabe zum aktuellen Memowert und klemmt es dann zwischen 0 und 180.

Alle begrüßen den Splat-Operator!

IMP1
quelle
2

PHP, 116 Bytes

erzeugt zuerst den Größenindex (von 1 bis einschließlich 180),
ordnet diesen dann der Punktgröße zu und druckt das Ergebnis aus.

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;

nimmt +N und -1von Befehlszeilenargumenten.
( -Nwird auch akzeptiert; achte nur darauf, dass die Größe nicht unter Null springt!)

Laufen Sie mit -nr.

Titus
quelle
1

Perl 5 , 123 Bytes

122 Byte Code + 1 für -a

@a=1..12;push@a,map$_*2,7..14;push@a,map$_*($i=10),3.6,4.8,7.2,8..163,163.8;$i=($"=$i+$_)<0?0:$">179?179:$"for@F;say$a[$i]

Probieren Sie es online!

Eingabeformat:

32 -32 12 4 -2
Xcali
quelle