Pure Sourcery - Các chương trình định hình xuất ra các chữ số từ 0 đến 9


21

Đây là phông chữ pixel 5 x 7 cho các chữ số từ 0 đến 9:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(Phông chữ này và trang này có thể sẽ trông tốt hơn nếu bạn chạy mã JavaScipt này trong bảng điều khiển trình duyệt của bạn hoặc trong thanh URL có tiền tố là javascript:: $('#question pre,.answer pre').css('line-height',1).)

Viết hai khối văn bản hình chữ nhật có kích thước bằng nhau, một để biểu thị các khoảng trắng ( .) trong phông chữ ở trên và một để biểu thị các khoảng trắng ( ).

Khi hai khối văn bản này được sắp xếp thành cùng một mẫu 5 × 7 với một trong các chữ số ở trên, thì khối văn bản lớn kết quả sẽ là một chương trình in chữ số đó thành thiết bị xuất chuẩn. Điều này sẽ làm việc cho tất cả 10 chữ số.

Ví dụ: nếu .khối văn bản của bạn là

---
'''

khối văn bản của bạn là

ABC
123

sau đó là chương trình

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

nên đầu ra 0. Tương tự, chương trình

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

nên xuất ra 1, và cứ thế lên chương trình cho 9.

Bạn có thể sử dụng đoạn mã ngăn xếp này để tạo các chương trình hình chữ số:

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

Chi tiết

  • Không ai trong số 10 chương trình khối văn bản lớn nên yêu cầu đầu vào. Chỉ xuất ra một chữ số cộng với một dòng mới tùy chọn. Đầu ra cho thiết bị xuất chuẩn hoặc một sự thay thế tương tự.
  • Không ai trong số các chương trình có thể đọc hoặc truy cập mã nguồn của riêng họ. Hãy đối xử với này giống như một nghiêm ngặt Quine thách thức.
  • Các khối văn bản có thể không giống hệt nhau và phải có kích thước khác không.
  • Các khối văn bản có thể chứa bất kỳ ký tự nào ngoại trừ dấu kết thúc dòng .
  • 10 chương trình phải là các chương trình chính thức được viết bằng cùng một ngôn ngữ, chúng không phải là các đoạn REPL . Bạn có thể tùy ý thêm một dòng mới vào tất cả chúng hoặc không ai trong số chúng.

Chấm điểm

Điểm của bạn là diện tích (chiều rộng lần chiều cao) của một trong các khối văn bản của bạn. (Chúng có cùng kích thước nên không có điểm nào trong việc đếm cả hai khối.) Diện tích của ví dụ là 3 trên 2, cho điểm 6.

Điểm thấp nhất sẽ thắng. Trong trường hợp quan hệ, câu trả lời được bình chọn cao nhất sẽ thắng.


Về mã của bạn, bạn có thể cải thiện nó rất nhiều. var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");có thể được viết là var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");, giống nhau nhưng ngắn hơn. Có một vài điều nữa bạn có thể cải thiện trong đó, nhưng nó trông thật tuyệt!
Ismael Miguel

4
@IsmaelMiguel TBH Tôi đặt nó thông qua một công cụ khai thác JS để có được nó trên một dòng. Nó không bao giờ có nghĩa là để chơi golf.
Sở thích của Calvin

Oh, anh bạn ... Đó là một chút lười biếng ... Trong một câu hỏi về golf, bạn đăng một mã không chơi gôn ... Nhưng này, tôi hiểu rồi và tôi chỉ nói điều này. Bạn không cần phải làm theo những gì tôi nói. Nhưng đó là một điều tốt để làm.
Ismael Miguel

6
@IsmaelMiguel Tôi đã đăng mã tiện ích không được mã hóa, có thể đọc được càng dễ đọc càng tốt để các lỗi dễ phát hiện hơn. Nhưng thực sự, miễn là nó hoạt động, kích thước mã của đoạn mã ngăn xếp hoàn toàn không ảnh hưởng đến kết quả của thử thách.
Sở thích của Calvin

3
text blocks may not be identicalcó thật không? Tôi muốn thấy ai đó phá vỡ quy tắc này, bằng cách đưa ra hai loại tiền mã hóa giống hệt nhau, trả lại một cách kỳ diệu các chữ số khác nhau, khi mọi số đều chính xác cùng một mã ^^
Falco

Câu trả lời:


13

CJam, 20 18 14 13 12 * 1 = 12

Dùng thử trực tuyến: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

Khối trống

];BG*K+ :BD%

Khôi răn

];B9+33%:B4/

Giải trình

Tôi đã sử dụng một chiến lược tương tự với giải pháp của Sp3000 , sao cho mỗi khối thực hiện phép nhân, phép cộng và (có thể) một thao tác modulo trên một biến và lưu lại giá trị. Để tìm một giải pháp tối ưu, tôi đã sử dụng lực lượng vũ phu cũ. Tôi đã viết một chương trình tìm kiếm không gian của tất cả các giá trị ban đầu có thể (giá trị ban đầu của các biến CJam) và nhiều triệu cặp hàm chuyển đổi có thể sao cho đầu ra cho mỗi dạng chữ số là duy nhất. Sau đó, tôi đã lọc các kết quả cho các kết quả sao cho kết quả cuối cùng cho các dạng chữ số kết thúc trong một khối trống, trong đó có 8, có thể được ánh xạ trở lại kết quả chính xác thông qua một công thức nhân, thêm và modulo khác.

Sau một vài ngày tìm kiếm CPU, kết quả tốt nhất cho đến nay đã giảm xuống còn 12! Giải pháp này bắt đầu với một giá trị 11, hàm biến đổi khối rỗng là x * 16 + 20, hàm kết quả khối rỗng là x % 13, hàm biến đổi khối rắn là (x + 9) % 33và hàm kết quả khối rắn là x / 4.


23

> <> (Cá) , 5 * 10 = 50

Khối trống

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

Khôi răn

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

Mã này không chứa logic hoặc số học chỉ sử dụng các chuyển hướng tĩnh của con trỏ lệnh (IP)> <> của 'với' gương '( /\) và hai' mũi tên '( <v). Bộ điều khiển lưu lượng duy nhất khác là 'trampoline' ( !) nhảy qua ký tự tiếp theo.

IP bắt đầu từ góc trên cùng bên trái hướng về phía Đông. Sau một số lần chuyển hướng, nó đạt đến một số, nó được đẩy lên ngăn xếp và in ra nvà chương trình kết thúc ;.

Luồng chương trình

Một khối 'nhận ra' trạng thái hiện tại của chương trình từ thực tế là điểm IP đi vào và dựa trên trạng thái mà nó quyết định nên đưa ra con trỏ (khối nào sẽ được thực hiện tiếp theo) và ở vị trí chính xác nào con trỏ sẽ rời (sẽ là trạng thái mới). Tất nhiên các khối không thực hiện bất kỳ logic nào, tất cả các hành vi này đều xuất phát từ các chuyển hướng.


Tôi đã hy vọng cho một câu trả lời như thế này. Ma thuật thuần túy.
EagleV_Attnam

11

CJam, 23 22 19 * 1 = 19

Khối trống:

];G)B%:G"73860594"=

Khôi răn:

];GW*B+3*D%:G    7-

Hãy thử trực tuyến .

Tôi đang cố gắng để gặp may mắn với sự trùng hợp toán học và thất bại, vì vậy đây là một cách tiếp cận hơi khác với ánh xạ duy nhất từ ​​giải pháp của Martin.

Bắt đầu với 16. Khối rỗng thêm 1 và lấy modulo 11. Khối rắn nhân với -1, thêm 11, nhân 3 rồi lấy modulo 13. Điều này ánh xạ kỳ diệu 03456789(các chữ số kết thúc trên một khối trống) 41753026, chúng tôi sử dụng lập chỉ mục để có được đúng. 12bản đồ gọn gàng 89, mà chúng ta có thể khắc phục bằng cách trừ 7.


7

CJam, 28 27 x 1 = 27

Đây là một sự khởi đầu.

Khối trống

U):U;                       

Khôi răn

];U):UW+:WF%"1302986_7_54"=

Kiểm tra nó ở đây. Tôi không thể cung cấp cho bạn một permalink với mã, bởi vì mã quá dài, vì vậy bạn sẽ phải sao chép nó theo cách thủ công từ đoạn trích trong thử thách.

Ý tưởng là băm hình dạng như sau:

  • Đối với mỗi "pixel" tăng một bộ đếm U .
  • Đối với mỗi "pixel" màu đen, hãy thêm Uvào tổng số đang chạy W(bắt đầu từ -1). Cuối cùng, chúng tôi sử dụng modulo này 15, điều này sẽ cho kết quả duy nhất, sử dụng để lập chỉ mục thành chuỗi tra cứu.
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.