Suzhou rakamlarına dönüştür


27

Suzhou sayıları (蘇州 碼子; ayrıca 花 碼) Çin ondalık sayılarıdır:

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

Arap rakamları gibi çalışırlar, kümeye ait ardışık rakamlar olduğunda {1, 2, 3}, rakamlar dikey vuruş notasyonu {〡,〢,〣}ve yatay vuruş notasyonu arasında değişir.{一,二,三} belirsizliği önlemek için geçiş yapar. Böyle ardışık bir grubun ilk basamağı her zaman dikey vuruş gösterimi ile yazılır.

Görev, pozitif bir tamsayıyı Suzhou rakamlarına dönüştürmektir.

Test durumları

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

Bayt cinsinden en kısa kod kazanır.


1
Daha uzun zamandır Suzhou'da 3 kez bulundum (oldukça güzel bir şehir) ama Suzhou rakamlarını bilmiyordum. Sen benim +
Thomas Weller,

2
@ThomasWeller Benim için tam tersi: bu görevi yazmadan önce sayıların ne olduğunu biliyordum, ancak “Suzhou sayıları” olarak adlandırılmadıklarını biliyordum. Aslında bu ismi (veya herhangi bir ismi) çağırdıklarını hiç duymadım. Onları pazarlarda ve el yazısıyla yazılmış Çin tıbbı reçetelerinde gördüm.
u54112

Karakter dizisi biçiminde girdi alabilir misiniz?
Ignorance'ın

@EmbodimentoFIgnorance Evet. Zaten yeterince insan dize girişi alıyor.
u54112

Yanıtlar:



9

R , 138 bayt

Bahse girerim bunu yapmanın daha kolay bir yolu vardır. gsubAlternatif sayısal konumları almak için kullanın .

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

Çevrimiçi deneyin!


9

JavaScript, 81 bayt

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

Çevrimiçi deneyin!

Kullanarak 14>>c3 bayt kaydeder. Arnauld'a teşekkürler .


8

Retina , 46 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

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

İki hane 1-3 veya başka bir hane ile eşleştirin.

_T`d`〇〡-〩`^.

Her karşılaşmanın ilk karakterini Suzhou ile değiştir.

T`123`一二三

Kalan basamakları yatay Suzhou ile değiştirin.

Retina 0.8.2'deki 51 bayt :

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

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

Her ikisi de 1-3 ise girişi ayrı ayrı rakamlara veya rakam çiftlerine ayırın.

mT`d`〇〡-〩`^.

Her satırın ilk karakterini Suzhou ile değiştirin.

T`¶123`_一二三

Çizgileri tekrar birleştirin ve kalan basamakları yatay Suzhou ile değiştirin.


7

Perl 5 -pl -Mutf8 , 53 46 bayt

Grimy sayesinde -7 bayt

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

Çevrimiçi deneyin!

açıklama

# 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 bayt 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\34
TIO'da

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

6

Java (JDK) , 120 bayt

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

Çevrimiçi deneyin!

Kredi


1
c=s[i]-48;if(p>0&p<4&c>0&c<4)olabilir if(p>0&p<4&(c=s[i]-48)>0&c<4)ve sonra da köşeli ayraçları döndürebilirsiniz. Ayrıca, else{p=c;s[i]+=c<1?12247:12272;}olabilirelse s[i]+=(p=c)<1?12247:12272;
Kevin Cruijssen,

1
@KevinCruijssen Teşekkürler! Hala bu cevabı golf oynuyordum, ama yine de bana yardımcı oldu ^^ Şimdi sanırım golf oynamayı bitirdim.
Olivier Grégoire



3

Temiz , 181 165 bayt

Tüm sekizli çıkışlar, eşdeğer tek baytlık karakterlerle değiştirilebilir (ve her biri bir bayt olarak sayılır), ancak okunabilirlik için kullanılabilirler çünkü aksi takdirde TIO ve SE'yi geçersiz UTF-8 ile kırarlar.

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]

Çevrimiçi deneyin!

Kodlamadan habersiz bir derleyici hem bir kutsama hem de bir lanettir.





2

C, 131 bayt

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

Çevrimiçi deneyin!

Açıklama: Her şeyden önce - Tüm değişkenleri kısaltmak için char kullanıyorum.

Dizi sgerekli tüm Suzhou karakterlerini tutar.

Gerisi, bir dize olarak ifade edilen verilen sayı üzerinde oldukça fazla yineleniyor.

Terminale yazarken, giriş numarası değerini kullanıyorum (ASCII'de - 48 karakteri), 3 ile çarpılır çünkü UTF-8'de tüm bu karakterler 3 bayt uzunluğundadır. Yazdırılmakta olan 'string' her zaman 3 byte uzunluğundadır - yani gerçek bir karakter.

Değişkenler cve dsadece mevcut ve bir sonraki giriş karakterine (sayı) 'kısayollar'.

Değişken f0 veya 27 tutar - bir sonraki 1/2/3 karakterinin alternatif bir karaktere kaydırılması gerekip gerekmediğini belirtir - 27 dizideki normal ve alternatif karakter arasındaki kaymadır.

f=c*d&&(c|d)<4&&!f?27:0 - eğer c * d! = 0 ise f 'ye 27 ve her ikisi de <4 ise ve f 0 değilse, aksi takdirde 0 yazın.

Olarak yeniden yazılabilir:

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

Belki traş olmak için bazı baytlar vardır, ama artık bariz bir şey bulamıyorum.




1

K (ngn / k) , 67 bayt

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

Çevrimiçi deneyin!

10\ ondalık basamağın listesini al

{ }@ aşağıdaki işlevi uygulayın

x&x<4 boole (0/1), argümanın 4'ten küçük ve sıfır olmayanların listesi

<\azdan daha az tara. bu, ardışık 1s işlemlerini alternatif 1s ve 0'lara dönüştürür.

x+9* 9 ile çarpın ve ekleyin x

yan yana dizine endeksleme, bu yüzden dizinleri olarak kullanın ...

0N 3#"〇一二三〤〥〦〧〨〩〡〢〣"Verilen dize, 3 baytlık dizelerin bir listesine bölün. k unicode farkında değil, bu yüzden sadece bayt görüyor

,/ concatenate


1

Wolfram Dili (Mathematica) , 117 bayt

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

Çevrimiçi deneyin!

TIO'da bunun sonucu kaçan formda verdiğini unutmayın. Normal Wolfram ön ucunda şöyle görünür:notebook arayüzü resmi


1
İki ve üçlüler için yatay vuruş notasyonu uygulayabilir misiniz? Örneğin f[123]dönmeli 〡二〣.
u54112

1

Japt , 55 bayt

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

Çevrimiçi deneyin!

TIO'nun tercih ettiğim tercümandan farklı bir bayt sayısı verdiğine dikkat çekiyor , ancak bana daha düşük bir puan veren birine güvenmemek için hiçbir neden göremiyorum.

Açıklama:

    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 bayt, 81 karakter

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

Çevrimiçi deneyin!

@Jo King sayesinde 17 bayt kaydedildi

Eski cevap

C # (.NET Core) , 124 bayt, 98 karakter

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

Çevrimiçi deneyin!

Bir liste şeklinde girdi alır ve bir IEnumerable döndürür. Bu giriş / çıkışın uygun olup olmadığını bilmiyorum, bu yüzden eğer değilse bana bildirin.

açıklama

Bunun nasıl çalıştığı, tüm tamsayıları kendi Suzhou sayı formlarına dönüştürmesidir, ancak yalnızca değişken bdoğruysa. bne zaman bir, iki veya üç olan bir tamsayıyla karşılaştığımızda ve aksi takdirde true olarak ayarlandığında tersine çevrilir. Yanlış bise, tamsayıyı dikey sayılardan birine çeviririz.


0

R , 104 bayt

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

Çevrimiçi deneyin!

R'de alternatif bir yaklaşım. Bazı Perl tarzı Regex özelliklerinden yararlanma ( Tdeğiştirme işlevindeki son param;perl=TRUE ).

İlk olarak, sayıları alfabetik karakterlere a-jçeviririz, daha sonra bcd(eskiden 123) yinelenen oluşumlarını büyük harfe dönüştürmek için Regex sübstitüsyonunu kullanırız ve son olarak karakterleri küçük harf ve büyük harflerin farklı kullanımıyla Suzhou rakamlarına çeviririz.

Bunların çekildiği gibi, test durumları hazırlanması için J.Doe için kredi onun cevabını .


0

C #, 153 bayt

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

Çevrimiçi deneyin!


Bu 153 bayttır, bu arada karakterler her zaman bayt anlamına gelmez. Bazı karakterler çoklu bayt değerindedir.
Ignorance'ın

Oh, cevabımı düzenledim. Bilgi için teşekkürler :)
zruF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.