蘇州の数字に変換


27

蘇州の数字蘇州碼子;花碼)は中国の10進数です:

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}|./

2桁の1から3または他の数字のいずれかに一致します。

_T`d`〇〡-〩`^.

各試合の最初の文字を蘇州に置き換えます。

T`123`一二三

残りの数字を水平の蘇州に置き換えます。

Retina 0.8.2で 51バイト:

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

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

両方とも1〜3の場合、入力を個々の数字または数字のペアに分割します。

mT`d`〇〡-〩`^.

各行の最初の文字を蘇州に置き換えます。

T`¶123`_一二三

線を元に戻し、残りの数字を水平の蘇州に置き換えます。


7

Perl 5の -pl -Mutf853、46バイト

グリミーのおかげで-7バイト

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\34TIO上でこれを行う方法を、IDK)
Grimmy

46: s/[123]{2}|./OS&$&/ge;y//〇〡-〰一二三/cTIO
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;
ケビンCruijssen

1
@KevinCruijssenありがとうございます!私はまだこの答えをゴルフしていましたが、それでも助けになりました^^今はゴルフを終えたと思います。
オリヴィエグレゴワール



3

クリーン181 165バイト

すべての8進エスケープは、同等のシングルバイト文字に置き換えることができます(また、それぞれ1バイトとしてカウントされます)が、読みやすさのために使用されます。

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

オンラインでお試しください!

説明:まず第一に、すべての変数にcharを使用して短くしています。

アレイ sは、必要な蘇州文字がすべて含まれています。

残りは、文字列として表される指定された数値を繰り返し処理しています。

端末に書き込むときは、入力数値(ASCIIの48文字)に3を掛けた値を使用しています。これらの文字はすべてUTF-8では3バイト長であるためです。印刷される「文字列」は常に3バイトの長さなので、実際の文字は1つです。

変数cdは、現在および次の入力文字(数値)への単なる「ショートカット」です。

変数fは0または27を保持します-次の1/2/3文字を代替文字にシフトするかどうかを示します-27は配列内の通常文字と代替文字の間のオフセットです。

f=c*d&&(c|d)<4&&!f?27:0 -c * d!= 0で、両方が4未満で、fが0でない場合、fに27を書き込みます。それ以外の場合は0を書き込みます。

次のように書き換えることができます。

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

削る必要のあるバイトがあるかもしれませんが、私はもはや明らかなものを見つけることができません。




1

K(ngn / k)、67バイト

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

オンラインでお試しください!

10\ 10進数のリストを取得します

{ }@ 次の機能を適用する

x&x<4 引数が4未満でゼロ以外の場所のブール(0/1)リスト

<\未満でスキャンします。これにより、連続する1が1と0を交互に繰り返すようになります

x+9* 9を掛けて加算します x

並置はインデックス付けなので、これをインデックスとして使用します...

0N 3#"〇一二三〤〥〦〧〨〩〡〢〣"3バイト文字列のリストに分割された、指定された文字列。kはUnicodeに対応していないため、バイトのみが表示されます

,/ 連結する


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
2と3に水平ストローク表記を実装できますか?たとえば、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]);}

オンラインでお試しください!

@Jo Kingのおかげで17バイト節約

古い答え

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がtrueの場合にのみ、すべての整数をそれぞれの蘇州の数字形式に変換することです。b1、2、または3の整数を満たすたびに反転し、それ以外の場合はtrueに設定されます。bがfalseの場合、整数を垂直数字の1つに変えます。


0

R、104バイト

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

オンラインでお試しください!

Rの代替アプローチ。Perlスタイルの正規表現機能をいくつか使用します(T置換関数の最後のパラメーターはを表しますperl=TRUE)。

最初に、数字をアルファベット文字a-jに変換し、次に正規表現の置換を使用してbcd(以前の123)のを大文字に変換し、最後に小文字と大文字の処理が異なる蘇州数字に文字を変換します。

テストケースの準備は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.