소주 숫자로 변환


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을 가지고 있습니다
Thomas Weller

2
@ThomasWeller 저에게는 그 반대입니다.이 작업을 쓰기 전에 숫자가 무엇인지 알았지 만 "Suzhou 숫자"라는 이름은 아니 었습니다. 사실 나는 그들이이 이름 (또는 다른 이름)이라고 부르는 것을 들어 본 적이 없습니다. 나는 시장과 필기 한약 처방전에서 그것들을 보았습니다.
u54112

char 배열 형태로 입력 할 수 있습니까?
무지의 구현

@ 무지의 예. 어쨌든 충분한 사람들이 문자열 입력을 받고 있습니다.
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`一二三

남은 자릿수를 수평 소주로 교체하십시오.

Retina 0.8.2 에서 51 바이트 :

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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

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

입력이 모두 1-3 인 경우 개별 숫자 또는 숫자 쌍으로 분할하십시오.

mT`d`〇〡-〩`^.

각 줄의 첫 문자를 소주로 바꿉니다.

T`¶123`_一二三

줄을 다시 연결하고 남은 숫자를 가로 소주로 바꿉니다.


7

펄 5 -pl -Mutf8 , 53 46 바이트

Grimy 덕분에 -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

s/[123]\K[123]/$&^$;/ge;y/--</一二三〇〡-〩/( TIO )를 사용 하여 -3 바이트
Grimmy

49 : s/[123]{2}/$&^v0.28/ge;y/--</一二三〇〡-〩/( 티오 ). 48 : s/[123]{2}/$&^"\0\34"/ge;y/--</一二三〇〡-〩/( \0\34TIO에서 idk 대신 리터럴 제어 문자를 사용해야 함 )
Grimmy

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

6

자바 (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

클린 , 181165 바이트

모든 8 진 이스케이프는 동등한 1 바이트 문자로 대체 될 수 있으며 (각각 1 바이트로 계산 됨) 가독성을 위해 사용되며 그렇지 않으면 유효하지 않은 UTF-8로 TIO 및 SE가 중단됩니다.

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 바이트 길이이므로 하나의 실제 문자입니다.

변수 c이며 d현재 및 다음 입력 문자 (숫자)에 대한 '바로 가기'입니다.

변수 f는 0 또는 27을 보유합니다. 다음 1/2/3 문자를 대체 1로 이동해야하는지 나타냅니다. 27은 배열의 일반 문자와 대체 문자 사이의 오프셋입니다.

f=c*d&&(c|d)<4&&!f?27:0 -c * d! = 0 인 경우 27에 f를 쓰고 둘 다 <4이고 f가 0이 아니면 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\ 소수 자릿수 목록을 얻습니다.

{ }@ 다음 기능을 적용하십시오

x&x<4 인수가 4보다 작고 0이 아닌 부울 (0/1) 목록

<\보다 작게 스캔하십시오. 이것은 연속 1의 런을 교대로 1과 0으로 바꿉니다.

x+9* 9를 곱하고 더하기 x

병치가 인덱싱되므로 인덱스로 색인을 사용하십시오.

0N 3#"〇一二三〤〥〦〧〨〩〡〢〣"주어진 문자열을 3 바이트 문자열 목록으로 분할합니다. k는 유니 코드를 인식하지 못하므로 바이트 만 보입니다.

,/ 사슬 같이 잇다


1

Wolfram Language (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 코어) , 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 코어) , 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];});}

온라인으로 사용해보십시오!

List 형식으로 입력을 받아서 IEnumerable을 반환합니다. 이 입력 / 출력이 정상인지 모르겠습니다. 그렇지 않은 경우 알려주십시오.

설명

이것이 작동하는 방법은 모든 정수를 각각의 소주 숫자 형식으로 변환하지만 변수 b가 true 인 경우에만 가능 합니다. b1, 2 또는 3의 정수를 만날 때마다 반전되고 그렇지 않으면 true로 설정됩니다. 경우 b거짓, 우리는 수직 숫자 중 하나에 정수를 켜십시오.


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]+"":""))

온라인으로 사용해보십시오!


그건 그렇고, 문자가 항상 바이트를 의미하는 것은 아닙니다. 일부 문자는 여러 바이트 가치가 있습니다.
무지의 구현

잘, 나는 나의 대답을 편집했다. 정보 주셔서 감사합니다 :)
zruF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.