Rút ngắn một số dài


10

Khi xử lý các số dài khi chơi golf mã, việc giảm độ dài mã của bạn có thể khó khăn, vậy bạn có mẹo nào để làm cho một số ngắn hơn và dễ quản lý hơn không?

Ví dụ: mã Pyth sau đây in "Hello world", nhưng ở mức 44 byte, điều đó không thỏa đáng:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

Vậy làm thế nào để tôi rút ngắn số dài 85942000775441864767076?

Câu trả lời:


10

Thời gian hoàn hảo cho câu hỏi này @isaacg vừa thêm một tính năng mới ngày hôm nay, cho phép rút ngắn số lượng như vậy vô cùng.

Kỹ thuật cơ bản là chuyển đổi số thành cơ sở 256 và chuyển đổi nó thành ký tự. Bạn có thể làm điều này bằng cách sử dụng mã ++NsCMjQ256N. Sau đó, bạn có thể sử dụng chuỗi kết quả kết hợp với C, chuỗi này hoàn toàn ngược lại (chuyển đổi ký tự thành int và diễn giải kết quả dưới dạng số cơ sở 256). Vì vậy, bạn nhận được 13 ký tự : C"2ìÙ½}ü¶d". Một số ký tự không thể in được.

Nhưng lưu ý rằng tôi đã nói 13 CHARS, không phải byte. Nếu tôi sao chép các ký tự và đếm số bằng https://otherseff.in/byte-count , nó sẽ ghi 13 ký tự và 18 byte. Điều này là do mã hóa ký tự của ký tự, là UTF-8 theo mặc định. Và UTF-8 chỉ cho phép 2 ^ 7 ký tự 1 byte khác nhau. Mỗi char cvới ord(c) > 127thực sự được lưu trữ bằng hai byte thay vì một.

Và đây là tính năng mới của @ isaacg . Anh ta đã thay đổi định dạng mã mặc định từ UTF-8 thành iso-8859-1. iso-8859 có thể biểu thị 256 ký tự chỉ với 1 byte. Vì vậy, bây giờ bạn thực sự có thể đạt 13 BYTES. Điều này chỉ có thể với trình biên dịch tiêu chuẩn , tuy nhiên, điều này không hoạt động trong trình biên dịch trực tuyến.

Trước tiên, bạn muốn chuyển đổi số thành giá trị hex bằng cách sử dụng tập lệnh này : jdm.[2.Hd"0"jQ256. Điều này mang lại cho bạn 12 32 ec d9 bd 07 7d fc b6 64. Sau đó sao chép các số đó vào tệp mã của bạn bằng trình soạn thảo hex (ví dụ hexedit cho linux).

trình diễn hexedit

Để ý:

  • Rõ ràng bạn loại bỏ phần "cuối, nếu chuỗi là phần cuối của mã.
  • Điều này chỉ hoạt động nếu không có 34(byte 22) trong biểu diễn cơ sở 256 của các số của bạn, vì đây là "char và sẽ kết thúc chuỗi. Thoát công trình mặc dù ( 5C 22).
  • Btw, khi bạn mở một tệp bằng trình soạn thảo hex, bạn có thể sẽ thấy byte 0Ahoặc 0d 0aở cuối, bạn có thể xóa. Điều này chỉ cho thấy sự kết thúc của dòng.

Tôi sẽ phải đặt trình thông dịch ngoại tuyến vào máy của mình, nhưng điều này thật tuyệt vời, cảm ơn! :)
Beta Decay

1
Chuỗi cũng không thể bao gồm byte null, có giá trị 00. Ngoài ra, \byte 5c, có thể hoặc không cần phải thoát với một `` khác, tùy thuộc vào byte sau nó.
isaacg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.