Chuyển đổi sang số Tô Châu


27

Chữ số Tô Châu (碼子; cũng 碼) là chữ số thập phân của Trung Quốc:

0 〇
1 〡 一
2 〢 二
3 〣 三
4 〤
5 〥
6 〦
7 〧
8 〨
9 〩

Chúng hoạt động khá nhiều như chữ số Ả Rập, ngoại trừ khi có các chữ số liên tiếp thuộc tập hợp {1, 2, 3}, các chữ số xen kẽ giữa ký hiệu nét dọc {〡,〢,〣}và ký hiệu nét ngang {一,二,三}để tránh sự mơ hồ. Chữ số đầu tiên của một nhóm liên tiếp như vậy luôn được viết bằng ký hiệu nét dọc.

Nhiệm vụ là chuyển đổi một số nguyên dương thành số Tô Châu.

Các trường hợp thử nghiệm

1          〡
11         〡一
25         〢〥
50         〥〇
99         〩〩
111        〡一〡
511        〥〡一
2018       〢〇〡〨
123321     〡二〣三〢一
1234321    〡二〣〤〣二〡
9876543210 〩〨〧〦〥〤〣二〡〇

Mã ngắn nhất trong byte thắng.


1
Tôi đã ở Tô Châu 3 lần trong thời gian dài hơn (một thành phố khá đẹp) nhưng không biết gì về số Tô Châu. Bạn có +1 của tôi
Thomas Weller

2
@ThomasWeller Đối với tôi thì ngược lại: trước khi viết nhiệm vụ này tôi đã biết các chữ số là gì, nhưng không phải chúng được đặt tên là "số Tô Châu". Trong thực tế, tôi chưa bao giờ nghe thấy họ gọi tên này (hoặc bất kỳ tên nào cả). Tôi đã nhìn thấy chúng trên thị trường và trên các đơn thuốc y học Trung Quốc viết tay.
u54112

Bạn có thể lấy đầu vào dưới dạng một mảng char?
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance Có. Vâng, đủ mọi người đang dùng chuỗi đầu vào nào.
u54112

Câu trả lời:



9

R , 138 byte

Tôi cá là có một cách dễ dàng hơn để làm điều này. Sử dụng gsubđể có được các vị trí số xen kẽ.

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

Hãy thử trực tuyến!



8

Võng mạc , 46 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

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

Ghép hai chữ số 1-3 hoặc bất kỳ chữ số nào khác.

_T`d`〇〡-〩`^.

Thay thế nhân vật đầu tiên của mỗi trận đấu bằng Tô Châu của nó.

T`123`一二三

Thay thế bất kỳ chữ số còn lại với Tô Châu ngang.

51 byte trong Retina 0.8.2 :

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

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

Chia đầu vào thành các chữ số hoặc cặp chữ số riêng lẻ nếu cả hai đều là 1-3.

mT`d`〇〡-〩`^.

Thay thế ký tự đầu tiên của mỗi dòng bằng Tô Châu của nó.

T`¶123`_一二三

Nối các dòng lại với nhau và thay thế bất kỳ chữ số còn lại bằng Tô Châu ngang.


7

Perl 5 -pl -Mutf8 , 53 46 byte

-7 byte nhờ Grimy

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

Hãy thử trực tuyến!

Giải trình

# 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 byte với 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/--</一二三〇〡-〩/(yêu cầu sử dụng các ký tự điều khiển theo nghĩa đen thay vì \0\34, idk làm thế nào để làm điều này trên TIO)
Grimmy

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

6

Java (JDK) , 120 byte

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;}

Hãy thử trực tuyến!

Tín dụng


1
c=s[i]-48;if(p>0&p<4&c>0&c<4)có thể if(p>0&p<4&(c=s[i]-48)>0&c<4), và sau đó bạn cũng có thể thả dấu ngoặc quanh vòng lặp. Ngoài ra, else{p=c;s[i]+=c<1?12247:12272;}có thểelse s[i]+=(p=c)<1?12247:12272;
Kevin Cruijssen

1
@KevinCruijssen Cảm ơn bạn! Tôi vẫn đang chơi golf câu trả lời này, nhưng dù sao nó cũng giúp tôi ^^ Bây giờ tôi nghĩ rằng tôi đã chơi golf xong.
Olivier Grégoire



3

Sạch sẽ , 181 165 byte

Tất cả các lần thoát bát phân có thể được thay thế bằng các ký tự một byte tương đương (và được tính là một byte mỗi ký tự), nhưng được sử dụng để dễ đọc và vì nếu không, nó phá vỡ TIO và SE với UTF-8 không hợp lệ.

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]

Hãy thử trực tuyến!

Một trình biên dịch không mã hóa là cả một phước lành và một lời nguyền.





2

C, 131 byte

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]);}

Hãy thử trực tuyến!

Giải thích: Trước hết - Tôi đang sử dụng char cho tất cả các biến để rút ngắn.

Mảng schứa tất cả các nhân vật Tô Châu cần thiết.

Phần còn lại được lặp lại khá nhiều so với số được cung cấp, được thể hiện dưới dạng một chuỗi.

Khi ghi vào thiết bị đầu cuối, tôi đang sử dụng giá trị số đầu vào (vì vậy ký tự - 48 trong ASCII), nhân với 3, vì tất cả các ký tự này dài 3 byte trong UTF-8. 'Chuỗi' đang được in luôn dài 3 byte - vì vậy một ký tự thực.

Các biến cdchỉ là 'phím tắt' cho ký tự đầu vào hiện tại và tiếp theo (số).

Biến fgiữ 0 hoặc 27 - thông báo nếu ký tự 1/2/3 tiếp theo nên được chuyển sang ký tự thay thế - 27 là phần bù giữa ký tự thông thường và ký tự thay thế trong mảng.

f=c*d&&(c|d)<4&&!f?27:0 - viết 27 đến f nếu c * d! = 0 và nếu cả hai đều <4 và nếu f không bằng 0, thì ngược lại viết 0.

Có thể được viết lại thành:

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

Có thể có một số byte để tắt, nhưng tôi không còn có thể tìm thấy bất cứ điều gì rõ ràng.




1

K (ngn / k) , 67 byte

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

Hãy thử trực tuyến!

10\ lấy danh sách các chữ số thập phân

{ }@ áp dụng các chức năng sau

x&x<4 danh sách boolean (0/1) trong đó đối số nhỏ hơn 4 và khác không

<\quét với ít hơn. lần lượt các lượt chạy liên tiếp 1 giây thành 1 và 0 xen kẽ

x+9* nhân với 9 và thêm x

juxtap vị trí là lập chỉ mục, vì vậy sử dụng này như là chỉ số trong ...

0N 3#"〇一二三〤〥〦〧〨〩〡〢〣"chuỗi đã cho, chia thành một danh sách các chuỗi 3 byte. k không nhận biết được unicode, vì vậy nó chỉ thấy các byte

,/ ghép


1

Ngôn ngữ Wolfram (Mathicala) , 117 byte

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

Hãy thử trực tuyến!

Lưu ý rằng trên TIO, kết quả này xuất ra ở dạng thoát. Trong mặt trước Wolfram bình thường, nó sẽ trông như thế này:hình ảnh giao diện máy tính xách tay


1
Bạn có thể thực hiện ký hiệu đột quỵ ngang cho twos và threes? Vd f[123]nên trở về 〡二〣.
u54112

1

Japt , 55 byte

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

Hãy thử trực tuyến!

Điều đáng chú ý là TIO cho số byte khác với trình thông dịch ưa thích của tôi , nhưng tôi thấy không có lý do gì để không tin vào người cho tôi điểm thấp hơn.

Giải trình:

    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 byte, 81 ký tự

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

Hãy thử trực tuyến!

Đã lưu 17 byte nhờ @Jo King

Câu trả lời cũ

C # (.NET Core) , 124 byte, 98 ký tự

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];});}

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng Danh sách và trả về IEnumerable. Tôi không biết liệu đầu vào / đầu ra này có ổn không, vì vậy hãy cho tôi biết nếu không.

Giải trình

Cách thức hoạt động của nó là nó biến đổi tất cả các số nguyên thành dạng số Tô Châu tương ứng của chúng, nhưng chỉ khi biến blà đúng. bđược đảo ngược bất cứ khi nào chúng ta gặp một số nguyên là một, hai hoặc ba và được đặt thành đúng nếu không. Nếu blà sai, chúng ta biến số nguyên thành một trong các số dọc.


0

R , 104 byte

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

Hãy thử trực tuyến!

Một cách tiếp cận khác trong R. Làm cho việc sử dụng một số tính năng Regex kiểu Perl (tham số cuối cùng Ttrong chức năng thay thế là viết tắt perl=TRUE).

Đầu tiên, chúng tôi dịch các chữ số thành các ký tự chữ cái a-j, sau đó sử dụng thay thế Regex để chuyển đổi các lần xuất hiện trùng lặp của bcd(trước đây 123) thành chữ hoa và cuối cùng dịch các ký tự sang chữ số Tô Châu với cách xử lý khác nhau của chữ thường và chữ hoa.

Tín dụng cho J.Doe cho việc chuẩn bị các trường hợp thử nghiệm, vì những điều này được lấy từ câu trả lời của anh ấy .


0

C #, 153 byte

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

Hãy thử trực tuyến!


Nhân tiện, đây là 153 byte, các ký tự không phải lúc nào cũng có nghĩa là byte. Một số ký tự có giá trị nhiều byte.
Hiện thân của sự thiếu hiểu biết

Oh tốt, tôi chỉnh sửa câu trả lời của tôi. Cảm ơn thông tin :)
zruF 17/12/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.