Die Cheela (aus dem Buch Dragon's Egg von Robert L. Forward) sind Wesen, die auf der Oberfläche eines Neutronensterns leben. Ihr Körper ist flach und kreisförmig mit zwölf Augen am Umfang, weshalb sie natürlich ein Basis-12-Nummerierungssystem verwenden.
Bei den Cheela sind die Betreuung der Jungtiere und die Erziehung der Jungen Aufgaben der Alten. Da der junge Cheela das Multiplizieren beibringen muss, könnten die Alten eine Multiplikationstabelle verwenden.
Ihre Aufgabe ist es, eine 12
x- 12
Multiplikationstabelle 12
wie die folgende in base zu erstellen . Großbuchstaben A
und B
sind für die Ziffern entsprechend dezimal verwendet 10
und 11
jeweils.
1 2 3 4 5 6 7 8 9 A B 10
2 4 6 8 A 10 12 14 16 18 1A 20
3 6 9 10 13 16 19 20 23 26 29 30
4 8 10 14 18 20 24 28 30 34 38 40
5 A 13 18 21 26 2B 34 39 42 47 50
6 10 16 20 26 30 36 40 46 50 56 60
7 12 19 24 2B 36 41 48 53 5A 65 70
8 14 20 28 34 40 48 54 60 68 74 80
9 16 23 30 39 46 53 60 69 76 83 90
A 18 26 34 42 50 5A 68 76 84 92 A0
B 1A 29 38 47 56 65 74 83 92 A1 B0
10 20 30 40 50 60 70 80 90 A0 B0 100
Die Ausgabe sollte auf dem Bildschirm gedruckt werden. Das Format sollte wie folgt sein:
- Zahlen sollten in jeder Spalte nach rechts ausgerichtet werden.
- Führende Leerzeichen vor der ersten Spalte, nachfolgende Leerzeichen nach der letzten Spalte oder eine nachfolgende neue Zeile nach der letzten Zeile sind zulässig.
Die Trennung zwischen den Spalten kann ein Leerzeichen (wie oben gezeigt) oder mehr als ein Leerzeichen sein, die Anzahl der Leerzeichen sollte jedoch zwischen den Spalten übereinstimmen. Berücksichtigen Sie zum Messen des Spaltenabstands, dass die angezeigten Zahlen alle führenden Leerzeichen enthalten, die zur Erfüllung von Anforderung 1 erforderlich waren (daher belegt jede Zahl drei Zeichen, von denen das erste Leerzeichen sein kann). Die Tabelle mit der Trennung von zwei Leerzeichen sieht beispielsweise folgendermaßen aus:
1 2 3 4 5 6 7 8 9 A B 10 2 4 6 8 A 10 12 14 16 18 1A 20 3 6 9 10 13 16 19 20 23 26 29 30 4 8 10 14 18 20 24 28 30 34 38 40 5 A 13 18 21 26 2B 34 39 42 47 50 6 10 16 20 26 30 36 40 46 50 56 60 7 12 19 24 2B 36 41 48 53 5A 65 70 8 14 20 28 34 40 48 54 60 68 74 80 9 16 23 30 39 46 53 60 69 76 83 90 A 18 26 34 42 50 5A 68 76 84 92 A0 B 1A 29 38 47 56 65 74 83 92 A1 B0 10 20 30 40 50 60 70 80 90 A0 B0 100
Computerspeicher auf einem Neutronenstern ist sehr teuer, daher sollte Ihr Code so wenig Byte wie möglich enthalten.
Erweiterte Herausforderung und Bonus
Idealerweise sollte Ihr Code in anderen Teilen des Universums wiederverwendet werden, wo möglicherweise andere Nummerierungssysteme verwendet werden. Zu diesem Zweck wird die Abfrage optional wie folgt erweitert: Ihr Code akzeptiert eine Zahl N
als Eingabe und generiert eine N
x- N
Multiplikationstabelle in der Basis N
mit dem obigen Format.
Die Eingabe kann über die Tastatur oder als Funktionsargument erfolgen. Das Programm oder die Funktion sollte funktionieren für 2
≤ N
≤ 36
, als Ziffern unter Verwendung der ersten N
Zeichen der Folge 0
, 1
, ..., 9
, A
, B
, ..., Z
(Großbuchstaben)
Diese erweiterte Herausforderung ist optional. Wenn Sie dieser Route folgen, reduzieren Sie Ihre Byteanzahl um 20% (es ist nicht erforderlich, auf eine Ganzzahl zu runden).
quelle
Because they have twelve eyes, they naturally use a base-12 numbering system.
Na klar. Das ist der Grund, warum wir immerhin Binary verwenden ... ;-)Antworten:
Pyth, 27 · 0,8 = 21,6
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle
CJam, 33 × 0,8 = 26,4 Bytes
Teste es hier.
Dies verwendet die minimal erforderliche Trennung.
Erläuterung
Tabelle für die Eingabe
22
(die größte, die ohne horizontale Bildlaufleiste in den Beitrag passt):quelle
MATL , 42 * .8 = 33,6
Haftungsausschluss
Da der Ersteller der Sprache und der Autor der Herausforderung identisch sind, ist diese Antwort nicht gewinnberechtigt .
Eine Diskussion darüber, ob diese Einschränkung erforderlich ist oder nicht, finden Sie in dieser Meta-Frage .
Code
Dies verwendet den minimalen Abstand.
Beispiel
Oktal-Multiplikationstabelle
Erläuterung
Bearbeiten: Probieren Sie es online!
Um im Online-Compiler (Stand: 19. Februar 2016) ausgeführt zu werden, wechseln Sie
Y)
zuX:
und entfernen Sie[]
. Dies dient der Anpassung an Änderungen, die an der Sprache vorgenommen wurden, seit diese Herausforderung veröffentlicht wurde.quelle
Bash + BSD-Dienstprogramme, 36
Funktioniert
rs
sofort unter OS X. Möglicherweise muss es auf Linux-Systemen installiert werden.Co{1..12}d{1..12}*p
umCo1d1*p Co1d2*p Co1d3*p ... Co1d12*p ... Co12d12*p
.dc
Ausdruck, der die erforderlichen Begriffe generiert.Co
Setzt die Ausgabebasis auf 12.d
Wird anstelle eines Leerzeichens als Trennzeichen zwischen Zahlen verwendet, sodass in der geschweiften Klammer kein Escape erforderlich ist.d
dupliziert tatsächlich die Oberseite des Stapels, dies wird jedoch effektiv ignoriert und verworfen.dc
ist eine einzelne durch Leerzeichen getrennte Zeile.rs
Formt dies in ein 12x12-Array um.-j
rechtfertigt jeden Begriff.quelle
Pyth, 36 Bytes
Probieren Sie es hier aus.
quelle
Km+1dUJ12
mitKSJ12
.S
schafft den Bereich[1, 2, ..., 12]
. Sie können beidej""
undjk
mit ersetzens
, da Ihre Verbindungszeichenfolgen. Und noch ein Byte: Wechslerjbm...K1
zujmr...1K
. Mit diesen Änderungen erhalten Sie 28 Bytes:KSJ12jmrsm.[\ 4sm.Hbj*dkJK1K
Python,
153147132 Bytes * 0,8 = 105,6Bis zu 132 Bytes dank dem Rat von Tim Pederick! :)
quelle
rjust
('%4s'%f(...)
). Prüfen Sie, ob der Druck jedes Wertes mitprint ...,
(und dann mit einemprint
für die neue Zeile) kürzer ist alsjoin
. Versuchen Sie in diesem Fall, die Schleifen zu reduzieren .and
Aor
B) innerhalb der Funktion gewechselt sindf
, indem Sien>=b
. Ich habe das getan, bis mir klar wurde, dass es nicht kürzer war als das, was ich vorher hatte,n//b
... aber Sie verwenden Python 2! Mit können Sie ein Byte speichernn/b
.CJam,
38333238 * (.8) = 30,4 ByteProbieren Sie es hier aus.
(Sieht Martin jetzt ziemlich ähnlich.)
quelle
Perl 6 , 60 Bytes -20% = 48 Bytes
(Das ist fast genau so, wie ich es schreiben würde, selbst wenn ich nicht versuchen würde, es so kurz wie möglich zu machen.)
Verwendung:
quelle
for(
als Beginn des Aufrufs einer Subroutine mit dem Namenfor
anstelle desfor
Konstrukts der Modifikatorschleife behandelt würde . Welches würde einen Kompilierungsfehler verursachen.JavaScript (ES6) 84 (105-20%)
Der naheliegende Weg, um damit zu beginnen.
Anmerkungen
alert
ist nicht der beste Weg, die Tabelle auszugeben, aber der kürzere, da explizit eine Aufforderung zur "Anzeige auf dem Bildschirm" vorliegtWeniger golfen
quelle
Python 3, 126 - 20% = 100,8 Bytes
Die äußere Funktion
t
ist diejenige, die die Multiplikationstabelle tatsächlich druckt. Die innere Funktioni
führt die Umwandlung einer Zahl in eine Basis von 2 bis 36 durch.Hutspitze zu Boomerang für ihre Lösung und für eine Golfspitze. Ich habe es vermieden, irgendetwas aus Boomerangs Lösung zu kopieren, aber ich habe mir erlaubt, einen Blick darauf zu werfen, um zu sehen, wo ich mehr herausschneiden könnte. Und schon vorher stellte ich fest, dass je mehr ich Golf spielte, desto mehr meins aussah wie das von Boomerang!
quelle
print(i(15,12),i(120,12),i(144,12),i(150,12))
Ihren Code zurückgeben,13 A0 00 06
anstatt13 A0 100 106
. Leider muss für die Aufgabe eine dreistellige Basis-n-Zahl (100) gedruckt werden. Es sollte nicht zu schwierig sein, es zu beheben, aber es könnte ein paar Bytes hinzufügen ...n>=b
nicht seinn>b
.def t(b): i=lambda n:(n>=b and i(n//b)or'')+chr(n%b+[48,55][n%b>9]) R=range(b) for r in R:print(*('%3s'%i(~r*~c)for c in R))
Ich würde das gerne in meiner Lösung tun, aber jetzt sind unsere beiden Lösungen ziemlich nahe beieinander. Könnte auch die bessere verbessern ^^Javascript (ES6)
96,893,6 Bytes (20% von 117)Erläuterung
- 4 Bytes dank @ edc65 gespart
quelle
alert(b)
ohneeval
ist kürzer. Und zumindest vermeiden Sie Variablea
, es ist nutzlosb+=' '.repeat(4-a.length)+(i*j).toString(n).toUpperCase()
a
wie rechnest du dann...repeat(4-a.length)...
?MATLAB,
111 × 0,8 = 88,8110×0,8 = 88 BytesMein Debüt hier:
Erläuterung:
[1:N]'*[1:N]
Multiplikationstabelle in Basis 10 erstellendec2base([1:N]'*[1:N],N)
konvertiere zu Basis 12. Die Ausgabe ist ein Zeichen-Array mit führenden 0-sstrjoin(cellstr(dec2base(___)))
In Zelle und zurück in Zeichen konvertieren, um Zeichenfolgen mit Leerzeichen zu verbinden, was eine Zeichenfolge von 1x575 ergibt[' ',strjoin(___)]
Füge Raum hinzu, um 576 Elemente zu habenstrrep(___,' 0',' ')
entfernen Sie eine führende Null. Wir machen das zweimal, weil wir Strings mit zwei führenden Nullen habenreshape(___,4*N,N)'
Konvertieren Sie ein 1x576-Zeichen-Array in ein 48x12-Zeichen-Arraydisp(___)
das ergebnis ohne anzeigenans =
Ausgabe:
Wenn wir keine Anweisung zählen
N=12;
, werden5*.8=4
Bytes gespeichert. Wenn dieans =
Ausgabe toleriert wird, können wir dasdisp()
Speichern weiterer6*0.8=4.8
Bytes entfernen . Natürlich kann es auch andere Möglichkeiten geben, um Bytes zu speichern :)quelle
ans
Ausgabe toleriert, wenn es sich bei der Ausgabe um ein Funktionsargument handelt. In diesem Fall lautet die Aufforderung jedoch "Ausgabe sollte auf dem Bildschirm gedruckt werden" undans
ist daher nicht zulässig. AuchN
sollte als Input in die erweiterte Herausforderung genommen werden. Sie können diese mit einer anonymen Funktion lösen:@(n)disp(reshape(strrep(strrep([' ',strjoin(cellstr(dec2base([1:N]'*[1:N],N)))],' 0',' '),' 0',' '),4*N,N)')
, die Sie anrufen unter Verwendung würdenans(12)
Python 3:
166161152 - 20% = 121,6 ByteIch weiß, dass es den vorhandenen Python-Antworten unterlegen ist, aber ich habe mir vorgenommen, es zu versuchen. Es ist mein erstes Mal, dass ich etwas auf dieser Seite poste ...
quelle
APL,
3231 × 0,8 = 24,8 BytesIn origin 0. Auf Englisch:
∘.×⍨1+⍳⍵
: Multiplikationstabelle⍵⊥⍣¯1¨
: drücke in base ⍵ jedes Element der Multiplikationstabelle aus⊃∘(⎕D,⎕A)¨¨
: Wandelt die Vektortabelle von Zahlen in eine Vektortabelle von Zeichen um¯4↑¨
: Richten Sie jedes Element des Ergebnisses auf Länge 4 ausDie Standard-APL-Druckroutine macht das Richtige.
quelle
{¯4↑¨⊃∘(⎕D,⎕A)¨¨⍵⊥⍣¯1¨∘.×⍨1+⍳⍵}
Ruby,
6966 Zeichen - 20% = 52,8Probelauf:
quelle
ksh93, 51 * 0,8 = 40,8 Bytes
Dies sollte bis zur Basis 64 funktionieren (die größte von ksh unterstützte Basis). Beispiele:
quelle
Pyke, 14 Bytes * 0,8 = 11,2 Bytes, nicht konkurrenzfähig
Probieren Sie es hier aus!
Erläuterung:
Oder 12 Bytes ohne den Bonus
quelle