Konwertuj na liczby Suzhou


27

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.


1
Byłem w Suzhou 3 razy przez dłuższy czas (całkiem fajne miasto), ale nie wiedziałem o liczbach Suzhou. Masz +1
Thomas Weller,

2
@ThomasWeller Dla mnie jest odwrotnie: przed napisaniem tego zadania wiedziałem, jakie są cyfry, ale nie to, że nazwano je „liczbami Suzhou”. W rzeczywistości nigdy nie słyszałem, aby nazywali to imię (lub jakiekolwiek inne imię). Widziałem je na rynkach i na ręcznie napisanych receptach na chińską medycynę.
u54112,

Czy możesz wziąć dane wejściowe w postaci tablicy char?
Embodiment of Ignorance

@EmbodimentofIgnorance Tak. Cóż, i tak wystarczająca liczba ludzi bierze ciąg znaków.
u54112,

Odpowiedzi:



9

R , 138 bajtów

Założę się, że jest to łatwiejszy sposób. Użyj, gsubaby uzyskać naprzemienne pozycje liczbowe.

function(x,r=-48+~x)Reduce(paste0,ifelse(58<~gsub("[123]{2}","0a",x),"123"["一二三",r],'0-9'["〇〡-〩",r]))
"~"=utf8ToInt
"["=chartr

Wypróbuj online!



8

Siatkówka , 46 bajtów

/[1-3]{2}|./_T`d`〇〡-〩`^.
T`123`一二三

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

/[1-3]{2}|./

Dopasuj dwie cyfry 1-3 lub dowolną inną cyfrę.

_T`d`〇〡-〩`^.

Zastąp pierwszą postać każdego meczu jego Suzhou.

T`123`一二三

Zamień pozostałe cyfry na poziome Suzhou.

51 bajtów w Retina 0.8.2 :

M!`[1-3]{2}|.
mT`d`〇〡-〩`^.
T`¶123`_一二三

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

M!`[1-3]{2}|.

Podziel dane wejściowe na poszczególne cyfry lub pary cyfr, jeśli obie są 1-3.

mT`d`〇〡-〩`^.

Zamień pierwszy znak każdej linii na Suzhou.

T`¶123`_一二三

Połącz linie z powrotem i zamień pozostałe cyfry na poziome Suzhou.


7

Perl 5 -pl -Mutf8 , 53 46 bajtów

-7 bajtów dzięki Grimy

s/[123]{2}|./OS&$&/ge;y//〇〡-〰一二三/c

Wypróbuj online!

Wyjaśnienie

# Binary AND two consecutive digits 1-3 (ASCII 0x31-0x33)
# or any other single digit (ASCII 0x30-0x39) with string "OS"
# (ASCII 0x4F 0x53). This converts the first digit to 0x00-0x09
# and the second digit, if present, to 0x11-0x13.
s/[123]{2}|./OS&$&/ge;
# Translate empty complemented searchlist (0x00-0x13) to
# respective Unicode characters.
y//〇〡-〰一二三/c

-3 bajty z s/[123]\K[123]/$&^$;/ge;y/--</一二三〇〡-〩/( TIO )
Grimmy

49: 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)
Grimmy

46: s/[123]{2}|./OS&$&/ge;y//〇〡-〰一二三/c( TIO )
Grimmy,

6

Java (JDK) , 120 bajtów

s->{for(int i=0,p=0,c;i<s.length;)s[i]+=(p>0&p<4&(c=s[i++]-48)>0&c<4)?"A䷏乚䷖".charAt(c+(p=0)):(p=c)<1?12247:12272;}

Wypróbuj online!

Kredyty


1
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. Ponadto else{p=c;s[i]+=c<1?12247:12272;}może byćelse s[i]+=(p=c)<1?12247:12272;
Kevin Cruijssen

1
@KevinCruijssen Dziękujemy! Nadal grałem w tę odpowiedź, ale mimo to pomogło mi ^^ Teraz myślę, że skończyłem grać w golfa.
Olivier Grégoire,



3

Czyste , 181 165 bajtów

Wszystkie 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.

import StdEnv
u=map\c={'\343','\200',c}
?s=((!!)["〇":s++u['\244\245\246\247\250']])o digitToInt
$[]=[]
$[h:t]=[?(u['\241\242\243'])h:if(h-'1'<'\003')f$t]
f[]=[]
f[h:t]=[?["一","二","三"]h: $t]

Wypróbuj online!

Kompilator nieświadomego kodowania jest zarówno błogosławieństwem, jak i przekleństwem.



2

Czerwony , 198 171 bajtów

func[n][s: charset"〡〢〣"forall n[n/1: either n/1 >#"0"[to-char 12272 + n/1][#"〇"]]parse
n[any[[s change copy t s(pick"一二三"do(to-char t)- 12320)fail]| skip]]n]

Wypróbuj online!



2

C, 131 bajtów

f(char*n){char*s="〇〡〢〣〤〥〦〧〨〩一二三",i=0,f=0,c,d;do{c=n[i++]-48;d=n[i]-48;printf("%.3s",s+c*3+f);f=c*d&&(c|d)<4&&!f?27:0;}while(n[i]);}

Wypróbuj online!

Objaśnienie: Po pierwsze - używam char dla wszystkich zmiennych, aby było krótkie.

Tablica szawiera 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 ci dsą po prostu „skrótami” do bieżącego i następnego znaku (liczby).

Zmienna fzawiera 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:

if( c && d && c < 4 && d < 4 && f == 0)
f = 27
else
f = 0

Być może są jakieś bajty, które trzeba się ogolić, ale nie jestem już w stanie znaleźć niczego oczywistego.




1

K (ngn / k) , 67 bajtów

{,/(0N 3#"〇一二三〤〥〦〧〨〩〡〢〣")x+9*<\x&x<4}@10\

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 0

x+9* pomnóż przez 9 i dodaj x

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ć


1

Wolfram Language (Mathematica) , 117 bajtów

FromCharacterCode[12320+(IntegerDigits@#/. 0->-25//.MapIndexed[{a___,c=#2[[1]],c,b___}->{a,c,#,b}&,{0,140,9}+7648])]&

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:obraz interfejsu notebooka


1
Czy możesz zaimplementować notację poziomego obrysu dla dwójki i trójki? Np. f[123]Powinien wrócić 〡二〣.
u54112,

1

Japt , 55 bajtów

s"〇〡〢〣〤〥〦〧〨〩"
ð"[〡〢〣]" óÈ¥YÉîë2,1Ãc
£VøY ?Xd"〡一〢二〣三":X

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:

    Step 1:
s"〇〡〢〣〤〥〦〧〨〩"        Convert the input number to a string using these characters for digits

    Step 2:
ð                            Find all indexes which match this regex:
 "[〡〢〣]"                    A 1, 2, or 3 character
           ó    Ã            Split the list between:
            È¥YÉ              Non-consecutive numbers
                  ®    Ã     For each group of consecutive [1,2,3] characters:
                   ë2,1      Get every-other one starting with the second
                        c    Flatten

    Step 3:
£                              For each character from step 1:
 VøY                           Check if its index is in the list from step 2
     ?                         If it is:
      Xd"〡一〢二〣三"            Replace it with the horizontal version
                     :X        Otherwise leave it as-is

1

C # (.NET Core) , 107 bajtów, 81 znaków

n=>{var t="〇一二三〤〥〦〧〨〩〡〢〣";var b=0;return n.Select(k=>t[k+(b+=k>0&k<4?1:b)%2*9]);}

Wypróbuj online!

Zaoszczędź 17 bajtów dzięki @Jo King

Stara odpowiedź

C # (.NET Core) , 124 bajty, 98 znaków

n=>{var t="〇一二三〤〥〦〧〨〩〡〢〣";var b=0<1;return n.Select(k=>{b=k>0&k<4?!b:0<1;return b?t[k]:t[k+9];});}

Wypró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 bjest prawdziwa. bjest 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śli bfalse, zamieniamy liczbę całkowitą na jedną z liczb pionowych.


0

R 104 bajty

function(x,`[`=chartr)"a-jBCD"["〇〡-〩一二三",gsub("[bcd]\\K([bcd])","\\U\\1","0-9"["a-j",x],,T)]

Wypróbuj online!

Alternatywne podejście w R. Korzysta z niektórych funkcji Regex w stylu Perla (ostatni Tparametr funkcji podstawienia oznaczaperl=TRUE ).

Najpierw tłumaczymy cyfry na znaki alfabetyczne a-j, a następnie używamy podstawienia Regex, aby konwertować zduplikowane wystąpienia bcd(poprzednio 123) 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 .


0

C #, 153 bajty

n=>Regex.Replace(n+"",@"[4-90]|[1-3]{1,2}",x=>"〇〡〢〣〤〥〦〧〨〩"[x.Value[0]-'0']+""+(x.Value.Length>1?"一二三"[x.Value[1]-'0'-1]+"":""))

Wypróbuj online!


Nawiasem mówiąc, jest to 153 bajty, znaki nie zawsze oznaczają bajty. Niektóre znaki są warte wiele bajtów.
Wcielenie nieznajomości

No cóż, zredagowałem swoją odpowiedź. Dzięki za informację :)
zruF
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.