Konvertieren Sie in Suzhou Ziffern


27

Suzhou-Ziffern (蘇州 蘇州; auch 花 花) sind chinesische Dezimalzahlen:

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

Sie funktionieren so ziemlich wie arabische Ziffern, mit der Ausnahme, dass bei aufeinanderfolgenden Ziffern, die zum Satz gehören {1, 2, 3}, die Ziffern zwischen der vertikalen Strichnotation {〡,〢,〣}und der horizontalen Strichnotation wechseln {一,二,三}, um Mehrdeutigkeiten zu vermeiden. Die erste Ziffer einer solchen fortlaufenden Gruppe wird immer in vertikaler Strichnotation geschrieben.

Die Aufgabe besteht darin, eine positive ganze Zahl in Suzhou-Zahlen umzuwandeln.

Testfälle

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

Kürzester Code in Bytes gewinnt.


1
Ich war dreimal für längere Zeit in Suzhou (eine ziemlich schöne Stadt), wusste aber nichts über die Zahlen in Suzhou. Sie haben meine +1
Thomas Weller

2
@ThomasWeller Für mich ist es das Gegenteil: Bevor ich diese Aufgabe schrieb, wusste ich, wie die Ziffern lauten, aber nicht, dass sie "Suzhou-Ziffern" heißen. Tatsächlich habe ich noch nie gehört, dass sie diesen Namen (oder überhaupt einen Namen) nannten. Ich habe sie auf Märkten und auf handgeschriebenen Rezepten der chinesischen Medizin gesehen.
u54112

Können Sie Eingaben in Form eines Char-Arrays vornehmen?
Verkörperung der Ignoranz

@EmbodimentofIgnorance Ja. Nun, genug Leute nehmen sowieso Zeichenketten-Eingaben entgegen.
u54112

Antworten:



9

R , 138 Bytes

Ich wette, es gibt einen einfacheren Weg, dies zu tun. Verwenden Sie gsub, um die abwechselnden numerischen Positionen abzurufen.

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

Probieren Sie es online!



8

Netzhaut , 46 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

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

Passen Sie entweder zwei Ziffern 1-3 oder eine beliebige andere Ziffer an.

_T`d`〇〡-〩`^.

Ersetze den ersten Charakter jedes Matches durch seinen Suzhou.

T`123`一二三

Ersetzen Sie alle verbleibenden Ziffern durch horizontales Suzhou.

51 Bytes in Retina 0.8.2 :

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

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

Teilen Sie die Eingabe in einzelne Ziffern oder Ziffernpaare auf, wenn beide 1-3 sind.

mT`d`〇〡-〩`^.

Ersetzen Sie das erste Zeichen jeder Zeile durch sein Suzhou.

T`¶123`_一二三

Verbinden Sie die Linien wieder miteinander und ersetzen Sie alle verbleibenden Ziffern durch horizontales Suzhou.


7

Perl 5 -pl -Mutf8 , 53 46 Bytes

-7 Bytes dank Grimy

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

Probieren Sie es online!

Erläuterung

# 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 Bytes mit 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/--</一二三〇〡-〩/(erfordert die Verwendung von wörtlichen Steuerzeichen anstelle von \0\34, idk, wie dies auf TIO zu tun ist)
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;}

Probieren Sie es online!

Credits


1
c=s[i]-48;if(p>0&p<4&c>0&c<4)kann sein if(p>0&p<4&(c=s[i]-48)>0&c<4), und dann können Sie auch die Klammern um die Schleife fallen. Auch else{p=c;s[i]+=c<1?12247:12272;}kann seinelse s[i]+=(p=c)<1?12247:12272;
Kevin Cruijssen

1
@ KevinCruijssen Vielen Dank! Ich habe immer noch Golf gespielt, aber es hat mir trotzdem geholfen ^^ Jetzt denke ich, dass ich damit fertig bin.
Olivier Grégoire



3

Sauber , 181 165 Bytes

Alle oktalen Escapezeichen können durch die entsprechenden Einzelbytezeichen ersetzt werden (und werden jeweils als ein Byte gezählt), werden jedoch aus Gründen der Lesbarkeit verwendet und weil sonst TIO und SE mit ungültigem UTF-8 beschädigt werden.

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]

Probieren Sie es online!

Ein Compiler, der die Codierung nicht kennt, ist sowohl ein Segen als auch ein Fluch.



2

Rot , 198 171 Bytes

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]

Probieren Sie es online!



2

C 131 Bytes

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

Probieren Sie es online!

Erläuterung: Zunächst einmal verwende ich char für alle Variablen, um es kurz zu machen.

Array senthält alle benötigten Suzhou-Zeichen.

Der Rest iteriert so ziemlich über die angegebene Zahl, die als Zeichenfolge ausgedrückt wird.

Beim Schreiben in das Terminal verwende ich den eingegebenen Zahlenwert (also das Zeichen - 48 in ASCII), multipliziert mit 3, da alle diese Zeichen in UTF-8 3 Byte lang sind. Die 'Zeichenkette', die gedruckt wird, ist immer 3 Bytes lang - also ein reales Zeichen.

Variablen cund dsind nur 'Verknüpfungen' zum aktuellen und nächsten Eingabezeichen (Nummer).

Die Variable fenthält 0 oder 27 - es wird angegeben, ob das nächste 1/2/3 Zeichen auf das alternative verschoben werden soll - 27 ist der Versatz zwischen regulärem und alternativem Zeichen im Array.

f=c*d&&(c|d)<4&&!f?27:0 - schreibe 27 nach f wenn c * d! = 0 und wenn beide <4 sind und wenn f nicht 0 ist, schreibe sonst 0.

Könnte umgeschrieben werden als:

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

Vielleicht gibt es ein paar Bytes zu entfernen, aber ich kann nichts Offensichtliches mehr finden.




1

K (ngn / k) , 67 Bytes

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

Probieren Sie es online!

10\ Liste der Dezimalstellen abrufen

{ }@ Wenden Sie die folgende Funktion an

x&x<4 Boolesche (0/1) Liste, in der das Argument kleiner als 4 und ungleich Null ist

<\Scannen mit weniger als. Dadurch werden aufeinanderfolgende Einsen in abwechselnde Einsen und Nullen umgewandelt

x+9* Mit 9 multiplizieren und addieren x

Juxtaposition indiziert, verwenden Sie dies also als Indizes in ...

0N 3#"〇一二三〤〥〦〧〨〩〡〢〣"Die angegebene Zeichenfolge wird in eine Liste von 3-Byte-Zeichenfolgen aufgeteilt. k ist nicht Unicode-fähig, sieht also nur Bytes

,/ verketten


1

Wolfram Language (Mathematica) , 117 Bytes

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

Probieren Sie es online!

Beachten Sie, dass dies bei TIO das Ergebnis in maskierter Form ausgibt. Im normalen Wolfram-Frontend sieht es so aus:Bild der Notebook-Oberfläche


1
Können Sie die horizontale Strichnotation für Zweien und Dreien implementieren? ZB f[123]sollte zurückkehren 〡二〣.
u54112

1

Japt , 55 Bytes

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

Probieren Sie es online!

Es ist erwähnenswert, dass TIO eine andere Byteanzahl angibt als mein bevorzugter Interpreter , aber ich sehe keinen Grund, demjenigen nicht zu vertrauen, der mir eine niedrigere Punktzahl gibt.

Erläuterung:

    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 Zeichen

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

Probieren Sie es online!

17 Bytes dank @Jo King gespeichert

Alte Antwort

C # (.NET Core) , 124 Byte, 98 Zeichen

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

Probieren Sie es online!

Nimmt Eingaben in Form einer Liste entgegen und gibt eine IEnumerable zurück. Ich weiß nicht, ob diese Eingabe / Ausgabe in Ordnung ist. Lassen Sie es mich wissen, wenn dies nicht der Fall ist.

Erläuterung

Das funktioniert so, dass alle Ganzzahlen in ihre jeweilige Suzhou-Zahlenform umgewandelt werden, aber nur, wenn die Variable bwahr ist. bwird immer dann invertiert, wenn wir auf eine Ganzzahl treffen, die eins, zwei oder drei ist, und ansonsten auf true gesetzt. Wenn bfalse ist, setzen wir die Ganzzahl auf eine der vertikalen Zahlen.


0

R , 104 Bytes

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

Probieren Sie es online!

Ein alternativer Ansatz in R. Verwendet einige Regex-Features im Perl-Stil (der letzte TParameter in der Substitutionsfunktion steht für perl=TRUE).

Zuerst übersetzen wir Ziffern in alphabetische Zeichen a-j, dann verwenden wir die Regex-Ersetzung, um doppelte Vorkommen von bcd(früher 123) in Großbuchstaben umzuwandeln , und schließlich übersetzen wir Zeichen in Suzhou-Ziffern, wobei Kleinbuchstaben und Großbuchstaben unterschiedlich behandelt werden.

Dank an J.Doe für die Vorbereitung von Testfällen, da diese seiner Antwort entnommen wurden .


0

153 Bytes

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

Probieren Sie es online!


Das sind übrigens 153 Bytes, Zeichen bedeuten nicht immer Bytes. Einige Zeichen sind mehrere Bytes wert.
Verkörperung der Ignoranz

Na ja, ich habe meine Antwort bearbeitet. Danke für die Information :)
zruF
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.