Challenge: Đọc số và viết số

Mình định làm challenge chuyển ngôn ngữ, nhưng vì @drgnz cũng muốn làm challenge như vậy nên mình để từ từ rồi tính tiếp.


  • Cho 1 số tự nhiên không giới hạn kiểu, in ra cách đọc số đó.

VD:

1
mot
14
muoi bon
44
bon muoi tu
15
muoi lam
25
hai muoi lam
103
mot tram linh ba
  • Cho 1 cách đọc số, in ra cách số đó.

VD:

hai
2
ba muoi
30
ba muoi tu nghin ty
34000000000000 // Chú thích: số này = 34000 * 10^9

Giới hạn

  • Code không dài quá 150 dòng.

  • Không code kiểu rút dòng. Tức là

a = b; b = c;

hay

if (a == b) c = d, e = f;

không hợp lệ nhưng

a = b;
b = c;

hay

for (int i=0; i<n; i++)

hợp lệ.

  • Dùng càng ít lần if càng tốt, nhưng không dùng quá 7 lần if.

  • Không dùng dạng biến thể của if (a > b ? a : b), không dùng switch case.

  • Không dùng vòng lặp.

Sample test

Input

30
mot tram le ba

Output

ba muoi
103

Test case

không có :smile:

:gift::gift::gift:

Chưa nghĩ ra :smile:

3 Likes

Làm challenge “giải mã” teen code v2 có vẻ hóc búa hơn đó :smiling_imp:

3 Likes

Mình chưa biết drgnz có làm challenge đấy không nữa :v

3 Likes

Làm luôn đi HK Boy :v

5 Likes

hack não còn hơn cả teen code v2 nữa

Bài này hồi lớp 11 xưa xửa ông thầy Pascal cho làm, mới đọc từ số sang chữ thôi chứ từ chữ thành số thì hơi gắt :v

2 Likes

Code này viết từ hồi còn bập bõm, đừng cười :v

USES crt;
VAR ht: ARRAY[1..12] OF STRING;
    ds: ARRAY[0..9] OF STRING;
    so: ARRAY[0..9] OF BYTE;
    sau,s,tl: STRING;
    i,n,p,q,d,l,k: BYTE;
BEGIN
REPEAT
REPEAT
clrscr;
textcolor(10);
ht[1]:='tram'; ht[2]:='muoi'; ht[3]:='ti'; ht[4]:='tram'; ht[5]:='muoi';
ht[6]:='trieu'; ht[7]:='tram'; ht[8]:='muoi'; ht[9]:='nghin'; ht[10]:='tram'; ht[11]:='muoi'; ht[12]:='don vi';
ds[0]:='khong'; ds[1]:='mot'; ds[2]:='hai'; ds[3]:='ba'; ds[4]:='bon'; ds[5]:='nam';
ds[6]:='sau'; ds[7]:='bay'; ds[8]:='tam'; ds[9]:='chin';
writeln; write('       Nhap so can doc: '); readln(s);
n:=length(s);
FOR i:=n DOWNTO 1 DO
    IF s[i]<>'0' THEN p:=i;
    delete(s,1,p-1);
n:=length(s);
UNTIL n<=12;
d:=0;
FOR i:=1 TO n DO                                            
    BEGIN
    val(s[i],so[i],l);
    d:=d+l;
    END;                                     
writeln; IF d>0 THEN writeln('       Oop! Ki tu khong hop le :)') ELSE
    BEGIN
    sau:='';
    FOR i:=1 TO n DO
    IF so[i]<>0 THEN q:=i;                           
    FOR i:=1 TO q DO 
        BEGIN
        sau:=sau+' '+ds[so[i]]+' '+ht[12-n+i];
        END;
    IF ((n-q+1) MOD 3=0) THEN sau:=sau+' '+ht[12-n+q+2];
    IF ((n-q-1) MOD 3=0) THEN sau:=sau+' '+ht[12-n+q+1];
WHILE pos('mot muoi',sau)>0 DO
    BEGIN
        k:=pos('mot muoi',sau);
        delete(sau,k,4);
        insert('',sau,k);
    END;
WHILE pos('khong muoi',sau)>0 DO
    BEGIN
        k:=pos('khong muoi',sau);
        delete(sau,k,10);
        insert('linh',sau,k);
    END;
WHILE pos('muoi khong',sau)>0 DO
    BEGIN
        k:=pos('muoi khong',sau);
        delete(sau,k+4,6);
    END;
    sau[2]:=upcase(sau[2]); writeln; writeln('====> ',sau,'.'); END;
    writeln; write(' ~~~ lam lai khong ? (Enter/n): '); readln(tl);
UNTIL tl='n';
readln
END.

Chia buồn với bác, code của bác không đáp ứng giới hạn :v

:v thôi để khi khác, ôn thi đã, kỳ này tạch thêm môn nữa thì về quê chăn bò

2 Likes

Tuy đã lâu, nhưng h e ms biết có trò này, cũng xin góp ý chút.
link: :point_right: https://ideone.com/d7BszJ.
Nhờ các đại ca chỉ giáo, có sai sót thì cũng nhẹ nhàng khuyên bảo. :smile:

1 Like

Case này bị Runtime error:

333333333333
1
503201469
0

:face_with_raised_eyebrow:

2 Likes

Tại e để kiểu int, muốn to hơn a phải tự đổi sang long or long long int chứ. :blush:

1 Like

Phải nhập string thôi. long long thì vẫn có giới hạn

Tại thực ra là e đang làm dở code cho thằng bạn e là in số tiền điện dạng chữ, nên đầu vào nó là một số. Nhưng mà dùng long long cũng là tm đc cái số của a.
Ns thật là e cũng ngu ngu về phần đọc số. :slight_smile: nên mãi ms nghĩ ra được cách đọc của nó.
Mời đại ca thử lại :point_right: https://ideone.com/5y54Up.
Còn nếu đầu vào là string thì đảo chuỗi rồi nhảy thôi. :joy:

2 Likes

1000001 in word is: Mot Trieu Khong Tram Khong Tram Linh Mot
15 in word is: Muoi Nam
1000001000000001 in word is: Mot Trieu Khong Tram Khong Tram Linh Mot Ty Khong Tram Khong Tram Khong Tram Linh Mot

thiếu/sai mấy chữ triệu, nghìn ở chỗ không trăm nè
mười lăm chứ sao lại mười năm :V

1000001 --> một triệu không nghìn không trăm linh một
15 --> mười lăm
1000001011111 --> một triệu không nghìn không trăm linh một tỷ, không triệu không nghìn không trăm linh một

3 Likes

Thánh tester. :joy:
Ghi nhận ý kiến từ đại ca, cơ mà 15 e tưởng đọc “Mười Năm”. :slightly_smiling_face:

Lại nhờ đại ca test hộ vậy, ns thật e cx k biết là nó đọc đúng hay mình đọc đúng. :joy:
Link :point_right: https://ideone.com/IYTuZk.

2 Likes
3 Likes

6 if :smiley:

module Rogp10::Challenge::D58832
   refine Integer do
   def to_human_read(units='')
    unstack = to_s.each_char.map(&:to_i)
    p unstack[1].class
    lop = [units, 'nghin', 'trieu', 'ty', 'nghin ty', 'trieu ty', 'ty ty'].freeze
    chu_so = %w(khong mot hai ba bon nam sau bay tam chin).freeze
    chu_so_chuc = ['linh', 'muoi', 'hai muoi', 'ba muoi', 'bon muoi', 'nam muoi', 'sau muoi', 'bay muoi', 'tam muoi', 'chin muoi'].freeze
    p chu_so_chuc
    chu_so_dv = %w(khong mot hai ba bon lam sau bay tam chin).freeze
    kq = []
    count = 0
    i = unstack.length - 1
    while(i>=2)
      unless unstack[i] == 0 && unstack[i-1] == 0 && unstack[i-2] == 0
        kq << lop[count]
        if unstack[i] == 0
          kq << chu_so_chuc[unstack[i-1]] if unstack[i-1] != 0
        else
          kq << "#{chu_so_chuc[unstack[i-1]]} #{chu_so_dv[unstack[i]]}"
        end
        kq << "#{chu_so[unstack[i-2]]} tram" if unstack[i-2] != 0
      end
      i-=3
      count+=1
    end
    if(i == (0..1))
      kq << lop[count+=1]
      if i == 0
         kq << chu_so[unstack[0]]
      else
         kq << "#{chu_so_chuc[unstack[1]]} #{chu_so_dv[unstack[0]]}"
      end
    end
    kq.reverse.join(' ')
  end
end
3 Likes

chữ số 5 sao bị đọc thành “lăm” hết thế lày :V
sửa lại nhận vào chuỗi nhưng sao lại ko xử lý số 0 đứng đầu cho chuẩn :V
đó là chưa xét cho chuỗi có ký tự ko hợp lệ như abc :V

0 in words is: Khong
1 in words is: Mot
2 in words is: Hai
3 in words is: Ba
4 in words is: Bon
5 in words is: Lam
6 in words is: Sau
7 in words is: Bay
8 in words is: Tam
9 in words is: Chin
10 in words is: Muoi
11 in words is: Muoi Mot
12 in words is: Muoi Hai
15 in words is: Muoi Lam
19 in words is: Muoi Chin
20 in words is: Hai Muoi
25 in words is: Hai Muoi Lam
27 in words is: Hai Muoi Bay
99 in words is: Chin Muoi Chin
100 in words is: Mot Tram
500 in words is: Lam Tram
105 in words is: Mot Tram Linh Lam
113 in words is: Mot Tram Muoi Ba
169 in words is: Mot Tram Sau Muoi Chin
1000 in words is: Mot Nghin
1001 in words is: Mot Nghin Khong Tram Linh Mot
1010 in words is: Mot Nghin Muoi
1011 in words is: Mot Nghin Khong Tram Muoi Mot
1050 in words is: Mot Nghin Lam Muoi
1054 in words is: Mot Nghin Khong Tram Lam Muoi Bon
1100 in words is: Mot Nghin Mot Tram
1101 in words is: Mot Nghin Mot Tram Linh Mot
1110 in words is: Mot Nghin Mot Tram Muoi
1120 in words is: Mot Nghin Mot Tram Hai Muoi
1020123 in words is: Mot Trieu Hai Muoi Nghin Mot Tram Hai Muoi Ba
123456789123456789 in words is: Mot Tram Hai Muoi Ba Trieu Bon Tram Lam Muoi Sau Nghin Bay Tram Tam Muoi Chin Ty Mot Tram Hai Muoi Ba Trieu Bon Tram Lam Muoi Sau Nghin Bay Tram Tam Muoi Chin
01 in words is: Linh Mot
001 in words is: Khong Tram Linh Mot
011 in words is: Khong Tram Muoi Mot
0123 in words is: Nghin Mot Tram Hai Muoi Ba
00123 in words is: Mot Tram Hai Muoi Ba
000123 in words is: Mot Tram Hai Muoi Ba
000012 in words is: Khong Tram Muoi Hai
000001 in words is: Khong Tram Linh Mot
adsf in words is: Nghin Tram Muoi

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?