Wyzwanie
Biorąc pod uwagę reprezentację ASCII liczby babilońskiej jako danych wejściowych, wypisz liczbę cyframi zachodnioafrykańskimi.
Babiloński system liczbowy
Jak liczą się Babilończycy? Co ciekawe, zastosowali system Base 60 z elementem systemu Base 10. Rozważmy najpierw kolumnę jednostki w systemie:
Babilończycy mieli tylko trzy symbole: T
(lub, jeśli potrafisz to wyrenderować:), 𒐕
które reprezentowały 1, i <
(lub, jeśli możesz to renderować:), 𒌋
które reprezentowały 10, i \
(lub, jeśli renderujesz:), 𒑊
które reprezentowały zero.
Uwaga: Technicznie \
(lub 𒑊
) nie jest zerowy (ponieważ Babilończycy nie mieli pojęcia „zero”). „Zero” zostało wynalezione później, podobnie \
jak symbol zastępczy dodano później, aby zapobiec dwuznaczności. Jednak do celów tego wyzwania wystarczy uznać \
za zero
Tak więc w każdej kolumnie dodajesz tylko wartość symboli, np .:
<<< = 30
<<<<TTTTTT = 46
TTTTTTTTT = 9
\ = 0
W każdej kolumnie nigdy nie będzie więcej niż pięć <
lub więcej niż dziewięć T
. \
zawsze pojawi się sam w kolumnie.
Teraz musimy rozszerzyć to na dodawanie kolejnych kolumn. Działa to dokładnie tak samo, jak każda inna podstawa sześćdziesiąt, gdzie mnożymy wartość skrajnej prawej kolumny przez , tej po lewej przez , tej po lewej przez i tak dalej. Następnie dodajesz wartość każdego z nich, aby uzyskać wartość liczby.60 1 60 2
Kolumny zostaną oddzielone spacjami, aby zapobiec dwuznaczności.
Kilka przykładów:
<< <TT = 20*60 + 12*1 = 1212
<<<TT \ TTTT = 32*60^2 + 0*60 + 4*1 = 115204
Zasady
- Możesz zaakceptować wejście ASCII (
T<\
) lub wejście Unicode (𒐕𒌋𒑊
) - Wprowadzona liczba zawsze będzie mniejsza niż
<
Y zawsze będzie w lewą stronę zT
S w każdej kolumnie\
zawsze pojawi się sam w kolumnie
Zwycięski
Najkrótszy kod w bajtach wygrywa.
źródło
<<<<TTTTTT <TTTTTTT <<<<TTTTTT <<<<
"How did the Babylonians count? Interestingly, they used a Base 60 system with an element of a Base 10 system."
Który jest nadal w użyciu; babiloński system liczbowy jest dokładnie tym, czego używamy do zegarów. Dwie cyfry dziesiętne każda na sekundę, minutę i godzinę, 60 sekund na minutę, 60 minut na godzinę.Odpowiedzi:
JavaScript (ES6), 44 bajty
Pobiera dane wejściowe jako tablicę znaków ASCII.
Wypróbuj online!
W jaki sposób?
Babiloński system liczbowy może być postrzegany jako język 4-instrukcji współpracujący z jednym rejestrem - nazwijmy go akumulatorem.
Począwszy od , każdy znak tablicy wejściowej modyfikuje akumulator w następujący sposób:c a kk = 0 do za k
space
: pomnóż przez (zaimplementowane jako: dodaj do )60 59 k k<
: dodaj dotysT
: przyrost\
: nic nie robić; to jestNOP
instrukcja tego języka (zaimplementowana jako: dodaj do )tysźródło
C (gcc) ,
140138136 bajtówWypróbuj online!
źródło
Perl 6 , 39 bajtów
-3 bajty dzięki nwellnhof
Wypróbuj online!
Wykorzystuje znaki klinowe.
Wyjaśnienie:
źródło
{:60[.words>>.&{sum (.ords X%151)X%27}]}
(40 bajtów)Galaretka ,
1312 bajtówMonadyczny link akceptujący listę znaków, który daje liczbę całkowitą.
Wypróbuj online!
W jaki sposób?
Kolejne 12:
ḲO⁽¡€%:5§ḅ60
(⁽¡€
jest1013
, więc modulos1013
przez TheO
wartości rdinal się53
,5
i1
na<
,T
,\
odpowiednio, po czym przeprowadza całkowitą podziału:
przez5
uzyskać10
,1
i0
)źródło
05AB1E , 13 bajtów
Wypróbuj online!
Aby zrekompensować lenistwo związane z moją odpowiedzią na żelki, oto zgłoszenie w 05AB1E xD.
źródło
8740
?•Yη•
(4 bajty)1|Ç7%-13%O60β
ma również 13 lat - czy można grać w golfa?Python 2 ,
96938785 bajtówWypróbuj online!
Zapisano:
źródło
(ord(c)%5/2or 11)-1
8740%ord(c)/4
Excel VBA, 121 bajtów
Ograniczony do 32-bitowego pakietu Office, ponieważ
^
służy jakoLongLong
literał typu w wersjach 64-bitowychPobiera dane wejściowe z komórki
A1
i dane wyjściowe do bezpośredniego okna vbe.Niegolfowany i komentowany
źródło
Dyalog APL ,
3330 bajtówWypróbuj online!
Edycja: -3 bajty dzięki ngn
'\ T<'⍳
zastępuje znaki cyframi (ich pozycja w stałej ciągu) i⌽
odwraca dane wejściowe, aby najbardziej znaczące „cyfry” były ostatnie. Pozwala+\2=
to zachować bieżącą liczbę pożądanej mocy 60 (zastosowaną przez60*
) poprzez zliczenie liczby napotkanych spacji (indeks 2 w stałej ciągu).⌊10*⍵-3
daje pożądaną moc dziesięciu dla każdej postaci. Kolejność znaków w stałej łańcucha i przesunięcie -3 powodują, że „\” i spacja przechodzą do liczb ujemnych, co powoduje ułamki, gdy znaki te są podnoszone do potęgi 10, co pozwala na ich wyeliminowanie⌊
.Wszystko, co musimy teraz zrobić, to pomnożyć cyfry potęgi-10 przez wartości potęgi -60-miejsca i zsumować los
+/
.źródło
' '
:{+/(⌊10*⍵-3)×60*+\2=⍵}'\ T<'⍳⌽
Python 2 , 62 bajty
Wypróbuj online!
Wykorzystuje to technikę z odpowiedzi Arnaulda .
źródło
Płótno ,
201716 bajtówWypróbuj tutaj!
Wyjaśnienie:
źródło
APL (NARS ⎕io ← 0), 28 znaków, 56 bajtów
niektóre testy z kontrolą typu:
Wynik każdego typu jest liczbą.
źródło
JavaScript (Node.js) ,
12211410710683 bajtówWypróbuj online!
Mam obsesję na punkcie operacji tablicowych w „funkcjonalnym stylu”, używam danych ASCII, o ile mogę stwierdzić, JS nie jest zbyt dobry w golfowym uzyskiwaniu znaków
Trzymam to ze względu na potomstwo, ale jest to naiwne / głupie rozwiązanie, proponuję sprawdzić odpowiedź Arnaulda, która jest znacznie bardziej interesująca w realizacji wyzwania
źródło
c<'T'
pracuje zamiastc=='<'
&&
z|
.for...of
pętli: PRetina ,
292623 bajtówWypróbuj online! Używa separacji nowego wiersza, ale link zawiera nagłówek, aby zamiast tego używać spacji dla wygody. Edycja: Zapisano 3 bajty przy pomocy @KevinCruijssen. Zaoszczędź kolejne 3 bajty dzięki @FryAmTheEggman. Wyjaśnienie:
Zastąp każdy
<
z 10T
s.Weź pierwszą linię, pomnóż ją przez 60 i dodaj następną linię. Następnie powtarzaj, aż pozostanie tylko jedna linia.
Policz
T
s.Szybsza wersja 51-bajtowa:
Wypróbuj online! Używa separacji nowego wiersza, ale link zawiera nagłówek, aby zamiast tego używać spacji dla wygody. Wyjaśnienie:
Dopasuj każdą linię osobno i policz liczbę
T
s oraz 10-krotność liczby<
s. Konwertuje to każdy wiersz na jego podstawową wartość „cyfrową” 60.Konwersja bazy 60, prowadzenie linii na raz. Obliczenia dokonywane są dziesiętnie dla prędkości.
źródło
<
bez+
, chyba że nie widzę żadnego przypadku krawędzi.$&
teraz jest zawsze jeden znak, mogę użyć znaku domyślnego, oszczędzając kolejne dwa bajty!_
czasu$*
we wcześniejszych wersjach Retina domyślnie na1
.<
jako pojedynczy mecz i powtarzał je 10 razy długość (ilość<
w meczu), a moja proponowana zmiana powtarza się<
osobno 10 razy (co grałeś w golfa o 2 bajty więcej, używając domyślnego 1 z10*
). Teraz lepiej rozumiem, dlaczego to+
było na początku. Nie wiem zbyt wiele o wbudowanych Retina, tylko regexy w ogóle, stąd moja proponowana zmiana, ponieważ czytam już to jako powtarzanie co>
10 razy. ;)Bash (z sed i dc), 50 bajtów
Pobiera rozdzielone spacjami dane wejściowe
stdin
, dane wyjściowe dostdout
Wypróbuj online!
Wyjaśnienie
Używa sed do transformacji danych wejściowych za pomocą szeregu dopasowań wyrażeń regularnych, dopóki na przykład dane wejściowe
<<<TT \ TTTT
nie zostaną przekształconeA+A+A+1+1+60*60*1+1+1+1+
. Następnie dane wejściowe są podawane do dc za pomocą jawnego polecenia wykonania danych wejściowych?
, poprzedzonez
(wypycha długość stosu (0) do stosu, abyśmy mieli miejsce na uziemienie dodatku), a następniep
(drukuj).źródło
J ,
3430 bajtówWypróbuj online!
źródło
Dyalog APL,
3532 bajtówWypróbuj online!
31 w dzaima / APL
źródło
Noether , 55 bajtów
Wypróbuj online!
Takie samo podejście jak @Arnauld.
źródło
Węgiel drzewny , 26 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wyczyść wynik.
Pętla nad znakami wejściowymi.
≡
Komenda jest owinięty w bloku, aby zapobiec jej znalezieniu „domyślny” blok.Przełącz obecną postać ...
jeśli jest to spacja, pomnóż wynik przez 60 ...
jeśli to
<
a, dodaj 10 do wyniku ...jeśli jest
T
to przyrost wyniku.Wydrukuj wynik.
źródło
R ,
9881 bajtówWypróbuj online!
Śmiesznie długi z powodu parsowania łańcucha.Dzięki Giusppe za zgolenie 16 niepotrzebnych bajtów.Zdefiniuj
y
wartość kodu bajtowego wejścia Unicode iR = y("T<\") = y("𒐕𒌋𒑊")
Obserwuj to
R%%3 = 1,2,0
iR%%6 = 1,5,0
... takR%%3 * R%%6 = 1,10,0
!Reszta jest łatwa: suma na kolumnę, a następnie iloczyn iloczynu o malejących mocach 60.
źródło
scan(,"")
dzieli się automatycznie na spacje?/60
można je zastąpić-1
wyrażeniem wykładniczym dla kolejnego bajtu, a dodatkowo<-
można je zastąpić,=
ponieważ wszystko jest w nawiasach.Rubinowy ,
5046 bajtówWypróbuj online!
Podstawowy port odpowiedzi Arnaulda poprawiony o GB dla -4 bajtów.
źródło
C (gcc) ,
656463 bajtówWypróbuj online!
źródło
return o
przezs=o
zapisuje kolejne 5 bajtów.Java 8,
6460 bajtów-4 bajty dzięki @ceilingcat .
Wypróbuj online. Wyjaśnienie:
źródło
Perl -F // -E, 39 bajtów
Odczytuje liczbę do konwersji z STDIN.
Jest to niezbędne to samo rozwiązanie, co podane przez @Arnauld przy użyciu JavaScript.
źródło
F #, 128 bajtów
Wypróbuj online!
Bez golfa wyglądałoby to tak:
Seq.mapFoldBack
łączySeq.map
iSeq.foldBack
.Seq.mapFoldBack
iteruje sekwencję do tyłu i przerzuca wartość akumulatora przez sekwencję (w tym przypadku,i
).Dla każdego elementu w sekwencji liczba babilońska jest obliczana (przez
Seq.sumBy
, która odwzorowuje każdy znak na liczbę i sumuje wynik), a następnie mnożona przezi
.i
jest następnie mnożony przez 60, a ta wartość jest następnie przekazywana do następnego elementu w sekwencji. Stan początkowy akumulatora wynosi 1.Na przykład kolejność wywołań i wyników
Seq.mapFoldBack
dla wprowadzania<<<TT \ TTTT
byłaby następująca:Funkcja zwróci krotkę
seq<int>, int
.fst
Zwraca pierwszy element w tej krotki, aSeq.sum
nie rzeczywistą sumowanie.Dlaczego nie użyć
Seq.mapi
lub podobnego?Seq.mapi
mapuje każdy element w sekwencji i zapewnia indeks funkcji mapowania. Stamtąd możesz zrobić60 ** index
(gdzie**
jest operator mocy w F #).**
Wymaga jednakfloats
nieints
, co oznacza, że musisz zainicjować lub rzutować wszystkie wartości w funkcji asfloat
. Cała funkcja zwróci afloat
, co (moim zdaniem) jest trochę niechlujne.Korzystanie
Seq.mapi
można to zrobić w ten sposób do 139 bajtów :źródło
Tcl , 134 bajty
Wypróbuj online!
Na odwróconej liście zapętlam inkrementując wynik liczenia
<
iT
(z-all
opcją regexp) i inkrementując naturalną moc 60.Prawidłowa wersja (patrz komentarz)
źródło
regsub {\\} $l0 l
pętlę przed foreach ....APL (Dyalog Extended) , 18 bajtów SBCS
Anonimowa ukryta funkcja prefiksu.
Wypróbuj online!
źródło
05AB1E (starsza wersja) , 10 bajtów
Wypróbuj online!
05AB1E , 11 bajtów
Wypróbuj online!
Ten sam algorytm, ale we współczesnym 05AB1E
O
nie działa na listach mieszanych int i list, więc potrzebujemy€O
zamiast tego.źródło