แปลงเป็นตัวเลขซูโจว


27

ตัวเลขซูโจว (蘇州碼子; และ花碼) เป็นตัวเลขทศนิยมจีน:

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

พวกมันทำงานเหมือนเลขอารบิกยกเว้นว่าเมื่อมีตัวเลขต่อเนื่องที่เป็นของชุด{1, 2, 3}ตัวเลขจะเป็นทางเลือกระหว่างสัญกรณ์จังหวะในแนวดิ่ง{〡,〢,〣}และสัญกรณ์จังหวะในแนวนอน{一,二,三}เพื่อหลีกเลี่ยงความคลุมเครือ ตัวเลขแรกของกลุ่มที่อยู่ติดกันนั้นจะถูกเขียนด้วยสัญกรณ์จังหวะแนวตั้งเสมอ

ภารกิจคือการแปลงจำนวนเต็มบวกเป็นตัวเลขซูโจว

กรณีทดสอบ

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


1
ฉันเคยไปซูโจว 3 ครั้งเป็นเวลานานกว่า (เป็นเมืองที่ค่อนข้างดี) แต่ไม่รู้เกี่ยวกับตัวเลขของซูโจว คุณมี +1 ของฉัน
โธมัสเวลเลอร์

2
@ThomasWeller สำหรับฉันมันตรงกันข้าม: ก่อนที่จะเขียนงานนี้ฉันรู้ว่าตัวเลขเป็นอย่างไร แต่ไม่ใช่ว่าพวกเขาถูกตั้งชื่อว่า "ตัวเลขซูโจว" อันที่จริงฉันไม่เคยได้ยินพวกเขาเรียกชื่อนี้ (หรือชื่อใด ๆ เลย) ฉันเคยเห็นพวกเขาในตลาดและตามใบสั่งแพทย์แผนจีนที่เขียนด้วยลายมือ
u54112

คุณสามารถป้อนข้อมูลในรูปแบบของอาร์เรย์ char ได้หรือไม่
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance ใช่ มีคนเข้าแถวกันมากพอ
u54112

คำตอบ:



9

R , 138 ไบต์

ฉันจะเดิมพันมีวิธีที่ง่ายกว่านี้ ใช้gsubเพื่อรับตำแหน่งที่เป็นตัวเลขสลับกัน

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

ลองออนไลน์!



8

เรติน่า 46 ไบต์

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

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

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

จับคู่สองหลัก 1-3 หรือหลักอื่น

_T`d`〇〡-〩`^.

แทนที่ตัวละครตัวแรกของการแข่งขันแต่ละนัดด้วยซูโจว

T`123`一二三

แทนที่ตัวเลขที่เหลืออยู่ด้วยซูโจวแนวนอน

51 ไบต์ในRetina 0.8.2 :

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

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

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

แยกอินพุตเป็นหลักหรือแต่ละคู่หากพวกเขาทั้ง 1-3

mT`d`〇〡-〩`^.

แทนที่อักขระตัวแรกของแต่ละบรรทัดด้วย Suzhou

T`¶123`_一二三

เข้าร่วมสายกลับมารวมกันและแทนที่ตัวเลขที่เหลือด้วยซูโจวแนวนอน


7

Perl 5 -pl -Mutf8 , 53 46 ไบต์

-7 ไบต์ขอบคุณ Grimy

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

ลองออนไลน์!

คำอธิบาย

# 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 ไบต์ด้วย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/--</一二三〇〡-〩/(ต้องใช้ตัวอักษรควบคุมตัวอักษรแทน\0\34idk วิธีการทำเช่นนี้ใน TIO)
Grimmy

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

6

Java (JDK) , 120 ไบต์

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

ลองออนไลน์!

เครดิต


1
c=s[i]-48;if(p>0&p<4&c>0&c<4)สามารถเป็นif(p>0&p<4&(c=s[i]-48)>0&c<4)แล้วคุณยังสามารถวางวงเล็บไปรอบ ๆ วง นอกจากนี้ยังelse{p=c;s[i]+=c<1?12247:12272;}สามารถelse s[i]+=(p=c)<1?12247:12272;
Kevin Cruijssen

1
@KevinCruijssen ขอขอบคุณ! ฉันยังเล่นกอล์ฟคำตอบนี้อยู่ แต่มันก็ช่วยฉันได้ ^^ ตอนนี้ฉันคิดว่าฉันเล่นกอล์ฟเสร็จแล้ว
Olivier Grégoire



3

ทำความสะอาด , 181 165 ไบต์

การยกเว้นฐานแปดทั้งหมดสามารถแทนที่ด้วยอักขระไบต์เดียวที่เทียบเท่ากัน (และนับเป็นหนึ่งไบต์แต่ละรายการ) แต่ใช้เพื่อความสามารถในการอ่านและเนื่องจากมิเช่นนั้นจะทำให้ TIO และ SE แตก 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]

ลองออนไลน์!

คอมไพเลอร์ที่เข้ารหัสโดยไม่รู้ตัวเป็นทั้งคำอวยพรและคำสาป





2

C, 131 ไบต์

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

ลองออนไลน์!

คำอธิบาย: ก่อนอื่น - ฉันใช้ถ่านสำหรับตัวแปรทั้งหมดเพื่อทำให้สั้น

อาเรย์sมีตัวละครซูโจวที่ต้องการทั้งหมด

ส่วนที่เหลือจะวนซ้ำตามจำนวนที่ให้ไว้ซึ่งจะแสดงเป็นสตริง

เมื่อเขียนถึงเทอร์มินัลฉันกำลังใช้ค่าหมายเลขอินพุต (ดังนั้นอักขระ - 48 ใน ASCII) คูณด้วย 3 เพราะอักขระเหล่านี้ทั้งหมดมีความยาว 3 ไบต์ใน UTF-8 'สตริง' ที่กำลังพิมพ์มีความยาว 3 ไบต์เสมอดังนั้นจึงมีอักขระจริงหนึ่งตัว

ตัวแปรcและdเป็นเพียง 'ทางลัด' ถึงอักขระป้อนข้อมูลปัจจุบันและถัดไป (หมายเลข)

ตัวแปรfถือ 0 หรือ 27 - มันบอกว่าถ้าตัวละคร 1/2/3 ถัดไปควรจะเปลี่ยนเป็นทางเลือกหนึ่ง - 27 คือการชดเชยระหว่างตัวละครปกติและทางเลือกในอาร์เรย์

f=c*d&&(c|d)<4&&!f?27:0 - เขียน 27 ถึง f ถ้า c * d! = 0 และถ้าทั้งคู่ <4 และถ้า f ไม่ใช่ 0 มิฉะนั้นก็เขียน 0

สามารถเขียนใหม่เป็น:

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

อาจจะมีบางไบต์ที่ต้องโกนออก แต่ฉันไม่สามารถหาอะไรที่ชัดเจนได้อีกต่อไป


120 ไบต์
Jonathan Frech


1

K (ngn / k) , 67 ไบต์

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

ลองออนไลน์!

10\ รับรายการทศนิยม

{ }@ ใช้ฟังก์ชั่นดังต่อไปนี้

x&x<4 รายการบูลีน (0/1) ที่อาร์กิวเมนต์มีค่าน้อยกว่า 4 และไม่ใช่ศูนย์

<\สแกนด้วยน้อยกว่า สิ่งนี้จะเปลี่ยนการวิ่งของ 1s ต่อเนื่องไปเป็นการสลับ 1s และ 0s

x+9* คูณด้วย 9 และเพิ่ม x

การวางเคียงกันคือการจัดทำดัชนีดังนั้นใช้สิ่งนี้เป็นดัชนีใน ...

0N 3#"〇一二三〤〥〦〧〨〩〡〢〣"สตริงที่กำหนดแบ่งออกเป็นรายการของสตริง 3 ไบต์ k ไม่ได้รับการรับรู้ Unicode ดังนั้นจึงเห็นเฉพาะไบต์

,/ concatenate


1

ภาษา Wolfram (Mathematica) , 117 ไบต์

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

ลองออนไลน์!

โปรดทราบว่าใน TIO ผลลัพธ์นี้จะแสดงผลลัพธ์ในรูปแบบการหลีกหนี ในส่วนหน้าของ Wolfram ปกติมันจะเป็นดังนี้:รูปภาพของส่วนต่อประสานโน้ตบุ๊ค


1
คุณสามารถใช้สัญกรณ์จังหวะแนวนอนสำหรับสองและสาม เช่นควรกลับf[123] 〡二〣
u54112

1

Japt , 55 ไบต์

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

ลองออนไลน์!

เป็นที่น่าสังเกตว่า TIO ให้จำนวนไบต์ที่แตกต่างจากล่ามที่ฉันต้องการแต่ฉันไม่เห็นเหตุผลที่จะไม่เชื่อใจคนที่ให้คะแนนต่ำกว่าฉัน

คำอธิบาย:

    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 ไบต์, 81 ตัวอักษร

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

ลองออนไลน์!

บันทึกแล้ว 17 ไบต์ขอบคุณ @Jo King

คำตอบเก่า

C # (. NET Core) , 124 ไบต์, 98 ตัวอักษร

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

ลองออนไลน์!

รับอินพุตในรูปแบบของรายการและส่งคืน IEnumerable ฉันไม่ทราบว่าอินพุต / เอาต์พุตนี้ถูกต้องหรือไม่ดังนั้นเพียงแจ้งให้เราทราบหากไม่มี

คำอธิบาย

วิธีการทำงานนี้คือมันแปลงจำนวนเต็มทั้งหมดเป็นรูปแบบตัวเลขซูโจวตามลำดับ แต่เฉพาะในกรณีที่ตัวแปรbเป็นจริง bกลับด้านเมื่อใดก็ตามที่เราพบจำนวนเต็มที่เป็นหนึ่งสองหรือสามและตั้งค่าเป็นอย่างอื่น หากbเป็นเท็จเราจะเปลี่ยนจำนวนเต็มเป็นหนึ่งในตัวเลขแนวตั้ง


0

R , 104 ไบต์

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

ลองออนไลน์!

อีกทางเลือกหนึ่งในอาร์ทำให้การใช้คุณสมบัติ Regex สไตล์ Perl บางอย่าง ( Tพารามิเตอร์สุดท้ายในฟังก์ชั่นการทดแทนหมายถึงperl=TRUE)

อันดับแรกเราแปลตัวเลขเป็นอักขระตัวอักษรa-jจากนั้นใช้การแทนที่ Regex เพื่อแปลงรายการที่ซ้ำกันของbcd(เดิม123) เป็นตัวพิมพ์ใหญ่และในที่สุดก็แปลอักขระเป็นตัวเลข Suzhou ด้วยการจัดการตัวอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่แตกต่างกัน

เครดิตให้กับ J.Doe สำหรับการเตรียมการกรณีการทดสอบเหล่านี้ถูกนำมาจากคำตอบของเขา


0

C #, 153 ไบต์

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

ลองออนไลน์!


นี่คือ 153 ไบต์อย่างไรก็ตามอักขระไม่ได้หมายถึงไบต์เสมอไป อักขระบางตัวมีค่าหลายไบต์
ศูนย์รวมแห่งความไม่รู้

โอ้ดีฉันแก้ไขคำตอบของฉัน ขอบคุณสำหรับข้อมูล :)
zruF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.