Cheela (z książki Dragon Egg przez Roberta L. przodu) to istoty, które żyją na powierzchni gwiazdy neutronowej. Ich ciało jest płaskie i okrągłe z dwunastoma oczami na obwodzie, więc naturalnie używają systemu numeracji base-12.
Opieka nad pisklętami i wychowanie młodych wśród Cheeli to zadania realizowane przez Starych. Ponieważ młodą Cheelę trzeba nauczyć, jak się rozmnażać, Starzy mogą korzystać z tablicy mnożenia.
Twoim zadaniem jest stworzenie w bazie 12
tabliczki 12
mnożenia x 12
, jak poniżej. Wielkie litery A
i B
są używane dla cyfr odpowiadających odpowiednio liczbom dziesiętnym 10
i 11
.
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
Wyjście powinno zostać wydrukowane na ekranie. Format powinien wyglądać następująco:
- Liczby powinny być wyrównane do prawej w każdej kolumnie.
- Dopuszczalne są spacje wiodące przed pierwszą kolumną, spacje końcowe za ostatnią kolumną lub nowa linia końcowa po ostatnim wierszu.
Separacja między kolumnami może być jedną spacją (jak pokazano powyżej) lub więcej niż jedną spacją, ale liczba spacji powinna być spójna między kolumnami. Aby zmierzyć separację kolumn, należy wziąć pod uwagę, że wyświetlane liczby obejmują spacje wiodące, które mogły być konieczne do spełnienia wymagania 1 (więc każda liczba zajmuje trzy znaki, z których pierwszą mogą być spacje). Na przykład tabela z separacją dwóch spacji wygląda następująco:
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
Przechowywanie komputera na gwiazdy neutronowej jest naprawdę drogie, więc kod powinien zajmować jak najmniej bajtów.
Rozszerzone wyzwanie i bonus
Najlepiej byłoby, gdyby kod był ponownie wykorzystywany w innych częściach wszechświata, gdzie mogą być używane inne systemy numeracji. W tym celu wyzwanie jest opcjonalnie rozszerzane w następujący sposób: Twój kod przyjmuje liczbę N
jako dane wejściowe i generuje tablicę mnożenia N
xw N
bazie N
, w powyższym formacie.
Dane wejściowe mogą pochodzić z klawiatury lub jako argument funkcji. Program lub funkcja powinna działać dla 2
≤ N
≤ 36
, używając cyfr jako pierwsze N
znaki sekwencji 0
, 1
, ..., 9
, A
, B
, ..., Z
(wielkimi literami)
To rozszerzone wyzwanie jest opcjonalne. Jeśli podążysz tą drogą, zmniejsz o 20% liczbę bajtów (nie musisz zaokrąglać do liczby całkowitej).
źródło
Because they have twelve eyes, they naturally use a base-12 numbering system.
Cóż, oczywiście. Właśnie dlatego używamy plików binarnych ... ;-)Odpowiedzi:
Pyth, 27 * 0,8 = 21,6
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
CJam, 33 * 0,8 = 26,4 bajtów
Sprawdź to tutaj.
Wykorzystuje to minimalną wymaganą separację.
Wyjaśnienie
Tabela wprowadzania danych
22
(największa, która mieści się we wpisie bez poziomego paska przewijania):źródło
MATL , 42 * .8 = 33,6
Zrzeczenie się
Ponieważ twórca języka i autor wyzwania są tacy sami, ta odpowiedź nie kwalifikuje się do wygrania .
W celu dyskusji, czy to ograniczenie jest konieczne, czy nie, zobacz to meta pytanie .
Kod
Wykorzystuje to minimalną separację.
Przykład
Ośmiokrotna tabliczka mnożenia
Wyjaśnienie
Edycja: Wypróbuj online!
Aby uruchomić w kompilator online (na dzień 19 lutego 2016), zmiany
Y)
doX:
i wyjąć[]
. Ma to na celu dostosowanie się do zmian dokonanych w języku od czasu opublikowania tego wyzwania.źródło
Narzędzia Bash + BSD, 36
Działa od razu
rs
po instalacji w systemie OS X. Może być konieczne zainstalowanie go w systemach Linux.Co{1..12}d{1..12}*p
doCo1d1*p Co1d2*p Co1d3*p ... Co1d12*p ... Co12d12*p
.dc
wyrażenie generuje wymagane terminy.Co
ustawia wyjściową podstawę na 12.d
jest używany jako separator między liczbami zamiast spacji, więc nie jest wymagane ucieczka w rozwinięciu nawiasu.d
faktycznie duplikuje górę stosu, ale jest to skutecznie ignorowane i odrzucane.dc
to pojedyncza linia oddzielona spacjami.rs
przekształca to w tablicę 12x12.-j
uzasadnia każdy termin.źródło
Pyth, 36 bajtów
Wypróbuj tutaj.
źródło
Km+1dUJ12
zKSJ12
.S
tworzy zakres[1, 2, ..., 12]
. Można zastąpić zarównoj""
ijk
zes
, ponieważ swoimi łączenia ciągów. I kolejny bajt: zmieńrjbm...K1
najmr...1K
. Dzięki tym zmianom otrzymujesz 28 bajtów:KSJ12jmrsm.[\ 4sm.Hbj*dkJK1K
Python,
153147132 bajtów * 0,8 = 105,6Do 132 bajtów dzięki radom Tima Pedericka! :)
źródło
rjust
('%4s'%f(...)
). Sprawdź, czy wydruk każdej wartości za pomocąprint ...,
(a następnie jednejprint
dla nowego wiersza) jest krótszy niżjoin
. Jeśli tak, spróbuj zwinąć pętle .and
Aor
B) wewnątrz funkcjif
, używającn>=b
. Robiłem to, dopóki nie zdałem sobie sprawy, że nie jest on krótszy niż to, co miałem wcześniejn//b
... ale używasz Python 2! Możesz zapisać bajt za pomocąn/b
.CJam,
38333238 * (.8) = 30,4 bajtówWypróbuj tutaj.
(Wygląda teraz bardzo podobnie do Martina).
źródło
Perl 6 , 60 bajtów -20% = 48 bajtów
(Jest to prawie dokładnie tak, jak bym to napisał, nawet gdybym nie starał się, żeby było tak krótko, jak tylko mogłem)
Stosowanie:
źródło
for(
jako początek wywołania podprogramu o nazwiefor
zamiastfor
konstrukcji pętli modyfikatora . Co spowodowałoby błąd kompilacji.JavaScript (ES6) 84 (105-20%)
Na początek oczywisty sposób.
Uwagi
alert
nie jest najlepszym sposobem na wyświetlenie tabeli, ale jest krótszy, ponieważ istnieje wyraźne żądanie „wyświetlenia na ekranie”Mniej golfa
źródło
Python 3, 126 - 20% = 100,8 bajtów
Funkcja zewnętrzna
t
, to ta, która faktycznie drukuje tabliczkę mnożenia. Funkcja wewnętrznai
, dokonuje konwersji liczby na bazę z 2 do 36.Czapka dla Boomeranga za ich rozwiązanie i wskazówkę golfową. Unikałem kopiowania czegokolwiek z rozwiązania Boomeranga, ale pozwoliłem sobie spojrzeć na to, aby zobaczyć, gdzie mogę wyciąć więcej. I nawet wcześniej odkryłem, że im bardziej grałem w golfa, tym bardziej mój wyglądał jak Boomerang!
źródło
print(i(15,12),i(120,12),i(144,12),i(150,12))
kod,13 A0 00 06
zamiast zwraca13 A0 100 106
. Niestety zadanie wymaga wydrukowania jednej 3-cyfrowej podstawowej liczby n (100).n>=b
, nien>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))
chciałbym to zrobić w moim rozwiązaniu, ale teraz oba nasze rozwiązania są dość podobne, równie dobrze mogłyby poprawić ten lepszy ^^JavaScript (ES6)
96,893,6 Bajty (20% z 117)Wyjaśnienie
- zapisane 4 bajty dzięki @ edc65
źródło
alert(b)
bezeval
jest krótsze. I przynajmniej unikaj zmienneja
, jest bezużytecznab+=' '.repeat(4-a.length)+(i*j).toString(n).toUpperCase()
a
sposobu obliczania...repeat(4-a.length)...
?MATLAB,
111 * 0,8 = 88,8110 * 0,8 = 88 bajtówMój debiut tutaj:
Wyjaśnienie:
[1:N]'*[1:N]
stwórz tabliczkę mnożenia w bazie 10dec2base([1:N]'*[1:N],N)
przekonwertować na bazę 12. Wyjściem jest tablica char z wiodącymi 0-sstrjoin(cellstr(dec2base(___)))
konwertuj na komórkę i z powrotem na znak łączący ciągi z odstępem dającym ciąg 1x575[' ',strjoin(___)]
dodaj miejsce, aby mieć 576 elementówstrrep(___,' 0',' ')
usuń jedno wiodące zero. Robimy to dwa razy, ponieważ mamy ciągi znaków z dwoma zerami wiodącymireshape(___,4*N,N)'
konwertuj tablicę znaków 1x576 na tablicę znaków 48x12disp(___)
wyświetl wynik bezans =
Wydajność:
Jeśli nie liczymy instrukcji
N=12;
,5*.8=4
bajty są zapisywane. Ponadto, jeślians =
wyjście jest tolerowane, możemy usunąćdisp()
zapisywanie kolejnych6*0.8=4.8
bajtów. Oczywiście mogą istnieć inne sposoby zapisywania bajtów :)źródło
ans
wyjście jest tolerowane, jeśli wyjście jest argumentem funkcji. Ale w tym przypadku wyzwanie mówi „wydruk powinien być wydrukowany na ekranie”, więcans
nie jest dozwolony. Ponadto,N
powinny być traktowane jako dane wejściowe w rozszerzonym wyzwanie. Możesz to rozwiązać za pomocą anonimowej funkcji:@(n)disp(reshape(strrep(strrep([' ',strjoin(cellstr(dec2base([1:N]'*[1:N],N)))],' 0',' '),' 0',' '),4*N,N)')
którą nazwałbyś za pomocąans(12)
Python 3:
166161152 - 20% = 121,6 bajtówWiem, że jest gorszy od istniejących odpowiedzi w języku Python, ale postanowiłem spróbować. To mój pierwszy post na tej stronie…
źródło
APL,
3231 × 0,8 = 24,8 bajtówPochodzenie 0. W języku angielskim:
∘.×⍨1+⍳⍵
: tabliczka mnożenia⍵⊥⍣¯1¨
: wyraż w bazie ⍵ każdy element tablicy mnożenia⊃∘(⎕D,⎕A)¨¨
: przekształca tabelę wektorową liczb w tabelę wektorów znaków¯4↑¨
: wyrównaj do prawej 4 długości każdego elementu wynikuDomyślna procedura drukowania APL działa poprawnie.
źródło
{¯4↑¨⊃∘(⎕D,⎕A)¨¨⍵⊥⍣¯1¨∘.×⍨1+⍳⍵}
Rubinowy,
6966 znaków - 20% = 52,8Przykładowy przebieg:
źródło
ksh93, 51 * 0,8 == 40,8 bajtów
Powinno to działać do podstawy 64 (największa podstawa obsługiwana przez ksh). Przykłady:
źródło
Pyke, 14 bajtów * 0,8 = 11,2 bajtów, niekonkurencyjny
Wypróbuj tutaj!
Wyjaśnienie:
Lub 12 bajtów bez premii
źródło