Converter números chineses


10

Em chinês, os números são escritos da seguinte forma:

1 一 2 二 3 三 4 四 5 五 6 六 7 七 8 八 9 九 10 十

Para números acima de 10, é expresso como o número de dezenas e o número de unidades. Se houver apenas um dez, você não precisará dizer explicitamente um e, se não houver nenhum, não precisará colocar nada depois:

11 十一
24 二十四
83 八十三
90 九十

Para números acima de 100, você usa a mesma lógica, mas com o caractere . Desta vez, porém, se houver apenas cem, você ainda precisará escrevê-lo e, se não houver dezenas, precisará dizer .

100 一百 231 二百三十一 803 八百零三 999 九百九十九

Sua tarefa é converter esses números chineses em algarismos arábicos. Dado um número N em chinês ( (1) <= N <= 九百九十九(999)), converta-o em um número árabe.

Lembre-se, isso é , portanto o código com o menor número de bytes vence.


3
Você pode adicionar casos de teste 503e 380?
Martin Ender

1
^ Bom ponto. Se estou seguindo corretamente, deve ser 503 -> 五百三e 380 -> 三百八十. Além disso, você diz por dezenas isso you do not need to explicitly say one. Isso significa que não importa se o fizermos?
Kade


Até 999? Você deve dar o limite superior
edc65 28/10

503 deve ser 五百零三já que não existem dezenas (eu acho)
edc65

Respostas:


3

JavaScript (ES6), 112 bytes

s=>[...s].map(c=>d=(i="零一二三四五六七八九十百".search(c))>9?(n+=(d||1)*(i*90-890),0):i,n=d=0)&&n+d

Os dígitos 一 - 九 são convertidos em decimal e salvos em d, enquanto 十 e 百 multiplicam o último dígito por 10 ou 100 respectivamente e o acumulam em n. é efetivamente ignorado, pois djá é zero quando é encontrado.


2

Perl, 110 bytes

Código de 98 bytes + 12 para -plC -Mutf8.

Perl odeia unicode. Espero não ter perdido nenhum caso extremo, tive um problema com números como esse, 二百十mas já resolvi isso agora!

s/十/*10+/;s/百/*100+/;y/一二三四五六七八九零/123456789 /;s/^\*|\+\*/+/g;$_=eval"$_-0"

Uso

perl -plC -Mutf8 -e 's/十/*10+/;s/百/*100+/;y/一二三四五六七八九零/123456789 /;s/^\*|\+\*/+/g;$_=eval"$_-0"' <<< '一
二
三
四
五
六
七
八
九
十
十一
二十四
八十三
九十
一百
二百三十一
八百零三
九百九十九'
1
2
3
4
5
6
7
8
9
10
11
24
83
90
100
231
803
999

2

PHP, 225 bytes

preg_match_all("#[1-9]?10+|[1-9]#",str_replace(["一","二","三","四","五","六","七","八","九","十","百"],[1,2,3,4,5,6,7,8,9,10,100],$argv[1]),$z);foreach($z[0]as$p)$s+=($b=substr_count($p,0))?$p[0]*10**$b:$p;echo$s;

Pena que strtrnão é seguro multibyte. Pode economizar 23 bytes. Mas você pode usar em 0+vez de 00?salvar um byte ou a) substituir por ae em aavez de 10e 100b) usar em a+vez de 100?no regex ec) em avez de 0em substr_count(-4).
Titus

@Titus do seu jeito com um não pode funcionar no intervalo de 10 a 19
Jörg Hülsermann 28/16

2

Java 7, 236 233 229 bytes

int c(String s){String x=" 一二三四五六七八九十百";int l=s.length(),i=x.indexOf(s.charAt(l-1)),j=x.indexOf(s.charAt(0)),q=j*100;return l<2?i:l<3?i==10?j*10:i>10?q:10+i:l<4?j*10+i:l<5?q+i:q+i+x.indexOf(s.charAt(2))*10;}

Ungolfed & código de teste:

Experimente aqui.

class M{
  static int c(String s){
    String x = " 一二三四五六七八九十百";
    int l = s.length(),
        i = x.indexOf(s.charAt(l-1)),
        j = x.indexOf(s.charAt(0));
    if(l<2) return i; // 1-10
    if(l<3){
      if(i==10) return j*10; // 20,30,40,50,60,70,80,90
      if(i>10) return j*100; // 100,200,300,400,500,600,700,800,900
      return 10+i; // 11-19
    }
    if(l<4) return j*10+i; // 21-29,31-39,41-49,51-59,61-69,71-79,81-89,91-99
    if(l<5) return j*100+i; // 101-109,201-209,301-309,401-409,501-509,601-609,701-709,801-809,901-909
    return j*100+i+x.indexOf(s.charAt(2))*10; // 111-119,121-129,131-139,...,971-979,981-989,991-999
  }

  public static void main(String[] a){
    System.out.println(c("一"));
    System.out.println(c("二"));
    System.out.println(c("三"));
    System.out.println(c("四"));
    System.out.println(c("五"));
    System.out.println(c("六"));
    System.out.println(c("七"));
    System.out.println(c("八"));
    System.out.println(c("九"));
    System.out.println(c("十"));
    System.out.println(c("十一"));
    System.out.println(c("二十四"));
    System.out.println(c("八十三"));
    System.out.println(c("九十"));
    System.out.println(c("一百"));
    System.out.println(c("二百三十一"));
    System.out.println(c("八百零三"));
    System.out.println(c("九百九十九"));
  }
}

Resultado:

1
2
3
4
5
6
7
8
9
10
11
24
83
90
100
231
803
999

0

C #, 197 210 bytes

int x(string s){if(s=="")return 0;if(s[0]=='零')s=s.Substring(1);if(s[0]=='十')s="一"+s;string t=" 一二三四五六七八九";return s.Length<2?t.IndexOf(s[0]):(t.IndexOf(s[0])*(s[1]=='百'?100:10)+x(s.Substring(2)));}

Contagem de bytes incorreta anteriormente devido à codificação ignorada ...

Codificação Big5

Uma solução recursiva que preenche a entrada de 10 a 19 para facilitar o processamento e processa a partir de 2 caracteres à esquerda de cada vez.

Ungolfed

public int x(string s)
{
    if (s == "")
        return 0;   // Recursion termination when input is divisible by 10 (no unit digit character)
    if (s[0] == '零')
        s = s.Substring(1);   // Ignore '零'
    if (s[0 ]== '十')
        s = "一" + s;   // Normalize 10-19 by padding with "一"
    string t = " 一二三四五六七八九";   // Index lookup
    return s.Length < 2
        ? t.IndexOf(s[0])   // 0-9
        : (t.IndexOf(s[0]) * (s[1] == '百' ? 100 : 10) + x(s.Substring(2)));
    // Get the first character's digit, multiply by 100 or 10 depends on 2nd character, and recursively process from 3rd character onwards
}

0

Python 3, 128 bytes

Salvando 2 + 3 bytes graças a Shebang e 2 por substituir (d>9)+(d>10)pormax(d-9,0)

n=a=0
for c in input():d=" 一二三四五六七八九十百".find(c);n+=[0,10*a**(a>0),a*100][max(d-9,0)];a=d*(d<10)
print(n+a)

Ungolfed:

n=a=0
for c in input():
 d=" 一二三四五六七八九十百".find(c)
 n+=[0, 10*a**(a>0), a*100][max(d-9,0)] 
 a=d*(d<10)
print(n+a)

Resposta inicial

n=a=0
for c in input():
 d=" 一二三四五六七八九十百".find(c)
 if d<=9:a=d
 elif d==10:n+=[1,a][a>0]*10;a=0
 elif d==11:n+=a*100;a=0
print(n+a)

nserá o número final e aé o dígito anterior.


A especificação mudou.
Kade

@ Shebang Felizmente, não importa, 803 ainda funciona.
27616 Karl Napf

1
@ TimmyD É ignorado. findretorna -1 e é menor que 9isso ne não a é tocado.
Karl Napf

1
[1,a][a>0]*10 -> 10*a**(a>0)salva dois bytes :)
Kade

1
[0,d][d<=9] -> d*(d<10)economiza três bytes também!
Kade
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.