Trong ngôn ngữ lập trình bí truyền xoăn, các chương trình chỉ bao gồm các dấu ngoặc nhọn {}
và dấu chấm phẩy ;
. Mặc dù bộ công cụ khiêm tốn này, xoăn có nghĩa đen có thể đại diện cho bất kỳ số nguyên không âm nào. Tuy nhiên, định dạng hơi khó đọc đối với người không quen biết, vì vậy hãy viết một số mã để thực hiện chuyển đổi cho chúng tôi.
Định dạng số
Số xoăn được cấu trúc theo các quy tắc sau:
- Thêm một dấu chấm phẩy thêm một vào số.
- Một số được bao quanh trong dấu ngoặc nhọn được nhân với bốn.
- Các nhóm giằng xoăn có thể được lồng nhưng không được nối. Niềng răng phải phù hợp.
- Dấu chấm phẩy bên ngoài một bộ dấu ngoặc nhọn phải đến sau chứ không phải trước đó.
- Để tránh sự mơ hồ trong phân tích cú pháp, một số phải luôn bắt đầu bằng dấu ngoặc nhọn.
Vài ví dụ:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Lưu ý rằng quy tắc 5 có nghĩa là các số từ 0 đến 3 phải bắt đầu bằng một cặp dấu ngoặc nhọn trống.)
Và một số ví dụ không hợp lệ:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Đây là một ngữ pháp BNF cho các số xoăn:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Các số như {;;;;}
(hơn 3 dấu chấm phẩy liên tiếp) hoặc {{};}
(các nhóm nẹp trống không cần thiết) được gọi là các số xoăn không đúng . Chúng tuân theo ngữ pháp trên và có thể được đánh giá theo cách thông thường, nhưng chúng cũng có khả năng biểu diễn ngắn hơn (đối với các ví dụ trên {{;}}
và {;}
tương ứng).
Các thách thức
Viết chương trình hoặc hàm nhập / nhận chuỗi. Nếu chuỗi là một số thập phân số nguyên dương, sản lượng / trả lại đúng (tức là ngắn nhất có thể) đại diện cho Quăn số nguyên đó. Nếu chuỗi là một số xoăn, xuất / trả về biểu diễn thập phân của nó.
Đầu vào có thể được nhận thông qua STDIN, đối số dòng lệnh hoặc tham số hàm. Nó phải là một chuỗi; nghĩa là, bạn không được viết hàm chấp nhận chuỗi cho số Quăn mà là số nguyên cho số thập phân.
Đầu ra có thể được in ra STDOUT hoặc trả về từ hàm. Một hàm có thể trả về một số nguyên khi thích hợp hoặc nó có thể trả về các chuỗi trong mọi tình huống.
Chương trình của bạn không phải xử lý đầu vào xấu (Số xoăn phá vỡ quy tắc định dạng, số dấu phẩy động, số nguyên âm, văn bản ngẫu nhiên) và không bắt buộc phải xử lý số Quăn không đúng (nhưng xem bên dưới). Đầu vào sẽ chỉ bao gồm các ký tự ASCII có thể in được.
Chấm điểm
Mã ngắn nhất tính bằng byte thắng. Nếu chương trình của bạn có thể làm cả hai điều sau đây:
- xử lý chính xác các số xoăn không chính xác và
- khi được cung cấp số xoăn, bỏ qua bất kỳ ký tự phụ nào không
{};
sau đó trừ 10% từ điểm số của bạn. (Đầu vào số nguyên sẽ không bao giờ có các ký tự không liên quan, ngay cả đối với phần thưởng.)
Các trường hợp thử nghiệm
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Đối với phần thưởng:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Lưu ý: Quăn chưa được thực hiện. Nhưng nếu câu hỏi này làm tốt, tôi có thể phát triển nó hơn nữa.