Cyfry Suzhou (蘇州 碼子; także 花 碼) to chińskie liczby dziesiętne:
0 〇
1 〡 一
2 〢 二
3 〣 三
4 〤
5 〥
6 〦
7 〧
8 〨
9 〩
Działają one prawie jak cyfry arabskie, z tym wyjątkiem, że gdy w zestawie znajdują się kolejne cyfry {1, 2, 3}
, cyfry występują naprzemiennie między zapisem pionowym {〡,〢,〣}
a zapisem poziomym{一,二,三}
aby uniknąć dwuznaczności. Pierwsza cyfra takiej kolejnej grupy jest zawsze zapisywana za pomocą zapisu pionowego obrysu.
Zadanie polega na przekształceniu dodatniej liczby całkowitej na cyfry Suzhou.
Przypadki testowe
1 〡
11 〡一
25 〢〥
50 〥〇
99 〩〩
111 〡一〡
511 〥〡一
2018 〢〇〡〨
123321 〡二〣三〢一
1234321 〡二〣〤〣二〡
9876543210 〩〨〧〦〥〤〣二〡〇
Najkrótszy kod w bajtach wygrywa.
Odpowiedzi:
Galaretka , 35 bajtów
Wypróbuj online!
źródło
R , 138 bajtów
Założę się, że jest to łatwiejszy sposób. Użyj,
gsub
aby uzyskać naprzemienne pozycje liczbowe.Wypróbuj online!
źródło
JavaScript, 81 bajtów
Wypróbuj online!
Korzystanie
14>>c
zapisuje 3 bajty. Dzięki Arnauldowi .źródło
Siatkówka , 46 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Dopasuj dwie cyfry 1-3 lub dowolną inną cyfrę.
Zastąp pierwszą postać każdego meczu jego Suzhou.
Zamień pozostałe cyfry na poziome Suzhou.
51 bajtów w Retina 0.8.2 :
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Podziel dane wejściowe na poszczególne cyfry lub pary cyfr, jeśli obie są 1-3.
Zamień pierwszy znak każdej linii na Suzhou.
Połącz linie z powrotem i zamień pozostałe cyfry na poziome Suzhou.
źródło
Perl 5
-pl -Mutf8
,5346 bajtów-7 bajtów dzięki Grimy
Wypróbuj online!
Wyjaśnienie
źródło
s/[123]\K[123]/$&^$;/ge;y/--</一二三〇〡-〩/
( TIO )s/[123]{2}/$&^v0.28/ge;y/--</一二三〇〡-〩/
( TIO ). 48:s/[123]{2}/$&^"\0\34"/ge;y/--</一二三〇〡-〩/
(wymaga użycia literalnych znaków kontrolnych zamiast\0\34
, idk jak to zrobić na TIO)s/[123]{2}|./OS&$&/ge;y//〇〡-〰一二三/c
( TIO )Java (JDK) , 120 bajtów
Wypróbuj online!
Kredyty
źródło
c=s[i]-48;if(p>0&p<4&c>0&c<4)
może byćif(p>0&p<4&(c=s[i]-48)>0&c<4)
, a następnie możesz również upuścić nawiasy wokół pętli. Ponadtoelse{p=c;s[i]+=c<1?12247:12272;}
może byćelse s[i]+=(p=c)<1?12247:12272;
JavaScript (ES6),
95 8988 bajtówZaoszczędź 6 bajtów dzięki @ShieruAsakoto
Pobiera dane wejściowe jako ciąg.
Wypróbuj online!
źródło
Python 3 , 102 bajty
Wypróbuj online!
mypetlion przypominał mi trywialny golf. -4 bajty.
źródło
Czyste ,
181165 bajtówWszystkie znaki ósemkowe mogą być zastąpione równoważnymi jednobajtowymi znakami (i są liczone jako jeden bajt), ale są używane dla czytelności, ponieważ w przeciwnym razie psują TIO i SE z nieprawidłowym UTF-8.
Wypróbuj online!
Kompilator nieświadomego kodowania jest zarówno błogosławieństwem, jak i przekleństwem.
źródło
Perl 6
-p
,8561 bajtów-13 bajtów dzięki Jo King
Wypróbuj online!
źródło
Czerwony ,
198171 bajtówWypróbuj online!
źródło
Galaretka , 38 bajtów
Wypróbuj online!
źródło
C, 131 bajtów
Wypróbuj online!
Objaśnienie: Po pierwsze - używam char dla wszystkich zmiennych, aby było krótkie.
Tablica
s
zawiera wszystkie potrzebne postacie Suzhou.Reszta jest prawie iterowana w stosunku do podanej liczby, która jest wyrażona jako ciąg.
Pisząc do terminala, używam wejściowej wartości liczbowej (czyli znaku - 48 w ASCII), pomnożonej przez 3, ponieważ wszystkie te znaki mają 3 bajty długości w UTF-8. Drukowany „ciąg” ma zawsze 3 bajty - więc jeden prawdziwy znak.
Zmienne
c
id
są po prostu „skrótami” do bieżącego i następnego znaku (liczby).Zmienna
f
zawiera 0 lub 27 - mówi, czy następny znak 1/2/3 powinien zostać przesunięty na alternatywny - 27 oznacza przesunięcie między znakiem zwykłym i alternatywnym w tablicy.f=c*d&&(c|d)<4&&!f?27:0
- napisz 27 do f, jeśli c * d! = 0 i jeśli oba są mniejsze niż 4, a jeśli f nie jest 0, w przeciwnym razie wpisz 0.Może być przepisany jako:
Być może są jakieś bajty, które trzeba się ogolić, ale nie jestem już w stanie znaleźć niczego oczywistego.
źródło
Rubinowy
-p
, 71 bajtówWypróbuj online!
źródło
K (ngn / k) , 67 bajtów
Wypróbuj online!
10\
pobierz listę cyfr dziesiętnych{
}@
zastosować następującą funkcjęx&x<4
boolean (0/1) lista gdzie argument jest mniejszy niż 4 i niezerowy<\
skanuj z mniej niż. to zamienia serie kolejnych 1 na przemienne 1 i 0x+9*
pomnóż przez 9 i dodajx
zestawienie to indeksowanie, więc użyj tego jako indeksów w ...
0N 3#"〇一二三〤〥〦〧〨〩〡〢〣"
podany ciąg, podzielony na listę 3-bajtowych ciągów. k nie obsługuje Unicode, więc widzi tylko bajty,/
powiązaćźródło
Wolfram Language (Mathematica) , 117 bajtów
Wypróbuj online!
Zauważ, że w TIO powoduje to wyświetlenie wyniku w postaci znaku ucieczki. W normalnym interfejsie Wolfram będzie to wyglądać tak:
źródło
f[123]
Powinien wrócić〡二〣
.Japt , 55 bajtów
Wypróbuj online!
Warto zauważyć, że TIO podaje inną liczbę bajtów niż mój preferowany tłumacz , ale nie widzę powodu, aby nie ufać temu, który daje mi niższy wynik.
Wyjaśnienie:
źródło
C # (.NET Core) , 107 bajtów, 81 znaków
Wypróbuj online!
Zaoszczędź 17 bajtów dzięki @Jo King
Stara odpowiedź
C # (.NET Core) , 124 bajty, 98 znakówWypróbuj online!
Pobiera dane wejściowe w postaci listy i zwraca IEnumerable. Nie wiem, czy to wejście / wyjście jest w porządku, więc daj mi znać, jeśli tak nie jest.
Wyjaśnienie
Działa to tak, że przekształca wszystkie liczby całkowite w ich odpowiednie postaci liczbowe Suzhou, ale tylko wtedy, gdy zmienna
b
jest prawdziwa.b
jest odwracany za każdym razem, gdy napotykamy liczbę całkowitą, która jest jedna, dwie lub trzy, a w przeciwnym razie ustawiamy na true Jeślib
false, zamieniamy liczbę całkowitą na jedną z liczb pionowych.źródło
R 104 bajty
Wypróbuj online!
Alternatywne podejście w R. Korzysta z niektórych funkcji Regex w stylu Perla (ostatni
T
parametr funkcji podstawienia oznaczaperl=TRUE
).Najpierw tłumaczymy cyfry na znaki alfabetyczne
a-j
, a następnie używamy podstawienia Regex, aby konwertować zduplikowane wystąpieniabcd
(poprzednio123
) na wielkie litery, a na koniec tłumaczymy znaki na cyfry Suzhou z różną obsługą małych i wielkich liter.Podziękowania dla J.Doe za przygotowanie przypadków testowych, ponieważ zostały one zaczerpnięte z jego odpowiedzi .
źródło
C #, 153 bajty
Wypróbuj online!
źródło