Giúp tôi trì hoãn sửa chữa máy tính của tôi!


23

Thử thách này được mang đến cho bạn bởi cảm hứng thực sự (và bi thảm). Gần đây, hàng số trên bàn phím của tôi hơi rời rạc. Các phím 1-9đôi khi hoạt động - nhưng lần khác chúng không có kết quả. Là một lập trình viên nhiệt thành, điều này thật kinh khủng! (Xem dấu chấm than đó? Đó là cách bạn biết họ đang làm việc ngay bây giờ.) Tôi không chỉ thường xuyên cần số, mà cả các ký hiệu!@#$%^&*(hoàn toàn không hiệu quả một nửa thời gian là tốt! Là một lập trình viên C, thay vì dành thời gian cho lịch trình bận rộn của mình về việc vẽ nguệch ngoạc bằng mã để sửa máy tính xách tay, tôi đã quan tâm nhiều hơn đến việc khắc phục sự cố. Trong vài tuần qua, dần dần, tất cả các chữ số trong mã của tôi đã được thay thế bằng hệ thập lục phân để tôi không phải đi săn tìm số để sao chép và dán. Tuy nhiên, một số số không dễ gõ nếu không có phím 1-9. Ví dụ: số 1không thể được viết đơn giản bằng hệ thập lục phân và tôi đã dùng đến việc thay thế 1s trong mã của mình bằng 0xF - 0xE. Các phím duy nhất mà bị ảnh hưởng là 1-9, vì vậy tôi duy trì sử dụng đầy đủ các biểu tượng như +, -, và /. Tuy nhiên, tôi không thể sử dụng phép nhân hoặc dấu ngoặc đơn, như*(thường bị hỏng. Điều này dẫn đến thách thức của bạn.

Đầu vào

Một số nguyên, ntương đương với stdin hoặc ngôn ngữ của bạn. Nếu bạn muốn, số nguyên có thể được đi trước hoặc theo sau bởi một dòng mới hoặc ký tự khoảng trắng khác. Ngoài ra, bạn có thể nhận đầu vào thông qua một đối số dòng lệnh.

Chương trình của bạn sẽ phản hồi chính xác với đầu vào tiêu cực và có thể xử lý ít nhất các số nguyên có chữ ký 32 bit.

Đầu ra

Chương trình của bạn sẽ xuất ra, ở một số dạng có thể quan sát được, cách ngắn nhất (trong các ký tự không phải khoảng trắng) có thể để viết số ndưới dạng tổng, hiệu hoặc chia một hoặc nhiều giá trị thập lục phân. Có nhiều hơn một cách để giải quyết vấn đề này, và không có yêu cầu nào là bạn ủng hộ bất kỳ đầu ra có độ dài bằng nhau hơn bất kỳ cách nào khác.

Đầu ra phải ở dạng A % A % A...Agiá trị thập lục phân theo sau 0xchỉ chứa các chữ số A-F a-f%là một trong các ký hiệu -+/. Hãy /mô tả phân chia số nguyên, không phải dấu phẩy động.

(Lưu ý rằng đầu ra của bạn sẽ dẫn đến nkhi đánh giá các phân chia trước, từ trái sang phải và sau đó cộng và trừ, từ trái sang phải, như quy ước.)

Các trường hợp thử nghiệm

Đầu ra đầu vào

  1. 1

    0xF - 0xE(hoặc 0xF-0xEhoặc 0xB-0xAhoặc 0xd - 0xchoặc 0xF/0xF)

  2. 15

    0xF

  3. 255

    0xFF

  4. 30

    0xF + 0xF

Ghi điểm và nội quy

Đây là mã golf. Điểm sơ bộ của bạn là số byte trong tệp nguồn của bạn.

Bạn KHÔNG được sử dụng bất kỳ chữ số nào 1-9trong nguồn của mình.

Bạn CÓ THỂ sử dụng các ký hiệu !@#$%^&*(trong nguồn của mình, nhưng mỗi ký tự có mức phạt +20 cho điểm của bạn.

Chương trình của bạn có thể được thay thế bằng một hàm lấy tham nsố miễn là hàm đó tạo ra một số dạng đầu ra có thể đọc được của con người. Giá trị trả về của hàm của bạn KHÔNG được tính là đầu ra.

Sơ hở tiêu chuẩn không được phép.

Điểm số thấp nhất chiến thắng! Chúc may mắn!

Tôi đã làm điều gì đó lên định dạng / đặt câu hỏi / rõ ràng-khôn ngoan? Cho tôi biết! Đây là lần đầu tiên tôi gửi đến trang web này!


Có giới hạn trên cho kích thước của số nguyên không? Ngoài ra, các số âm có được biểu thị cho một số độ chính xác tùy ý (tức là 32 bit) không?
FryAmTheEggman

@FryAmTheEggman Chỉnh sửa bài gốc để làm rõ. Đầu vào có thể âm và chương trình của bạn sẽ phản hồi chính xác với đầu vào ít nhất 32 bit. Cảm ơn!
BrainSteel


Đây có vẻ là một thông số khá chắc chắn với tôi, nhưng nếu bạn muốn có một số phản hồi, tôi khuyên bạn nên đăng nó trong hộp cát (cho những thách thức trong tương lai) để bạn có thể nhận phản hồi trước khi đăng lên chính và mọi người bắt đầu làm việc với nó .
Martin Ender

1
Số nguyên hay phép chia dấu phẩy động?
edc65

Câu trả lời:


5

JavaScript 287 (187 + 20 * 5) 295 (195 + 20 * 5) 338 (198 + 20 * 7)

Một hàm kiểm tra mọi kết hợp có thể có của 6 chữ số hex được phép (0xA đến 0xF) và 3 toán tử được phép. Đầu ra thông qua cửa sổ bật lên và không trả lại giá trị, theo yêu cầu.

Tôi đã sử dụng [] để nhóm biểu thức được phân tách bằng dấu phẩy nhưng không thể tránh 5 7 dấu ngoặc mở cho các vòng lặp và gọi hàm.
Để tránh các chữ số có các biến A, B, C cho 1,2,3 (điều này làm cho mã thậm chí còn tối nghĩa hơn)

Chỉnh sửa mã sửa đổi tập trung vào việc tránh '('. Đã xóa ifvà tạo RegExp rõ ràng

Coi chừng: chức năng này cực kỳ chậm, nó sẽ vượt quá giới hạn thời gian cho một tập lệnh trong FireFox, ngay cả đối với đầu vào nhỏ như 90.

Để liệt kê tất cả các biểu thức có thể, tôi sử dụng số bắt đầu từ 3 và đi lên mãi mãi. Mã hóa chữ số:
0,1,2 là các toán tử +, -, /
4 đến 9 là các chữ số hex A..F
3 không được phép
Mỗi số được kiểm tra bằng biểu thức chính quy /3|[0-2]{2}/để tránh chữ số 3 và có 2 toán tử liên tiếp ( kiểm tra cũng tránh truy tìm và khai thác hàng đầu - xem mã)

Chuỗi kết quả là một cái gì đó giống như 0xA + 0xA - 0xDjavascript hợp lệ, vì vậy tôi sử dụng eval để đánh giá nó. Unfortunatley toán tử '/' là dấu phẩy động và không phải là số nguyên trong JavaScript, vì vậy tôi không chắc chắn 100% rằng kết quả là sự kiện chính xác để tạo thành kết quả cuối cùng (nhưng tôi khá tự tin, vì không thể làm tròn một lỗi nhỏ được khuếch đại bởi một '*')

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

Thứ gì khác

Bây giờ, một cái gì đó buồn cười hơn. Tôi đã sử dụng một trình phân tích cú pháp biểu thức quá đơn giản để tránh cuộc gọi tệ hại và, thật thú vị, hóa ra là nhanh hơn rất nhiều.

Trình phân tích cú pháp thực sự được đơn giản hóa, trong một trình phân tích cú pháp thực V và O phải là các mảng chứa ngăn xếp giá trị đang chờ xử lý và ngăn xếp toán tử đang chờ xử lý. Ở đây V là giá trị chờ xử lý duy nhất (và cũng là giá trị trả về) và O là một chuỗi có tối đa 2 ký tự. P chứa bảng ưu tiên toán tử, cho '- + /' => '112'

Điểm này là 275 + 4 * 20 => 355

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

Kiểm tra trong bảng điều khiển Firefox / FireBug, thay đổi cảnh báo bằng return (có thể sử dụng nhiều hơn)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA - 0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + ​​0xF

Chỉ cần một chút ít rõ ràng (nhưng hãy kiên nhẫn)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + ​​0xF
51 0xDD - 0xAA
62 0xEA - 0xAC
73 0xA + 0xEA - 0xAB
84 0xFE - 0xAA
95 0xA + 0xFF - 0xAA


3

Python 2: 185 byte + 2 * 20 = 225

Cách quá dài cho một câu trả lời nghiêm túc. Nhưng vì chưa có câu trả lời nào, tôi sẽ đăng nó bằng mọi cách.

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

producttạo ra tất cả các sắp xếp khác nhau của ký tự cho phép. execcố gắng giải mã nó Điều này đáng buồn trả lại một ngoại lệ, từ đó try - catchkhối dài . Nó là kết quả tốt, nó in và tồn tại.

2 lần phạt, vì những lần niềng răng trong khi gọi hàm.


2
Câu trả lời này có thể có một vài vấn đề: (1) 0không phải là một chữ thập lục phân; (2) Bộ phận liên quan đến số âm trong Python cho kết quả khác so với C.
frageum
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.