Convertir números chinos

10

En chino, los números se escriben de la siguiente manera:

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

Para números superiores a 10, se expresa como el número de decenas y el número de unidades. Si solo hay un diez, no necesita decir explícitamente uno, y si no hay ninguno, no necesita poner nada después:

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

Para números superiores a 100, utiliza la misma lógica, pero con el carácter . Sin embargo, esta vez, si solo hay cien, aún debe escribirlo, y si no hay decenas, debe decir .

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

Su tarea es convertir estos números chinos en números arábigos. Dado un número N en chino ( (1) <= N <= 九百九十九(999)), conviértalo en un número árabe.

Recuerde, este es el , por lo que gana el código con el menor número de bytes.

Oliver Ni
fuente
3
¿Puedes agregar casos de prueba 503y 380?
Martin Ender
1
^ Buen punto. Si estoy siguiendo correctamente, debería ser 503 -> 五百三y 380 -> 三百八十. Además, dices por decenas eso you do not need to explicitly say one. ¿Eso significa que no importa si lo hacemos?
Kade
Relacionado
NoOneIsHere
¿Hasta 999? Debes dar el límite superior
edc65
503 debería ser 五百零三como no hay decenas (creo)
edc65

Respuestas:

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

Los dígitos 一 - 九 se convierten a decimales y se guardan d, mientras que 十 y 百 multiplican el último dígito por 10 o 100 respectivamente y lo acumulan n. se ignora efectivamente, ya que des cero cuando se encuentra.

Neil
fuente
2

Perl, 110 bytes

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

Perl odia a Unicode. Espero que no me haya perdido ninguno de los casos límite, tuve un problema con los números, ¡ 二百十pero ya he abordado eso!

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
Dom Hastings
fuente
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;
Jörg Hülsermann
fuente
Lástima que strtrno sea multibyte seguro. Podría ahorrarte 23 bytes. Pero puede usar en 0+lugar de 00?guardar un byte o puede a) reemplazar con ay en aalugar de 10y 100, b) usar en a+lugar de 100?en la expresión regular yc) en alugar de 0for substr_count(-4).
Titus
@Titus a tu manera con un no puede funcionar en el rango 10-19
Jörg Hülsermann
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 y código de prueba:

Pruébalo aquí

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("九百九十九"));
  }
}

Salida:

1
2
3
4
5
6
7
8
9
10
11
24
83
90
100
231
803
999
Kevin Cruijssen
fuente
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)));}

Recuento de bytes incorrecto anteriormente debido a la codificación ignorada ...

Codificación Big5

Una solución recursiva que rellena la entrada si es 10-19 para un procesamiento más fácil, luego procesa desde la izquierda 2 caracteres a la vez.

Sin golf

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
}
Enlace Ng
fuente
0

Python 3, 128 bytes

Ahorro de 2 + 3 bytes gracias a Shebang y 2 por reemplazar (d>9)+(d>10)conmax(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)

Sin golf:

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)

Respuesta 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á el número final y aes el dígito anterior.

Karl Napf
fuente
La especificación ha cambiado.
Kade
@Shebang Por suerte no importa, 803 todavía funciona.
Karl Napf
1
@TimmyD Se ignora. finddevuelve -1 y eso es más pequeño que 9eso ny a no se han tocado.
Karl Napf
1
[1,a][a>0]*10 -> 10*a**(a>0)ahorra dos bytes :)
Kade
1
[0,d][d<=9] -> d*(d<10)¡también ahorra tres bytes!
Kade