Lỗi 404: Không tìm thấy ký tự


74

Kịch bản

Một trong những người bạn của bạn đang vật lộn với bài tập về nhà. Anh ta cần một chương trình đơn giản in số 404 tự nhiên đầu tiên:

1 2 3 4 5 6 7 8 9 10 11 ... 401 402 403 404

Thử thách của bạn rất đơn giản: viết chương trình này cho anh ấy.

Tuy nhiên, kết nối của bạn rất tệ, do đó, 1 ký tự ngẫu nhiên bị mất mỗi khi bạn gửi chương trình. Để ngăn điều này phá vỡ chương trình của bạn, bạn phải làm cho nó để loại bỏ bất kỳ ký tự đơn lẻ nào sẽ không có hiệu lực: chương trình hoạt động, bất kể. (Chương trình gốc cũng phải hoạt động.)

Vì kết nối quá kém để gửi các tệp lớn, mã của bạn phải càng ngắn càng tốt.

TL: DR - tạo chương trình làm cứng bức xạ để xuất các số từ 1 đến 404


Quy tắc / Chi tiết

  • Đầu ra có thể là một danh sách các số nguyên ở bất kỳ định dạng hợp lý nào (được phân tách bằng dấu cách, dòng mới, dấu phẩy, v.v.). Tuy nhiên, đầu ra của bạn phải nhất quán và không thay đổi khi chương trình được sửa đổi.
  • Cờ dòng lệnh có chứa logic, thực thi mã thực tế, tạo danh sách số, v.v., đều bị cấm.
  • Đây là , vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng!


16
Chương trình gốc (không có bất kỳ ký tự nào bị xóa) cũng cần phải hoạt động?
Ad Nam

5
Có thể bỏ qua lỗi nếu chương trình vẫn in 1 - 404?
jrich

4
Có lẽ nên có một thẻ như bức xạ cứng ?
Vi.

5
Bỏ phiếu để đóng, chúng tôi không làm bài tập về nhà cho bạn XD
チ ー ズ パ

Câu trả lời:


16

05AB1E , 12 byte

Mã số:

XX440044ÔÔŸŸ

Giải thích mã bình thường:

X             # Pushes the number 1.
 X            # Pushes the number 1 again.
  440044      # Pushes the number 440044.
        Ô     # Connected uniquify.
         Ô    # Connected uniquify.
          Ÿ   # Inclusive range of the top two elements.
           Ÿ  # Inclusive range on the array, which leaves it intact.

Điều này dẫn đến mã golf sau đây : X404Ÿ, đó là những gì chúng tôi muốn đạt được.

Số 404 được tạo bởi bất kỳ biến thể nào sau đây:

440044ÔÔ
40044ÔÔ
44044ÔÔ
44004ÔÔ
440044Ô

Phạm vi bao gồm hoạt động như sau trên hai số:

`1 5Ÿ`             ->    [1, 2, 3, 4, 5]
[1, 5]Ÿ            ->    [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]Ÿ   ->    [1, 2, 3, 4, 5]

Mà luôn luôn làm cho thứ hai Ÿmột không-op .

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


34

JavaScript, 228 byte

etInterval=stInterval=seInterval=setnterval=setIterval=setInerval=setIntrval=setInteval=setInteral=setIntervl=setInterva=top=>4

setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`
setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`

Giải trình

Đánh giá mã trong một setIntervalcho phép chương trình tiếp tục ngay cả khi có lỗi. Chúng tôi đảm bảo rằng mã được chuyển sẽ lỗi nếu có bất kỳ ký tự đơn nào bị xóa. Cú pháp chuỗi mẫu có thể bị lạm dụng để gọi setIntervalvới một chuỗi không đổi mà không có dấu ngoặc đơn. May mắn thay, ngay cả khi chuỗi mẫu nằm trên dòng tiếp theo, nó vẫn phân tích cú pháp như một lệnh gọi hàm với cú pháp như vậy.

Vấn đề đầu tiên chúng ta gặp phải setIntervallà một chức năng, và do đó, nếu một ký tự bị xóa và chương trình cố gắng gọi setIntevalthay thế, nó sẽ báo lỗi. Tất nhiên, vì có hai yêu cầu thụt lề setInterval, chúng ta không phải lo lắng về việc nó thực sự hoạt động chính xác miễn là chúng ta tránh được lỗi. Vì vậy, dòng đầu tiên xác định mọi "lỗi chính tả" có thể có của setTimeoutmột hàm hợp lệ.

Dòng đầu tiên hoạt động bằng cách gán tất cả các "lỗi chính tả" này cho hàm top=>4. Lưu ý cú pháp ES6, điều này chỉ đơn giản là lấy một tham số có tên "top" và trả về 4. Tại sao "top"? Chà, dòng đầu tiên không bao giờ được đưa ra lỗi ngay cả khi một ký tự bị xóa. Nếu một =được loại bỏ để thực hiện top>4, biểu thức boolean này sẽ hợp lệ vì topđược xác định trước trong các trình duyệt, chỉ đơn giản là mang lại false. Nếu 4 bị loại bỏ, thân chức năng đơn giản trở thành setIntervalphân đoạn đầu tiên và phần thứ hai chạy không hề hấn gì.

Bây giờ, tất cả những gì còn lại phải lo lắng là nếu một `bị xóa.

Nếu loại bỏ từ đầu, setIntervalchỉ đơn giản là không làm gì, đánh giá chính nó như là biểu thức của chính nó. Sau đó, phần còn lại của dòng thứ hai chỉ cần chạy một vòng lặp duy nhất của vòng lặp, để cho đoạn khác setIntervalhoàn thành công việc. Nếu loại bỏ từ cuối, backtick còn lại được chọn từ cuối bình luận.

Các dòng mới được đặt sao cho việc xóa một sẽ không ảnh hưởng đến hành vi của chương trình, nhưng chúng ngăn ngừa các lỗi trong trường hợp xóa một số ký tự, chẳng hạn như backtick hàng đầu.


3
Tôi đã suy nghĩ về những gì sẽ phá vỡ nếu một trong các chữ số trong một 405bị xóa, nhưng sau đó tôi nhận ra: không có gì, bởi vì tất cả các số 404 đã được in, hoặc vòng lặp thứ hai sẽ in những chữ số còn thiếu. Công việc ngoạn mục.
Sản phẩm ETH

Điều gì xảy ra nếu một phần của "top" bị mất?
Scimonster

@Scimonster Nó vẫn phân tích cú pháp như một hàm, trả về 4, chỉ với tham số không được sử dụng có tên "to" hoặc "op" hoặc "tp"
jrich

1
@jrich tất nhiên rồi. Chuột rút não. : P
Scimonster

Điều gì xảy ra nếu bạn mất một phần this?
dkudriavtsev

25

Pyth - 16 byte

Ý tưởng cơ bản đằng sau điều này là khi bạn lấy đi một chữ số 404, nó chỉ làm cho số nhỏ hơn, vì vậy chúng ta chỉ cần lấy tối đa hai 404chữ số để đảm bảo chúng ta có đúng số. Rõ ràng, có một loạt các dư thừa.

SSsetSS[404  404

Giải trình:

SS                       First one does 1-index range, second one sorts, which is no-op 
 s                       If the e is there, this is no-op, if only t is there, it sums a one element list, which is the item
  et                     e picks last element in list, and if e is gone, then t gets you the list without the first element which is good enough when combined with s
   SS                    Sorting twice is no-op
    [                    Start list, this can't be two element because if we get rid of initial 4, the 0 becomes third element which neeeds to be captured
     404                 One of the 404's
     <space><space>404   Need two spaces for redundancy, because 404404 *is* bigger than 404

Hãy thử trực tuyến tại đây .


23

Befunge-98 , 37 byte

20020xx##;;11++::''ee44**``kk@@::..;;

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

Giải trình

Tạo mã được làm cứng bằng bức xạ trong Befunge-98 không quá tệ, bởi vì bạn có thể đặt "delta" (tức là kích thước bước của con trỏ lệnh) theo cách thủ công x. Vì vậy, nếu đặt delta thành (2,0), từ đó trở đi, mọi ký tự khác sẽ bị bỏ qua và chúng ta có thể chỉ cần nhân đôi tất cả các lệnh. Điều khó khăn là 2 0lên đỉnh ngăn xếp một cách đáng tin cậy. Chúng tôi thực sự cần 0 2 0phần còn lại để chương trình hoạt động chính xác, nhưng chúng tôi sẽ miễn phí. Đây là cách chúng tôi làm điều này:

20020xx

Lưu ý rằng mỗi chữ số tự đẩy, vì vậy trong chương trình đầy đủ, sẽ có một khởi đầu 2 0mà chúng ta chỉ cần bỏ qua.

Do đó, việc bỏ ký tự thứ nhất hoặc thứ hai khỏi chương trình là không liên quan vì dù sao chúng ta sẽ không sử dụng các chữ số đó. Tương tự như vậy, loại bỏ ký tự thứ ba giống hệt với xóa ký tự thứ hai, vì vậy chúng ta cũng không cần phải lo lắng về điều đó.

Hãy xem xét những gì xảy ra trong hai trường hợp khác. Bỏ nhân vật thứ tư:

2000xx

Lưu ý delta được đặt thành (0,0). Nhưng điều này hoàn toàn không di chuyển con trỏ lệnh, do đó, điều tương tự xđược thực hiện lại ngay lập tức và lần này bật (2,0)và tất cả đều ổn (có các số 0 ẩn ở dưới cùng của ngăn xếp cho các mục đích sau này của chúng tôi).

Thay vào đó, hãy bỏ ký tự thứ năm:

2002xx

Bây giờ delta được đặt thành (0,2). Tuy nhiên, vẫn không có chuyển động ngang, do đó, IP kết thúc ngay lập tức trở xlại, delta chính xác được đặt.

Từ thời điểm này trở đi, về cơ bản chúng ta có thể bỏ qua việc sao chép ký tự cũng như phần ban đầu này bởi vì nó sẽ luôn bị bỏ qua:

...#;1+:'e4*`k@:.;

Đây ;là một loại lệnh bình luận bỏ qua mọi thứ cho đến khi ;gặp phải tiếp theo . Tuy nhiên, chúng tôi nhảy qua đầu tiên ;với #vì vậy chỉ phần giữa ;sẽ được thực hiện từ thời điểm đó trở đi.

1+    Increment the top of the stack.
:     Duplicate it.
'e    Push 101.
4*    Multiply by 4 to get 404.
`     Greater-than check. Pushes 1 once the top
      reaches 405, otherwise 0.
k@    Terminate the program that many times.
:.    Print a copy of the top of the stack (and a space).

16

> <> , 103 60 51 byte

               vv
;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Đã thử nghiệm ở đây.

Sử dụng chiến thuật tương tự như chương trình này . Nếu một ký tự bị xóa trong dòng đầu tiên, dòng thứ 2 sẽ vẫn được chạy. Nếu một ký tự trong dòng thứ 2 bị xóa, thì vsẽ di chuyển thực thi sang dòng thứ 3, vì dòng thứ 2 ngắn hơn một ký tự. Việc xóa trong dòng thứ 3 không có tác dụng đối với việc điều khiển chương trình, vì nó chỉ được thực hiện sau khi xóa trong dòng 2.

Chương trình cũng sẽ hoạt động trong trường hợp ngắt dòng bị xóa:

Trường hợp 1:

Dòng thứ 2 sẽ được chạy.

               vv;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Trường hợp 2:

Cả hai dòng trở thành một dòng với hai lần hướng dẫn.

               vv
;?=*4o" e"n:ll<<;?=*4o" e"n:ll<<

Giải trình:

Cốt lõi của chương trình là như sau. Lưu ý rằng a 1được đẩy trên ngăn xếp đã có dòng đầu tiên.

ll:n        Push length of the stack twice, duplicate, print as number
"e "o       Push 101, 32, output 32 as space
4*          101 * 4 is 404
=?;         Pop twice, if equal, halt
            (Execution wraps around)

Bạn có thể sử dụng o" e"?
Martin Ender

Và thay vì +1bạn có thể sử dụng l. Ngoài ra, trình thông dịch fishl Language.com hơi lạ (và gây khó chịu khi sử dụng, mặc dù tính năng gỡ lỗi là hữu ích). TIO sử dụng trình thông dịch Python có phần gọn gàng hơn
Martin Ender

@MartinEnder Điều đó không hoạt động nếu bạn xóa một trong các dòng 1trên dòng đầu tiên.
mbomb007

À đúng rồi, dù sao thì chúng cũng làm phiền tôi: tio.run/nexus/fish#@q@ACsrKuKztAbPVMslXUkhVysnLybGxwRD4/x8A
Martin Ender

12

> <> , 42 38 34 byte

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

Cảm ơn @Martin Ender@Teal Pelican đã cạo sạch 8 byte!

<<;?=*4o" e"lnll/
 ;?=*4o" e"lnll<

Tương tự như câu trả lời của mbomb007 , nhưng chỉ sử dụng 2 dòng.

Thay vì đếm từ 1 đến 404 bằng một giá trị bộ nhớ, tôi liên tục đẩy chiều dài của ngăn xếp. Điều này khiến tôi không cần phải đặt bất cứ thứ gì lên ngăn xếp trước khi vòng lặp bắt đầu, làm cho mọi thứ dễ dàng hơn nhiều.

Mã ban đầu

Các <IP xoay IP và /không hoạt động, vì IP quấn quanh và tiếp tục đi theo con đường bình thường. Do đó, mã có liên quan là:

          lnll   Prints the size of the stack + 1 and pushes the stack size twice
     o" e"       Prints a space and pushes 101
   *4            Multiplies to get 404
;?=              If the number we just printed was 404, end the program

Và điều này lặp lại.

Việc xóa

Chìa khóa lớn ở đây là gương /. Nó không làm gì cả nếu dòng thứ hai được sửa đổi - chỉ quay trở lại chính nó và về cơ bản là không hoạt động. Nhưng nếu một ký tự từ dòng đầu tiên bị loại bỏ, dòng này sẽ dịch chuyển xuống, để gương chạm vào mũi tên <, dẫn đến một vòng lặp giống hệt nhau, không thay đổi.

Việc xóa đáng kể duy nhất khác sẽ là \nnhân vật. Điều này cũng được tính, vì nó tạo ra mã này:

<<;?=*4o" e"lnll/ ;?)*4o" e"lnll<

Bây giờ, chúng tôi vừa thêm một bản sao của vòng lặp ban đầu ;?=*4o" e"lnllvào chính nó. Vì đây là một vòng lặp, nó không tạo ra sự khác biệt nào cho việc thực thi và chạy như thể không có gì thay đổi.


1
Cách thực sự tốt đẹp để giảm nó xuống 2 dòng. Vấn đề duy nhất tôi có thể thấy là nó không phải là 38 byte mà là 42? Giảm mã bên trong sang; ;? = * 4o "e": n: + 1l sẽ giảm xuống còn 38 byte. Điều này chỉ đặt 84 * của bạn trong chuỗi "e" thay vì tách rời.
Teal pelican

1
Bạn cũng có thể thay thế :+1cái khác :bằng cái kia l.
Martin Ender

Vâng, cảm ơn cả hai!
MildlyMilquetoast

;?=*4o" e"n:lllàm việc quá
mbomb007

11

Cây lê , 34 byte

Chương trình chứa các ký tự điều khiển, vì vậy đây là một xxdbãi chứa:

00000000: 7072 696e 7420 312e 2e34 3034 2327 108a  print 1..404#'..
00000010: af70 7269 6e74 2031 2e2e 3430 3423 2710  .print 1..404#'.
00000020: 8aaf                                     ..

Cây lê về cơ bản là một dẫn xuất Perl, với một số tính năng "thú vị". Tôi đã ném nó với nhau như một trò đùa (để tôi có thể nói rằng polyglot của tôi được in a partridgetrong Cây lê; thực tế, hầu như tất cả các chương trình đều làm như vậy). Tuy nhiên, đó là Turing - hoàn thành và thực sự khá tốt với loại thử thách này.

Tính năng mà chúng tôi quan tâm nhất ở đây là A Pear Tree sẽ chỉ chạy một chương trình nếu một chuỗi con của mã có CRC-32 00000000. Mã được xoay để đặt chuỗi con vào câu hỏi khi bắt đầu. Khi điều đó xảy ra, hai nửa mã giống hệt nhau có CRC-32 trong câu hỏi (do nhận xét nhị phân trông đáng ngờ ở cuối), vì vậy nếu bạn xóa một ký tự khỏi nguồn (phá CRC), nửa còn lại được quay về điểm bắt đầu và #dấu hiệu gần cuối sẽ nhận xét một nửa bị hư hỏng, ngoài rác nhị phân.

Một tính năng khác làm cho chương trình nhỏ hơn một chút: mặc dù A Pear Tree chủ yếu được hiểu là Perl, nhưng nó có một số thay đổi nhỏ để làm cho nó hoạt động giống như Python hơn. Một điều có liên quan ở đây là không giống như printtuyên bố của Perl (chỉ chạy các số với nhau), printtuyên bố của A Pear Tree tách biệt các đối số với khoảng trắng và in một dòng mới cuối cùng. Điều đó mang lại cho chúng ta đầu ra được phân tách bằng không gian độc đáo, có nghĩa là chúng ta không phải lãng phí byte khi định dạng. (Lưu ý rằng bạn sẽ phải cung cấp cho chương trình không có đầu vào; nếu ngôn ngữ nhận được đầu vào, theo mặc định, nó sẽ giả định rằng nó phải làm gì đó với nó.)

Tất nhiên, điều này không thể cạnh tranh với các ngôn ngữ chơi gôn thực tế (tôi cũng không mong đợi nó), nhưng tôi nghĩ mọi người có thể thấy nó thú vị.


9

Befunge 98 , 34 byte

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

<<.:@k`*4e':+1[

2.:@k`*4e':+1<^^j

Điều này hoạt động rất giống với câu trả lời> <> của tôi , nhưng thay vì gương /, tôi sử dụng thao tác rẽ trái [và sau đó đảo ngược hướng IP, có chức năng tương đương với gương trong trường hợp này.

Mã ban đầu

<<                 Reverses code direction, sending IP to right
               [   Turns the IP left, into the ^, which reverses it.
                   It then hits this again, turning left to go West. (No-op)
            :+1    Adds 1 to the sum
        *4e'       Pushes 404
     @k`           Ends the program if (sum > 404)
   .:              Prints the sum

Việc xóa

Nếu một cái gì đó trong dòng thứ hai bị xóa, nó sẽ thay đổi và không ảnh hưởng đến đầu trang.

Nếu bất cứ điều gì trong dòng đầu tiên bị xóa, [sẽ gửi IP vào <, bắt đầu một vòng lặp giống hệt nhau (ngoại trừ 2j^^việc tránh các ^s được sử dụng song song với [)

Vì có 2 dòng mới, nên sẽ không có sự khác biệt nào đối với mã nếu một dòng bị xóa (nhờ @ masterX244 cho việc này!)


Điều gì xảy ra với các dòng trống trong mã?. Có lẽ bạn cũng có thể tăng gấp đôi linefeed để làm cho nó miễn dịch
masterX244

Bạn hoàn toàn chính xác @ masterX244 cảm ơn! Không nghĩ về điều đó.
MildlyMilquetoast

lol, không bao giờ sử dụng ngôn ngữ này, nhưng vì lý do nào đó, giác quan thứ 6 đã cho tôi ý tưởng đó ...
masterX244

5

Befunge-93, 54 51 byte

Cảm ơn Mistah Figgins đã tiết kiệm cho tôi 3 byte.

111111111111111vv
+1_@#-*4"e":.:<<
+1_@#-*4"e":.:<<

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

Đây thực chất là một mẹo tương tự như đã được sử dụng trong thử thách Hello World Fault-Tolerant . Dòng đầu tiên bắt đầu bằng cách đảm bảo có 1 trên đầu ngăn xếp để bắt đầu chuỗi và sau đó một trong các vmũi tên ở cuối dòng chuyển hướng đường dẫn mã đến đầu của thường trình chính trên dòng 2 , thực hiện từ phải sang trái.

Xóa một ký tự khỏi dòng đầu tiên sẽ chỉ dịch chuyển các vmũi tên qua một, nhưng điều đó vẫn cho phép mã chuyển hướng thành dòng thứ hai thành công. Việc xóa một ký tự khỏi dòng thứ hai làm cho <mũi tên ở cuối dòng dịch chuyển ra khỏi đường dẫn vở trên, do đó, đường dẫn mã sẽ được chuyển hướng đến thói quen sao lưu trên dòng 3.

Loại bỏ ngắt dòng đầu tiên không có hại, bởi vì điều đó chỉ di chuyển dòng thứ ba vào vị trí để thay thế dòng thứ hai. Và loại bỏ bất cứ thứ gì sau khi kết thúc dòng thứ hai sẽ không có hiệu lực, vì đó chỉ là mã dự phòng.


The first line starts by making sure there is a 1 on the top of the stack...Dòng đầu tiên là khá chắc chắn về chính nó trong khía cạnh đó. Ngoài ra, bạn có thể rút ngắn <code> _ @ #! </code> to _ @ # - `và đặt nó trước khi in để tiết kiệm 3 byte.
MildlyMilquetoast

5

JavaScript + HTML + Đoạn trích, 167 158 154 byte

Lạm dụng thực tế là JavaScript trong Stack Snippets được đặt trong một trang web bên trong một <script>phần tử.

or(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)</script></script><script>for(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)


@ Flp.Tkc Đã sửa.
user2428118

4

Trên thực tế , 18 byte

:404::404kMkMMRRSS

Trên thực tế là một ngôn ngữ golf dựa trên ngăn xếp.

Giải thích về các lệnh liên quan (khi chúng hoạt động trong bối cảnh trên):

Numbers are indicated by round brackets () and lists by square brackets []

:         - pushes the longest string of characters in '0123456789+-.ij' as a numeric
k         - pop all the elements on the stack into a list [l] and push [l]
M         - pop [l], push max([l])
            pop (a), push (a)
R         - pop [l], push reverse([l])
            pop (a), push range([1,a])
S         - pop [a], push sorted([a])
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.