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.

u54112
źródło
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!

J.Doe
źródło
9

JavaScript, 81 bajtów

s=>s.replace(/./g,c=>(p=14>>c&!p)|c>3?eval(`"\\u302${c}"`):'〇一二三'[c],p=0)

Wypróbuj online!

Korzystanie 14>>czapisuje 3 bajty. Dzięki Arnauldowi .

tsh
źródło
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.

Neil
źródło
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
nwellnhof
źródło
-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

Olivier Grégoire
źródło
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,
5

JavaScript (ES6),  95 89  88 bajtów

Zaoszczędź 6 bajtów dzięki @ShieruAsakoto

Pobiera dane wejściowe jako ciąg.

s=>s.replace(i=/./g,c=>'三二一〇〡〢〣〤〥〦〧〨〩'[i=112>>i&c<4?3-c:+c+3])

Wypróbuj online!

Arnauld
źródło
89 bajtów
Shieru Asakoto,
@ShieruAsakoto To znacznie lepiej! Wielkie dzięki!
Arnauld
5

Python 3 , 102 bajty

f=0
for i in input():f=i in'123'and 9-f;print(end='〇一二三〤〥〦〧〨〩〡〢〣'[int(i)+f])

Wypróbuj online!

mypetlion przypominał mi trywialny golf. -4 bajty.

Erik the Outgolfer
źródło
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.

Obrzydliwe
źródło
2

Perl 6 -p , 85 61 bajtów

-13 bajtów dzięki Jo King

s:g[(1|2|3)<((1|2|3)]=chr $/+57;tr/0..</〇〡..〩一二三/

Wypróbuj online!

nwellnhof
źródło
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!

Galen Iwanow
źródło
2

Galaretka , 38 bajtów

9Rż“øƓ“œ%“øƈ’;-25+⁽-EỌœị@DżD<4«Ɗ‘×¥\ƊƊ

Wypróbuj online!

Erik the Outgolfer
źródło
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.

Michał Stoń
źródło
120 bajtów .
Jonathan Frech
1

Rubinowy -p , 71 bajtów

$_=gsub(/[1-3]\K[1-3]/){|x|(x.ord+9).chr}.tr"0-<","〇〡-〩一二三"

Wypróbuj online!

Kirill L.
źródło
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ć

ngn
źródło
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

Kelly Lowder
źródło
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
Kamil Drakari
źródło
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.

Wcielenie ignorancji
źródło
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 .

Kirill L.
źródło
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!

zruF
źródło
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