Nhờ sự giúp đỡ của bạn trong thử thách Mark My Mail , PPCG-Post đã đóng dấu thành công tất cả các bưu kiện của mình bằng mã vạch được tạo!
Bây giờ, đã đến lúc giải mã chúng.
Trong thử thách này, chương trình của bạn sẽ, đưa ra một mã vạch được tạo từ thử thách Mark My Mail , giải mã nó và trả về số nguyên được mã hóa.
Nhưng xem ra! Mã vạch có thể bị lộn ngược ...
Mã vạch 4 trạng thái
Trong trường hợp bạn bỏ lỡ thử thách mã hóa, bạn sẽ cần biết loại mã vạch nào chúng ta đang nói đến. Mã vạch 4 trạng thái là một hàng thanh có bốn trạng thái có thể, mỗi trạng thái đại diện cho một số nguyên cơ sở 4:
| |
Bar: | | | |
| |
Digit: 0 1 2 3
Được hiển thị trong ASCII, mã vạch sẽ chiếm ba dòng văn bản, sử dụng |
ký tự pipe ( ) để thể hiện một phần của thanh và dấu cách ( ) để thể hiện một phần trống. Sẽ có một khoảng trống ở giữa mỗi thanh. Một mã vạch ví dụ có thể trông như thế này:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Để chuyển đổi mã vạch trở lại số nguyên mà nó mã hóa, ánh xạ mỗi thanh thành chữ số cơ sở tương ứng của nó, nối các mã này và chuyển đổi nó thành số thập phân.
Vì mỗi mã vạch cũng sẽ đại diện cho một mã vạch khác nhau khi lộn ngược, chúng tôi thực hiện một chuỗi bắt đầu / dừng để có thể tính toán nguồn gốc. Với mục đích của thử thách này, chúng tôi sẽ sử dụng chuỗi bắt đầu / dừng được chỉ định bởi Australia Post: mỗi mã vạch bắt đầu và kết thúc bằng một 1 0
chuỗi.
Các thách thức
Nhiệm vụ của bạn là, được cung cấp mã vạch 4 trạng thái ASCII, phân tích cú pháp và trả về số nguyên mà nó mã hóa - về cơ bản là đảo ngược của Mark My Mail .
Nhưng để cải thiện mọi thứ, có một nhược điểm - mã vạch có thể bị đảo lộn. Như trong thế giới thực, nó sẽ được để lại cho đầu đọc mã vạch (chương trình của bạn) để xác định hướng chính xác bằng cách sử dụng chuỗi bắt đầu / dừng.
Thí dụ:
Cho mã vạch sau:
| | | | | | | | | | | | | | | | | | | |
Chúng ta có thể thấy rõ rằng các cặp chữ số đầu tiên và cuối cùng có 0, 2
và không 1, 0
. Điều này có nghĩa là mã vạch bị lộn ngược - vì vậy chúng ta phải xoay 180 độ (không chỉ lật từng thanh) để đạt được hướng chính xác:
| | | | | | | | | | | | | | | | | | | |
Bây giờ, chúng ta có thể bắt đầu giải mã. Chúng tôi ánh xạ mỗi thanh đến chữ số cơ sở 4 tương ứng của nó, bỏ qua các chuỗi bắt đầu / dừng vì chúng không mã hóa dữ liệu.
| | | | | | | | | | | | | | | | | | | | - - 2 1 0 3 0 2 3 - -
Chúng tôi ghép nó thành số nguyên cơ số 4 2103023
, sau đó chuyển đổi nó thành biểu diễn thập phân của nó 9419
cho kết quả cuối cùng.
Quy tắc
- Đầu vào sẽ luôn là mã vạch 4 trạng thái hợp lệ, được hiển thị trong ASCII như được nêu ở trên, với trình tự bắt đầu / dừng được mô tả.
- Bạn có thể yêu cầu các dấu cách, hoặc các vạch bị tước, cũng như một dòng mới ở cuối - bất kỳ định dạng nào phù hợp với việc chơi gôn của bạn.
- Nó có thể hoặc không thể theo đúng hướng - chương trình của bạn phải xác định xem có nên đọc ngược nó hay không, bằng cách sử dụng trình tự bắt đầu / dừng.
- Nó sẽ không mã hóa các chữ số 0 hàng đầu trong số nguyên cơ sở 4.
- Bạn có thể lấy đầu vào làm danh sách các dòng hoặc một chuỗi có dòng mới.
- Đầu ra phải là một số nguyên trong cơ sở số nguyên tiêu chuẩn của ngôn ngữ của bạn, đại diện cho dữ liệu được mã hóa bằng mã vạch.
- Vì tem bưu chính nhỏ và có thể chứa rất ít mã trên chúng, mã của bạn sẽ cần phải ngắn nhất có thể: đây là một mã golf - vì vậy chương trình ngắn nhất (tính bằng byte) sẽ thắng!
Các trường hợp thử nghiệm
| | | | | | | | | | | | | |
= 4096 (lật)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
= 7313145 (lật)
| | | | | | | | | | | | | | | | | | | |
= 9419 (lật)
| | | | | | | | | | | | | | | | | | |
= 990 (không lật)
| | | | | | | | | | | | | | | | | | |
= 12345 (không lật)
[String]
, [{#Char}]
, [{Char}]
, [[Char]]
?, Cho rằng String
tương đương với{#Char}