Lập trình một thế giới nguyên sơ


87

Chúng ta hãy định nghĩa một chương trình nguyên sơ là một chương trình không có bất kỳ lỗi nào nhưng sẽ lỗi nếu bạn sửa đổi nó bằng cách xóa bất kỳ chuỗi con liền kề nào của N ký tự, trong đó 1 <= N < program length.

Ví dụ, chương trình ba ký tự Python 2

`8`

là một chương trình nguyên sơ ( cảm ơn, Sp ) bởi vì tất cả các chương trình do loại bỏ các chuỗi con có độ dài 1 gây ra lỗi (thực tế là lỗi cú pháp, nhưng bất kỳ loại lỗi nào cũng sẽ xảy ra):

8`
``
`8

và tất cả các chương trình dẫn đến việc loại bỏ các chuỗi con có độ dài 2 gây ra lỗi:

`
`

Ví dụ, `8nếu là một chương trình `8`không có lỗi thì sẽ không còn nguyên sơ vì tất cả các kết quả loại bỏ chuỗi con phải bị lỗi.

Nhiệm vụ của bạn trong thử thách này là viết chương trình nguyên sơ ngắn nhất có thể, không mất đầu vào mà xuất ra bất kỳ một trong năm từ sau:

world
earth
globe
planet
sphere

Những từ bạn chọn là hoàn toàn tùy thuộc vào bạn. Từ duy nhất cộng với một dòng mới theo dõi tùy chọn nên được in ra thiết bị xuất chuẩn (hoặc thay thế gần nhất với ngôn ngữ của bạn). Chương trình ngắn nhất tính bằng byte thắng.

Ghi chú:

  • Một chương trình độc lập là bắt buộc, không phải là một chức năng.
  • Các từ là trường hợp nhạy cảm; đầu ra Worldhoặc EARTHkhông được phép.
  • Trình biên dịch cảnh báo không được tính là lỗi.
  • Các chương trình con lỗi có thể nhận đầu vào hoặc đưa ra đầu ra hoặc làm bất cứ điều gì khác miễn là cuối cùng chúng luôn bị lỗi.

Đây là một đoạn mã ngăn xếp sẽ liệt kê những chương trình nào cần lỗi khi đưa ra một chương trình nguyên sơ:

<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>


1
@geokavel Vâng. Nắm bắt ngoại lệ có nghĩa là nó không còn là một lỗi.
Sở thích của Calvin

33
Hai lần nhiều câu trả lời bị xóa như không xóa. Đó là một thành tích!
DLosc

1
Một chương trình có thể đọc mã nguồn của riêng mình?
Shelvacu

2
Nơi để xem các câu trả lời "gần nhưng không có xì gà" và ý kiến ​​của họ?
Vi.

1
@Vi. Nhận 2.000 đại diện để bạn có thể xem các bài viết đã bị xóa .
ThisSuitIsBlackNot

Câu trả lời:


46

Đường sắt , 24 byte

$'main'    #
 -[world]o/

Tôi nghĩ rằng điều này làm việc. Và nó vừa ngắn vừa dễ đọc (theo như Rail đi).

  • Nếu chuỗi con bị loại bỏ bao gồm bất kỳ phần nào của $'main'chúng tôi nhận được Internal Error: Crash: No 'main' function found.
  • Nếu chuỗi con bị loại bỏ bao gồm #, không có cách nào để chương trình thoát sạch, vì vậy nó sẽ luôn kết thúc với Crash: No valid move. Tôi tin rằng không thể xóa một chuỗi con sao cho bản nhạc tạo thành một vòng lặp hợp lệ (vô hạn).
  • Nếu chuỗi con bị loại bỏ ở phía trước #, nó sẽ bị ngắt kết nối từ cuối đường ray, do đó tàu sẽ gặp sự cố (với cùng một lỗi như trên).
  • Nếu chuỗi con bị loại bỏ sau chuỗi #, nó cũng sẽ ngắt kết nối #từ cuối bản nhạc (và có khả năng ngay cả phần đầu của bản nhạc khỏi điểm vào $). Vì vậy, một lần nữa lỗi tương tự.

Đối với chương trình thực tế: mọi chương trình Đường sắt cần phải có $'main'(hoặc một biến thể dài hơn, nhưng chúng tôi đang chơi gôn ở đây) như một điểm vào chức năng và tàu bắt đầu đi về hướng $Đông Nam. Mọi thứ trên dòng đầu tiên có thể là một phần của bản nhạc, vì vậy, loại bỏ 'main'bản nhạc là:

$          #
 -[world]o/

Các -/chỉ đơn giản là miếng sắt mà chúng ta cần để cho con tàu mất những 45 ° lượt.

[world]đẩy chuỗi worldoin nó. #đánh dấu sự kết thúc của đường đua - cách duy nhất để chấm dứt an toàn chương trình Đường sắt.

Thật thú vị, giải pháp này chỉ khả thi vì Rail cho phép các tuyến đường đi qua mainđường - nếu điều đó không thể xảy ra #thì sau dòng mới đầu tiên và mã luôn có thể được rút ngắn thành

$'main'
 #

đó là một chương trình hợp lệ mà không làm gì cả. (Các ký tự không phải khoảng trắng giữa '#sẽ không ảnh hưởng đến điều đó.)

Cũng khá thú vị: nếu tôi vừa chơi golf , nhiệm vụ in ấn worldsẽ không ngắn hơn hoặc đơn giản hơn nhiều:

$'main'
 -[world]o#

4
Điều gì xảy ra nếu tôi loại bỏ bất kỳ char nào giữa [và]?
Martin Lütke

@ MartinLütke nó sẽ ngắt kết nối /từ #.
Martin Ender

2
@ MartinLütke Bạn không chỉ có thể xóa dấu ngoặc vì chúng không liền kề nhau.
Sở thích của Calvin

Điều gì nếu loại bỏ dòng mới giữa hai dòng?
Vi.

1
@Vi. Điều đó làm mất kết nối $từ đầu đường ray, vì vậy tàu gặp sự cố ngay lập tức (Rail hy vọng đường ray sẽ tiếp tục theo hướng Đông Nam của $).
Martin Ender

43

Funciton ( 186 136 byte trong UTF-16)

╔══════════════╗
║19342823075080╟
║88037380718711║
╚══════════════╝

Chương trình này in ra thế giới.

Hầu hết các chuỗi con bạn loại bỏ khỏi điều này sẽ ngăn nó trở thành một hộp hoàn chỉnh, mà trình phân tích cú pháp sẽ phàn nàn. Các loại bỏ duy nhất có thể để lại một hộp hoàn chỉnh là:

 ╔══════════════╗
|║19342823075080╟  (remove this whole line)
|║88037380718711║
 ╚══════════════╝
 ╔══════════════╗
 ║|19342823075080╟   ← substring starts at | here
 ║|88037380718711║   ← substring ends at | here
 ╚══════════════╝
... ↕ or anything in between these that removes a whole line’s worth ↕ ...
 ╔══════════════╗
 ║19342823075080|╟   ← substring starts at | here
 ║88037380718711|║   ← substring ends at | here
 ╚══════════════╝
 ╔══════════════╗
|║19342823075080╟
 ║88037380718711║  (both lines entirely)
|╚══════════════╝
 ╔══════════════╗
 ║19342823075080╟
|║88037380718711║  (remove this whole line)
|╚══════════════╝

Hầu hết trong số này loại bỏ kết thúc lơ lửng ở phía trên bên phải của hộp, đó là đầu nối đầu ra. Không có kết thúc lỏng lẻo này, hộp chỉ là một nhận xét:

╔══════════════╗
║88037380718711║
╚══════════════╝

Đây không còn là một chương trình hợp lệ vì trình phân tích cú pháp mong đợi một chương trình có chính xác một đầu ra:

Lỗi: Tệp nguồn không chứa chương trình (chương trình phải có đầu ra).

Khả năng duy nhất để lại một đầu nối đầu ra là cái cuối cùng ở trên, để lại cái này:

╔══════════════╗
║19342823075080╟
╚══════════════╝

Tuy nhiên, số này không mã hóa chuỗi Unicode hợp lệ trong UTF-21 bí truyền của Funciton. Hãy thử chạy cái này, bạn nhận được:

Ngoại lệ chưa được xử lý: System.ArgumentOutOfRangeException: Giá trị UTF32 hợp lệ nằm trong khoảng từ 0x000000 đến 0x10ffff, đã bao gồm và không bao gồm các giá trị mã hóa thay thế (0x00d800 ~ 0x00dfff).

Do đó, chương trình này là nguyên sơ.


3
Tôi cảm thấy như bạn đã gặp may mắn trong trường hợp cuối cùng (không phải là nó dễ dàng vô tình có được một chuỗi Unicode hợp lệ, nhưng vẫn ...)
Esolanging Fruit

34

Visual C ++ - 96 95 byte

#include<iostream>
#define I(a,b)a<<b
int main()I({std::cout,I('w',I('o',I('r',I('l','d';)))))}

Tính chất:

  1. Bạn không thể xóa bất kỳ phần nào int main()mà không có lỗi biên dịch.
  2. Bạn không thể xóa những sửa đổi việc mở rộng macro AT ALL, loại bỏ aở tất cả các phương tiện main()không bao giờ được {, loại bỏ bở tất cả các phương tiện đường của chúng tôi không chỉ dừng lại trong một ;, loại bỏ <phương tiện std::cout<'w'gây ra một lỗi, và loại bỏ <<nguyên nhân std::cout'w', 'w''o'vv
  3. Bạn không thể xóa tham số khỏi định nghĩa hoặc gọi macro, tên hợp lệ duy nhất cho định nghĩa sẽ là I(a), I(b)không bao giờ khớp và Imở rộng trước đó (; mặt khác sử dụng các I(,nguyên nhân <<<<,)giảm dấu chấm phẩy (không có bất kỳ lỗi nào khác).
  4. Bạn không thể xóa một phần của tất cả std::coutmà không chạy vào phần dẫn <<, và do đó không thể xóa bất kỳ phần nào #include<iostream>trong phần đầu mà không có lỗi biên dịch.
  5. Bạn không thể xóa bất kỳ phần nào của một ký tự, ''có lỗi ký tự trống và 'w,, v.v ... cố gắng biến mọi thứ thành một ký tự.
  6. Bạn không thể xóa bên trái / bên phải của macro mà không để lại quá nhiều )hoặc (ở phía bên kia, ví dụ: bạn không thể làm những việc như thế I('w',I('r'.

Biên dịch trực tuyến bằng Visual C ++ .

Một lần nữa đây không phải là một bằng chứng đầy đủ. Nếu bạn nghĩ rằng bạn có thể làm cho nó quá công việc mà không có phần hãy chắc chắn để cho tôi biết.

Các phiên bản trước đã sử dụng một cách tiếp cận khác biệt đáng kể và được chứng minh là không còn nguyên sơ nên tôi đã xóa các điểm số đó.


Xác minh:

Chương trình sau đây đã xác nhận phiên bản này còn nguyên sơ bằng cltrình biên dịch từ Visual C ++ 2010. Ước gì tôi đã bận tâm viết nó sớm hơn:

#include <fstream>
#include <iostream>
char *S = "#include<iostream>\n#define I(a,b)a<<b\nint main()I({std::cout,I('w',I('o',I('r',I('l','d';)))))}";
//uncomment to print source code before compile
// #define prints
int main(){
   for(int i=0; i<95; i++)
      for(int j=i; j<95; j++){
         std::fstream fs;
         fs.open ("tmptst.cpp",std::fstream::out);
         for(int k=0; k<95; k++)
         if(k<i || k>j){
            fs << S[k];
            #ifdef prints
               std::cout<<S[k];
            #endif
         }
         fs.close();
         #ifdef prints
            std::cout<<'\n';
         #endif
         //Compile and surpress/pipe all output
         //if it doesn't compile we get a nonzero errorlevel (i.e.true) from system.
         if(!system("cl -nologo tmptst.cpp >x"))
            return 0;
      }
      std::cout<<"PRISTINE!";
}

1
Chúng tôi lưu ý rằng mặc dù điều này là nguyên sơ trên trình biên dịch này, nhưng không phải như vậy trên tất cả các trình biên dịch.
Joshua

1
Xin cho một ví dụ ....
Linus

3
Trên một số trình biên dịch, chương trình C ++ trống mang lại một chương trình không có gì. Tùy thuộc vào việc triển khai iostream, #include <iostream> cũng có thể biên dịch.
Joshua

5
@Joshua Chỉ các chương trình con có độ dài từ 1 trở lên, do đó, chương trình trống này không liên quan gì.
ThisSuitIsBlackNot

2
@Comi INTERN, không thực sự. Nếu bạn không chọn hộp để chạy tệp thực thi, /ctùy chọn sẽ tự động được bao gồm và nó sẽ biên dịch (như thể tạo thư viện chứ không phải chương trình). Nếu bạn chọn hộp chạy mà trang web không bao gồm /c, bạn sẽ không nhận được thông báo thành công và thay vào đó, hãy tìm "LINK: lỗi nghiêm trọng LNK1561: điểm nhập cảnh phải được xác định".
Linus

32

Trăn 3, 79 33

if 5-open(1,'w').write('world'):a

open(1,'w')mở đầu ra tiêu chuẩn, sau đó chúng tôi in chuỗi. writetrả về số lượng ký tự được viết. Điều này được sử dụng để làm cứng chống lại việc loại bỏ chuỗi con: Việc xóa một phần của chuỗi khiến cho một cái gì đó không phải là 5 được trả về và 5 trừ đi giá trị đó sau đó đánh giá là đúng. Nhưng điều đó khiến cho mọi người ifbị xử tử vàa không được xác định.

Điều này được dựa trên câu chuyện nguyên sơ thông minh của Anders Kaseorg ở đây .

Vì chỉ cần một tuyên bố duy nhất cần được xác minh, điều này ngắn hơn nhiều so với giải pháp cũ, nhưng cũng ít chung chung hơn.

Giải pháp cũ:

try:
 q="print('world');r=None"
 if exec('e=q')==eval(q[17:]):exec(e)
finally:r

Để xác minh rằng nó thực sự là một chương trình nguyên sơ:

w=r'''try:
 q="print('world');r=None"
 if exec('e=q')==eval(q[17:]):exec(e)
finally:r'''
exec(w)
for j in range(1,len(w)):
 for i in range(len(w)+1-j):
  e=w[:i]+w[i+j:]
  try:exec(e,{});print('WORKED',e)
  except:pass

Một số điểm chính:

  • Mỗi câu lệnh được thực thi có thể bị xóa. Xác minh rằng qđã được thực hiện yêu cầu một tuyên bố bên ngoài q. Cáctry giải quyết độc đáo, bằng cách yêu cầu ít nhất hai câu lệnh, cả hai câu lệnh đều không thể xóa hoàn toàn.
  • Xác minh rằng qđã thực hiện xảy ra bằng cách đánh giá rở cuối.
  • Xác minh rằng qkhông sửa đổi được thực hiện bằng eval(q[17:]), trong đó có đánh giá để Nonecho qđể được thực thi.
  • Điều ifkiện là một chút khó khăn để có được đúng. Để đảm bảo rằng nó đã được đánh giá, nó có tác dụng phụ tốt đẹp của cài đặt e, cần thiết để thiết lập r. (Đây là lý do tôi đã sử dụng Python 3, exprvì một hàm làm nên điều kỳ diệu cho các hiệu ứng phụ ở mức biểu thức.)

Không phải là thách thức mà không loại bỏ sẽ dẫn đến một lỗi cú pháp? Bạn dường như gây ra lỗi thời gian chạy.
Martin Lütke

5
@ MartinLütke Bất kỳ loại lỗi nào cũng được.
Sở thích của Calvin

1
Ừm, đây không phải là 79 byte?
Matt

@TheMatt Vâng? Tôi chỉ đếm chúng một lần nữa và bạn có vẻ đúng. Có lẽ quá khứ tôi đã tính các dòng mới của CRLF ... Thật đáng xấu hổ. Cảm ơn!
Philipp

25

Haskell, 61

x=uncurry(:)
main=putStr$x('w',x('o',x('r',x('l',x('d',[])))))

Bất kỳ loại lỗi là OK? Trong trường hợp đó:

Haskell, 39

main=putStr$take 5$(++)"world"undefined

Điều này có hoạt động nếu bạn loại bỏ một trong các chữ cái?
lirtosiast

Nó sẽ sụp đổ trong khi thực hiện. Bởi vì nó sẽ cố gắng đánh giá không xác định.
Martin Lütke 9/11/2015

Thật tuyệt vời. FTW đánh giá lười biếng, nó xuất hiện!
DLosc

1
Tôi ước 'inits' nằm trong khúc dạo đầu :(. Sau đó: main = putStr $ inits "world" !! 5 (27 byte)
Martin Lütke

16

JavaScript, 74 73 35 byte

if((alert(a="world")?x:a)[4]!="d")x

Hóa ra câu trả lời đơn giản hơn nhiều so với tôi nghĩ ...

Giải trình

if(
  (
    alert(a="world") // throws a is not defined if '="world"' is removed
        ?x           // throws x is not defined if 'alert' or '(a="world")' is removed
        :a           // throws a is not defined if 'a="world"' or 'a=' is removed
  )
  [4]!="d"           // if "world" is altered fifth character will not be "d"
                     // if 'd' is removed it will compare "world"[4] ("d") with ""
                     // if '[4]' is removed it will compare "world" with "d"
                     // if '(alert(a="world")?x:a)' is removed it will compare [4] with "d"
                     // if '?x:a' is removed [4] on alert result (undefined[4]) will error
                     // if '[4]!="d"' is removed the if will evaluate "world" (true)
                     // if '!', '!="d"' or '(alert...[4]!=' is removed the if will
                     //     evaluate "d" (true)
)x                   // throws x is not defined if reached

// any other combination of removing substrings results in a syntax error

xóa mọi thứ trừ a="world", không có lỗi
anOKsquirrel

3
@anOKsquirrel Chỉ có thể xóa một chuỗi con duy nhất.
Dennis

4
Tôi đã trải qua điều này như "Tôi có thể xóa cái này không? Không, lỗi này sẽ xảy ra. Cái này có thể bị xóa không? Chà, tôi đoán nó sẽ gây ra lỗi khác này. Aha! Những ký tự đó có thể được xóa! Oh chờ ..." +1
Sản xuất ETH

if(a="world")["bol"+a[4]]không có lỗi.
anOKsquirrel

4
Chúa ơi, nó ấn tượng gấp đôi bây giờ! Ước gì tôi có thể +1 lần nữa ...
ETHproductions

15

Java 8, 301 byte

Bởi vì mọi câu hỏi đều cần câu trả lời Java.

class C{static{System.out.print(((((w='w')))));System.out.print((((o='o'))));System.out.print(((r='r')));System.out.print((l='l'));System.out.print(d='d');e=(char)((f=1)/((g=8)-C.class.getDeclaredFields()[h=0].getModifiers()));}public static void main(String[]a){}static final char w,o,r,l,d,e,f,g,h;}

Mở rộng

class C {
    static {
        System.out.print(((((w = 'w')))));
        System.out.print((((o = 'o'))));
        System.out.print(((r = 'r')));
        System.out.print((l = 'l'));
        System.out.print(d = 'd');
        e = (char) ((f = 1) / ((g = 8) - C.class.getDeclaredFields()[h = 0].getModifiers()));
    }

    public static void main(String[] a) { }

    static final char w, o, r, l, d, e, f, g, h;
}

Giải trình

  • public static main(String[]a){} bắt buộc.
  • Nếu các khai báo trường được loại bỏ (hoặc không tĩnh), khối tĩnh đầu tiên không thể tìm thấy chúng.
  • Nếu khối tĩnh bị loại bỏ (hoặc không tĩnh), các trường không được khởi tạo.

Phần khó nhất:

  • Nếu finaltừ khóa bị xóa, dòng thứ hai sẽ đánh giá 1/(8-8), gây ra / by zerongoại lệ.

Tại sao bạn không thể xóa phần bên trong của bất kỳ câu lệnh in nào?
Nic Hartley

2
@QPaysTaxes Không có System.out.print()phương thức trống . Có cho println(), nhưng không cho print(). Vì vậy, nếu bạn xóa d='d'nó sẽ The method print(boolean) in the type PrintStream is not applicable for the arguments ()báo lỗi (Và nếu bạn xóa d=thì nó sẽ The blank final field d may not have been initializedbáo lỗi).
Kevin Cruijssen

15

Funciton , 143 142 136 byte

Điểm số ở UTF-8 như bình thường, vì UTF-16 sẽ lớn hơn hai byte (do BOM).

╔══════════╗
║1934282307║╔╗
║5080880373╟╚╝
║80718711  ║
╚══════════╝

Vì vậy, tôi đã suy nghĩ về câu trả lời của Funciton trong một thời gian và tôi đoán rằng điều đó là không thể, bởi vì bạn luôn có thể xóa một dòng đầy đủ và mã vẫn sẽ tạo thành một khối hợp lệ. Sau đó, tôi đã nói chuyện với Timwi về nó, và anh ấy đã tìm ra rằng bạn chỉ có thể đặt toàn bộ số trong một dòng, như vậy việc loại bỏ nó sẽ phá vỡ chương trình vì thiếu đầu nối đầu ra.

Nhưng chữ trên một dòng nổi tiếng là đắt tiền, cả vì số lượng ký tự lớn hơn vì số lượng ký tự không phải ASCII lớn hơn. Và việc anh ấy nhắc đến một khối "bình luận trống rỗng" khiến tôi suy nghĩ ...

Vì vậy, tôi đã đưa ra giải pháp hiệu quả hơn này, sử dụng một khối bình luận trống bổ sung, nó sẽ bị vỡ khi bạn cố gắng loại bỏ bất cứ thứ gì có thể rời khỏi khối nghĩa đen:

  • Chúng tôi không thể xóa dòng thứ ba, vì sau đó chúng tôi sẽ xóa đầu nối đầu ra.
  • Nếu chúng ta xóa dòng thứ hai, khối nhận xét sẽ mất cạnh trên cùng và bị vỡ.

Điều đó để lại hai lựa chọn (cảm ơn Steve vì đã chỉ ra điều đó):

  • Xóa dòng thứ tư. Điều đó để lại cả hai hộp trong chiến thuật. Tuy nhiên, khi số nguyên kết quả 19342823075080880373được giải mã, chuỗi tương ứng sẽ chứa điểm mã 0x18D53Bkhông phải là ký tự Unicode hợp lệ, System.Char.ConvertFromUtf32gặp sự cố với một ArgumentOutOfRangeException.
  • Xóa một dòng đầy đủ bắt đầu sau góc trên bên phải. Một lần nữa, cả hai hộp được để lại trong chiến thuật, nhưng số nguyên kết quả 508088037380718711sẽ chứa hai điểm mã không hợp lệ 0x1B06350x140077dẫn đến cùng một ngoại lệ.

Lưu ý rằng ngay cả khi không có khối nhận xét trống, việc xóa dòng thứ hai sẽ dẫn đến một điểm mã không hợp lệ. Nhưng khối nhận xét ngăn chúng tôi lấy một dòng từ bên trong dòng thứ hai, để lấy một số nguyên như 193428037380718711ví dụ, điều này sẽ không gây ra lỗi.


Điều gì xảy ra nếu bạn loại bỏ chuỗi con bắt đầu bằng ký tự sau đầu nối đầu ra và hoàn thành chính xác 1 dòng sau? tức là loại bỏ dòng giữa của khối nhận xét và dòng chứa "80718711" trong khối chính, nhưng vẫn giữ nguyên các góc của cả hai hộp.
Steve

@Steve Tôi đã sửa đổi câu trả lời cho trường hợp đó. Sau khi xem xét thêm một chút, điều này thực sự cho phép tôi lưu hai ký tự / sáu byte.
Martin Ender

10

Ruby, 36

eval(*[(s="planet")[$>.write(s)^6]])

Chúng tôi gán s="planet", sau đó viết chuỗi đó vào STDOUT. Điều này trả về số lượng ký tự được viết. Chúng tôi xor rằng với 6, để nếu có bất kỳ ký tự nào ngoài 6 ký tự được viết, chúng tôi sẽ nhận được một số nguyên khác. Sau đó, chúng tôi cắt vào svới chỉ số đó. Chỉ ký tự thứ 0 của s"p" là một chuỗi mã hợp lệ (không có op). Chúng tôi chuyển nó đếneval , sử dụng (*[argument])cú pháp tương đương với(argument) ngoại trừ việc nó không hợp lệ bên ngoài một cuộc gọi phương thức.

Tính xác thực được xác minh theo chương trình trên Ruby 1.9.3 và 2.2


Thánh lồn Thật đáng kinh ngạc.
vỗ tay

Điều gì xảy ra nếu bạn loại bỏ *?
LegionMammal978

Sau đó, bạn đang truyền một mảng tới eval thay vì một chuỗi, đó là một ArgumentError.
lịch sử

9

C #, 128 118 101 byte

Suy nghĩ về việc lạm dụng quy tắc chuỗi con liền kề.

Mật mã

class h{static void Main()=>System.Console.Write(new char[1
#if!i
*5]{'w','o','r','l','d'
#endif
});}

Tại sao nó hoạt động

  1. class hstatic void Main()được yêu cầu.
  2. Xóa bất kỳ ký tự nào 'w','o','r','l','d'gây ra lỗi vì mảng char được khởi tạo với độ dài1*5 .
  3. Bạn không thể xóa nội dung bên trong Main () mà không vi phạm quy tắc ký tự liền kề vì các phần được phân tách bằng các preprocs. (Xem bên dưới)

Trước khi chơi gôn và tách

class h
{
    static void Main() =>
        System.Console.Write(new char[1 * 5]{'w','o','r','l','d'});
}

Đã xác minh với

https://ideone.com/wEdB54

BIÊN TẬP:

  • Đã lưu một số byte bằng cách sử dụng #if !xthay vì #if x #else.
  • Sử dụng =>cú pháp func. #if!xthay vì #if !x. Tín dụng cho @JohnBot.
  • Do =>cú pháp func, điều kiện preproc bổ sung có thể được loại bỏ.

Chào helix! Bạn có nghĩ rằng bạn có thể giải thích làm thế nào và tại sao câu trả lời của bạn hoạt động nhiều hơn một chút?
isaacg

@isaacg Đã chỉnh sửa. Bằng chứng để làm theo.
Helix Quar

Tôi không thể làm cho nó chạy mà không cần staticbật Main.
Johnbot

@ John John Vâng. Phải bị sẩy thai. Đã sửa.
Helix Quar

Bạn có thể tiết kiệm một nhân vật bằng cách làm cho Mainmột thành viên chức năng Biểu hiện thân và 2 hơn bằng cách loại bỏ các không gian trước tình trạng tiền xử lý: class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif. Đó là 115 tính của tôi.
Johnbot

9

MATLAB, 37 36 33 byte

feval(@disp,reshape('world',1,5))

Vì tôi không chắc chắn liệu chúng ta có được phép xuất ans = hay không , tôi đã phải tìm một số công việc xung quanh để xuất ra một cách thích hợp. Bản thân việc sử dụng fprintf không hoạt động, vì dù tôi có cố gắng thế nào thì nó cũng không chịu lỗi. Sử dụng disp bởi chính nó không phải là một lựa chọn, vì nó sẽ chỉ mất 1 đối số và rằng lý lẽ riêng của mình rõ ràng cũng sẽ thực hiện mà không có lỗi.

Nếu không có vấn đề gì khi đưa ans = vào đầu ra, thì MATLAB có thể được thực hiện với 20 byte :

reshape('world',1,5)

tôi thực sự phải tìm hiểu thêm về các chức năng tích hợp (+1) // btw chương trình của bạn được tính điểm 20
Abr001am

2
Điều đó thực sự phụ thuộc vào mức độ nghiêm ngặt của các quy tắc. Họ tuyên bố rằng chỉ nên in 'thế giới' (+ dòng mới theo dõi tùy chọn), sau đó là 33 byte.
slvrbld

Vâng, chúng tôi sẽ tính điều này là 33. Cảm ơn vì đã hiểu :)
Sở thích của Calvin

9

> <> , 17 byte

e"ooooo7-c0pBhtra

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

In "trái đất".

Cách duy nhất để một ><>chương trình thoát mà không có lỗi là thực thi ;ký tự, đây là một vấn đề vì bạn chỉ có thể xóa tất cả các ký tự trước đó, vì vậy đó ;là ký tự đầu tiên được thực thi. Bạn có thể khắc phục điều đó bằng cách sử dụng plệnh để sửa đổi chương trình để đưa ;vào trong khi thực hiện thay thế. Loại bỏ bất kỳ phần của mã nguyên nhân ;để không bao giờ được sản xuất gây ra lỗi thông qua các hướng dẫn không hợp lệ B, ht, chồng underflow, và vòng lặp vô hạn làm cho nó cuối cùng chạy ra khỏi bộ nhớ. Tôi chỉ phải đảm bảo rằng tất cả các vòng lặp vô hạn tiếp tục lấp đầy ngăn xếp.

Tất cả các biến thể đã được thử nghiệm bằng đoạn mã trăn này:

code = 'e"ooooo7-c0pBhtra'
count = {"invalid":0, "underflow":0, "memory":0}
for l in range(1, len(code)):
    for x in range(0, len(code)-l+1):
        print(code[:x] + code[x+l:], "\t\t", end='')
        try:
            interp = Interpreter(code[:x]+code[x+l:])
            for _ in range(0,1000):
                interp.move()
            print(len(interp._stack), "< ", end='')
            interp2 = Interpreter(code[:x]+code[x+l:])
            for _ in range(0,2000):
                interp2.move()
            print(len(interp2._stack))
            count["memory"] += 1
        except Exception as e:
            print(e)
            if str(e) == "pop from empty list": count["underflow"] += 1
            else: count["invalid"] += 1
print(count) 
#don't judge me

được thêm vào (một phiên bản sửa đổi một chút) của trình thông dịch fish.txt chính thức bởi người tạo> <>. Trong số 152 chương trình con có thể, 92 lỗi từ các hướng dẫn không hợp lệ, 18 từ tràn ngăn xếp và 42 do hết bộ nhớ.

Sự thật buồn cười, phiên bản đầu tiên này e"ooooo6-c0pAhtracó một vài chương trình con kỳ dị đã quản lý để sử dụng lệnh put để đặt một lệnh [sẽ xóa ngăn xếp, thay cho lệnh không hợp lệ A. Ngoài ra, "trái đất" là một trong những cụm từ duy nhất sẽ hoạt động với phương thức này, bởi vì chữ cái đầu tiên, elà một hướng dẫn hợp lệ trong ><>. "Mặt khác, lệnh phải được đặt ở phía trước của chương trình và một chương trình con hợp lệ có thể chỉ là "chính nó.


8

Ruby, 34

eval(*[($>.write("world")-1).chr])

Điều này có một vài thành phần:

eval(*[ expr ]) được mượn từ câu trả lời của histocrat , và còn nguyên sơ cũng như xác minh giá trị trả về của expr là một chương trình ruby ​​hợp lệ không có lỗi. method(*arr)là một cú pháp ruby ​​gọi methodvới các giá trị arrlà đối số. Lý do điều này là cần thiết ở đây là vì nó chỉ hợp lệ làm tham số cho một phương thức, do đó nếu evalbị xóa, (*[expr])là một lỗi cú pháp. Nếu expr bị xóa, evalphàn nàn về việc không có đủ đối số

$>.write("world")-1không thể được đọc sai trừ bên trong chuỗi và phép trừ. $>.write("world")ghi "thế giới" vào STDOUT và trả về số lượng ký tự được viết, sau đó trừ đi 1. Nếu chương trình không được xử lý, giá trị sẽ chính xác là 4 . Nếu nó được đọc sai ( -1chuỗi bị loại bỏ hoặc chuỗi được rút ngắn) thì nó sẽ trả về một trong -1,0,1,2,3 hoặc 5 . Bất kỳ kết quả xáo trộn khác trong một lỗi cú pháp.

Gọi chrvào một số trả về ký tự được đại diện bởi số đó. Vì vậy, khi được gọi trên kết quả của ví dụ trên, nó báo lỗi -1 và trả về một chuỗi ký tự đơn khác.

Tôi thực sự không chắc tại sao lại như vậy, nhưng có vẻ như ruby ​​diễn giải \x04như một ký tự khoảng trắng, có nghĩa là biểu thức là hợp lệ (các chương trình ruby ​​trống không làm gì cả). Tuy nhiên, bất kỳ ký tự nào khác ( \x00- \x03\x05) đều dẫn đến Invalid char '\x01' in expression. Tôi đã tìm thấy điều này bằng cách đơn giản lặp đi lặp lại toán học có thể tôi có thể làm với số được trả về. Trước đây tôi đã sử dụng

$>.write("planet
")*16

trong đó "hành tinh" cộng với một dòng mới là 7 ký tự, gấp 16 lần để có 112 p, chức năng một chữ cái duy nhất trong ruby ​​được xác định theo mặc định. Khi không có đối số, nó thực sự là một no-op


Đề cập đến danh dự: $><<"%c"*5%%w(w o r l d)rất gần nhưng không nguyên sơ. Loại bỏ "%c"*5%kết quả không có lỗi. Giải thích nhỏ:

$>là thiết bị xuất chuẩn và <<là một chức năng được gọi trên đó. "%c"*5tạo chuỗi định dạng "%c%c%c%c%c", sau đó trys sẽ được định dạng ( %) bởi một mảng: %w(w o r l d)là phiên bản ngắn hơn của ['w','o','r','l','d']. Nếu có quá ít hoặc quá nhiều phần tử trong mảng sao cho không khớp với chuỗi định dạng, sẽ xảy ra lỗi. Gót chân achilles là thế "%c"*5, và %w(w o r l d)cả hai có thể tồn tại độc lập, và $><<chỉ cần một lập luận của một trong hai. Vì vậy, có một vài cách khác nhau để đưa chương trình này vào anh em họ không có lỗi.


Xác thực bằng cách sử dụng này:

s = 'eval(*[($>.write("world")-1).chr])'
puts s.size
(1...s.length).each do |len| #how much to remove
  (0...len).each do |i| #where to remove from
    to_test = s.dup
    to_test.slice!(i,len)
    begin #Feels so backwards; I want it to error and I'm sad when it works.
      eval(to_test)
      puts to_test
      puts "WORKED :("
      exit
    rescue SyntaxError
      #Have to have a separate rescue since syntax errors
      #are not in the same category as most other errors
      #in ruby, and so are not caught by default with 
      #a plain rescue
    rescue
      #this is good
    end
  end
end

Một lời giải thích dọc theo câu trả lời của lịch sử sẽ rất hay. Có vẻ như bạn đang sử dụng cùng một phương pháp cơ bản, nhưng vì tôi không biết Ruby, tôi không thể hiểu chi tiết.
ThisSuitIsBlackNot

@ ThisSuitIsBlackNot Đã làm hết sức mình, có gì bạn không hiểu không?
Shelvacu

Giải thích tuyệt vời, cảm ơn!
ThisSuitIsBlackNot

6

Python 3 , 43 byte

for[]in{5:[]}[open(1,"w").write("world")]:a

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

Làm thế nào nó hoạt động

Để bảo vệ chống xóa chuỗi con, chúng tôi sử dụng open(1,"w").writethay vì print. Trong Python 3, writetrả về số lượng ký tự viết mà chúng tôi sẽ xác minh là 5để đảm bảo rằng không có phần nào của chuỗi bị xóa. Chúng tôi thực hiện điều này bằng cách tra cứu giá trị trả về trong từ điển {5:[]}và lặp lại kết quả với for[]in…:a, sẽ thất bại nếu chúng tôi không nhận được một lần lặp trống hoặc nếu forcâu lệnh bị xóa.


4

Javascript (Node.js), 93 95 byte

if(l=arguments.callee.toString().length,l!=158)throw l;console.log("world");if(g=l!=158)throw g

Kiểm tra kích thước của chính nó hai lần để nếu có bất kỳ ký tự nào bị lỗi. Độ dài là 156 vì Node.js function (exports, require, module, __filename, __dirname) {chuẩn bị cho mã khi chạy.

Cảm ơn Martin Büttner đã chỉ ra một lỗi. Đã sửa bây giờ.


4

Perl 5.10+, 71 63 byte

(${open 0;@{\(read(0,$a,63)!=63?die:@_)};say"world"});{$a//die}

In worldvới một dòng mới. Chạy như thế này:

perl -M5.010 file

Điều này phụ thuộc vào số byte của mã nguồn, do đó filephải chứa mã ở trên và không có gì khác (không có shebang, không có dòng mới). Perl 5.10+ là bắt buộc cho sayvà toán tử được xác định hoặc //.


Thật khó để thực hiện một chương trình nguyên sơ với Perl, bởi vì:

  • Bất kỳ nhận dạng bareword (ví dụ foo, a, _) là một tuyên bố còn hiệu lực với no strict 'subs';(mặc định). Điều này có nghĩa là chương trình không thể bắt đầu cũng như kết thúc bằng một chữ cái, số hoặc gạch dưới.

  • Như tchrist giải thích , "Các định danh được chỉ định thông qua hội nghị biểu tượng hoàn toàn không có bất kỳ hạn chế nào đối với tên của chúng." Điều này có nghĩa các chương trình không thể bắt đầu với bất kỳ sigils $, @, %, hay *, kể từ khi loại bỏ tất cả nhưng ký tự đầu tiên và cuối cùng sẽ luôn để lại một tên biến hợp lệ.

  • Nhiều hàm dựng sẵn (bao gồm hầu hết các hàm có khả năng tạo đầu ra) hoạt động $_theo mặc định, vì vậy các cuộc gọi sẽ thường hoạt động ngay cả khi bạn xóa đối số (ví dụ say"world"so với say).

Làm thế nào nó hoạt động

Giải pháp này được lấy cảm hứng từ câu trả lời Node.js của Naouak , kiểm tra độ dài của chính nó để đảm bảo các ký tự chưa bị xóa.

Chương trình có hai phần, một phần trong ngoặc đơn và phần còn lại trong một khối:

(...);{...}

Phần đầu tiên đọc tệp nguồn và chết nếu nó dài dưới 63 ký tự. Phần thứ hai kiểm tra rằng readthực hiện thành công. Nếu một trong hai phần bị loại bỏ (có hoặc không có dấu ngoặc đơn kèm theo hoặc dấu ngoặc nhọn), phần khác sẽ đưa ra một ngoại lệ.

Loại bỏ phần giữa hoặc bên trái hoặc bên phải của chương trình sẽ làm mất cân bằng dấu ngoặc đơn và / hoặc dấu ngoặc nhọn, gây ra lỗi cú pháp.

Nếu là người đầu tiên diebị thay đổi (để d, e, di, de, hoặc ie, đó là tất cả định danh hợp lệ), việc kiểm tra chiều dài trở thành:

@{\(read(0,$a,63)!=63?di:@_)};

đánh giá:

@{\'di'};

Điều này có một tham chiếu đến một chuỗi và cố gắng xem xét nó như là một mảng, tạo ra một lỗi:

Not an ARRAY reference

Nếu bất kỳ tuyên bố nào khác bị thay đổi, kiểm tra độ dài sẽ thất bại và chương trình sẽ chết.


Xác minh nguyên sơ với chương trình sau:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use File::Temp;
use List::MoreUtils qw(uniq);

sub delete_substr {
    my ($str, $offset, $len) = @_;

    my $tmp = $str;
    substr($tmp, $offset, $len) = '';

    return $tmp;
}

sub generate_subprograms {
    my ($source) = @_;

    my $tot_len = length $source;
    my @subprograms;                                             

    foreach my $len (1 .. $tot_len - 1) { 
        foreach my $offset (0 .. $tot_len - $len) {
            push @subprograms, delete_substr($source, $offset, $len);
        }                                                        
    }                                                            

    return uniq @subprograms;                                    
}                                                                

chomp(my $source = <DATA>);                                                                                                       
my $temp = File::Temp->new;                                                                                        

foreach my $subprogram ( generate_subprograms($source) ) {       
    print $temp $subprogram;

    my $ret = system(qq{/usr/bin/perl -M5.010 $temp > /dev/null 2>&1});
    say($subprogram), last if $ret == 0;

    truncate $temp, 0;
    seek $temp, 0, 0;
}

__DATA__
(${open 0;@{\(read(0,$a,63)!=63?die:@_)};say"world"});{$a//die}

4

Ruby + coreutils, 33 27 26 byte

`base#{$>.write"world
"}4`

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

Backticks trong ruby ​​thực thi lệnh bên trong chúng và trả về bất cứ thứ gì chương trình đưa vào STDOUT dưới dạng chuỗi. Các #{expr}cú pháp cho phép nhúng các biểu thức trong chuỗi và backticks. Chương trình này có thể được viết lại (không nguyên sơ) như:

system("base" + (STDOUT.write("world\n")).to_s + "4")

IO#writetrả về số byte được ghi, vì vậy nếu chuỗi được rút ngắn thì nó sẽ không phải là số đúng. #{}nhúng tự động làm cho số thành một chuỗi. Nếu một số phần bị loại bỏ và nó không gây ra lỗi cú pháp, lệnh sai sẽ được chạy. Nếu một phần của "world"được lấy ra hơn một trong base04qua base54sẽ cố gắng chạy.

Dòng mới, cho dù vào hay ra khỏi chuỗi, là bắt buộc. Nếu không, 5 ký tự đầu tiên ( `base) có thể được loại bỏ, làm cho toàn bộ dòng nhận xét. Ngoài ra, phải có một hoặc nhiều ký tự giữa backtick đầu tiên và #, nếu không, {có thể bị xóa để làm cho toàn bộ một nhận xét shell .


exec(*[(s="ec%co earth")%s[10]])

execThay thế quá trình ruby ​​hiện tại bằng lệnh được chỉ định. Xem câu trả lời khác của tôi để được giải thích về meth(*[])cú pháp và tính cần thiết của nó.

(s="ec%co earth")gán chuỗi "ec% co earth" cho biến s. Bài tập trả về những gì đã được gán, do đó chuỗi cũng được trả về.

"format string %d" % 5là đường cú pháp cho sprintf("format string %d",5), tuy nhiên không gian xung quanh %không phải là cần thiết.

s[10]lấy ký tự trong chuỗi ở chỉ số 10. Khi không được đọc, ký tự này là "h", chữ cái cuối cùng trong chuỗi. Tuy nhiên, loại bỏ bất kỳ ký tự nào trong chuỗi có nghĩa là chuỗi ngắn hơn, do đó không có ký tự nào trong chỉ mục 10, do đó s[10]trả về nil"%c" % nilgây ra lỗi.

nếu %s[10]bị loại bỏ, thì ruby ​​sẽ cố chạy lệnh ec%co earthkhông hoạt động.

Thay đổi 10thành 1hoặc 0cũng dẫn đến một lệnh không xác định (hoặc eceohoặc ecco). Loại bỏ nó hoàn toàn về mặt kỹ thuật không phải là lỗi cú pháp vì nó gọi phương thức #[]trên chuỗi, nhưng sau đó nó phàn nàn về việc không đủ đối số.


Một lưu ý về việc giải quyết vấn đề này nói chung: Bạn phải có một số trình bao bọc xác minh mã bên trong theo nghĩa trừu tượng trong khi vẫn còn nguyên sơ. Ví dụ, một chương trình có phân chia ở cuối ( blablabla/somevar) sẽ không bao giờ hoạt động vì một phân chia luôn có thể bị xóa ( blablabla). Đây là một số trình bao bọc như vậy tôi đã sử dụng cho đến nay:

  • eval(*[])được sử dụng bởi histocrat và trong câu trả lời đầu tiên của tôi. Xác nhận rằng đầu ra là một chương trình ruby ​​hợp lệ
  • exec(*[])được sử dụng ở trên, xác nhận rằng phản hồi là một lệnh hợp lệ
  • `#{}`

Cú pháp backtick cũng chạy một lệnh (và do đó xác nhận rằng đó là một lệnh hợp lệ), tuy nhiên STDOUT được ghi lại dưới dạng một chuỗi thay vì là đầu ra như tiến trình cha mẹ '(Ruby's) STDOUT. Do đó, tôi không thể sử dụng nó cho câu trả lời này, EDIT: Tôi đã làm cho nó hoạt động. Hạn chế nêu trên.

Chỉnh sửa: Cảm ơn @histocrat đã chỉ ra một số sai sót


Cách tiếp cận tuyệt vời! Bạn có thể (và do đó phải) loại bỏ khoảng trắng giữa writevà đầu chuỗi, nhưng tôi không nghĩ điều đó ảnh hưởng đến sự nguyên sơ. Ngoài ra, trên máy của tôi base64sẽ chờ đợi đầu vào, điều này có thể trái với quy tắc.
lịch sử

@histocrat Wow, tôi cho rằng nó $>.write"world"hoạt động, cảm ơn! Đối với cơ sở 64 đang chờ đầu vào, nó dường như thay đổi theo hệ thống. TIO hoạt động tốt. Điều đó làm cho nó thậm chí còn mờ hơn cho dù nó tuân theo các quy tắc.
Shelvacu

3

PowerShell, (97 byte + 5 cho tên chương trình) = 102 Byte

"$(try{if(($a=(gc .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a

Tự kiểm tra trước khi nó tự hủy ... hai lần.

Dự kiến ​​sẽ được lưu c.ps1và thực hiện từ thư mục cục bộ như vậy :
PS C:\Tools\Scripts\Golfing\> .\c.ps1.

Bí danh gclà viết tắt của Get-Contentvà tương tự như catđọc một tệp (trong trường hợp này là đường dẫn thực thi của chúng tôi .\c.ps1). Chúng tôi lấy .Lengthtệp, đặt nó $avà kiểm tra xem nó không bằng 97 với -eq97. Nếu nó bằng nhau (nghĩa là chương trình chưa được sửa đổi), chúng tôi sẽ in "world"và thực thi lệnh không hợp lệ a. Điều này buộc catchphải có hiệu lực, cho phép chúng ta kiểm tra lại chính mình. Lần này, nếu mã của chúng tôi không bằng 97, chúng tôi sẽ ném một lệnh không hợp lệ để chương trình của chúng tôi bị lỗi và in văn bản lỗi sang đầu ra. Chúng tôi sau đó clear()lỗi và exitbình thường.

Rõ ràng là nếu một trong hai ifcâu lệnh bị can thiệp, thì câu lệnh kia sẽ có lỗi. Nếu bất kỳ phần nào "world";bị giả mạo, phần đầu tiên ifsẽ gây ra lỗi. Vì nó phải liền kề nhau, chúng tôi không thể xóa cả hai ifcâu lệnh. Các chuỗi ở giữa sẽ dẫn đến dấu ngoặc đơn không khớp hoặc sẽ dẫn đến lần thứ hai {a}được thực thi. Các try/ catchlà để bắt lỗi từ người đầu tiên iftuyên bố vì vậy chúng tôi có thể đúng cách rõ ràng nó. Các "$( )"chuỗi bên ngoài ngăn chặn từ một trong hai đầu bị bắn. Cuối cùng ;alà để ngăn chặn các phần giữa bị bắn tỉa dẫn đến các chương trình hợp lệ (ví dụ: "it}a)";asẽ in it}a)và sau đó bị lỗi).

Có một số trường hợp đặc biệt:

  • Nếu gc, gc<space>hoặc gc .\bị xóa, chương trình cuối cùng sẽ bị lỗi do lỗi bộ nhớ (do các cuộc gọi tự thực hiện lặp đi lặp lại) và có khả năng làm hỏng vỏ (và có thể cả máy tính). Không được kiểm tra.
  • Nếu <space>.\c.ps1hoặc .\c.ps1bị xóa, chương trình sẽ dừng và nhắc nhập dữ liệu người dùng. Bất kể người dùng nhập gì, chương trình vẫn sẽ bị lỗi do số lượng kích thước sẽ sai.
  • Nếu một chuỗi con bắt đầu tại $và kết thúc trước khi cuối cùng "bị cắt, chương trình sẽ xuất ra bất cứ thứ gì còn lại và sau đó là lỗi vì akhông hợp lệ.

Xác minh như sau:

$x='"$(try{if(($a=(gc .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yy='"$(try{if(($a=( .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yyy='"$(try{if(($a=(.\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yyyy='"$(try{if(($a=(c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'

for($i=1;$i-lt$x.Length;$i++){
  for($j=0;$j-lt($x.Length-$i);$j++){
    $y=($x[0..$j]+$x[($i+$j+1)..$x.Length])-join''
    $y>.\c.ps1
    $error.clear()
    if(!($y-in($yy,$yyy,$yyyy))){try{.\c.ps1}catch{};if(!($error)){exit}}
    $q++;
    write-host -n "."
    if(!($q%150)){""}
  }
}
"No success."

(Cảm ơn Martin vì sự giúp đỡ sâu rộng của anh ấy!)


3

C (gcc) (Linux, -Werror=undef), 66 byte

main(a){a
=
1
/
(puts("world")/
6);
#if(7^__LINE__)
#else
}
#endif

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

Thử thách lớn! Điều này thật khó khăn, nhưng tôi chắc chắn bây giờ tôi đã có một chương trình hợp lệ!

Sử dụng lệnh tiền xử lý để không loại bỏ dòng mới nào, vì khung đóng chỉ mainđược bao gồm nếu __LINE__==6. Nó cũng giữ cho bạn khỏi mainhoàn toàn xóa sạch , vì lá đó #endifnổi (vì vậy điều quan trọng #endiflà bên ngoài main).

Tôi đã sử dụng #elsebởi vì tôi đã trở nên khá thuyết phục rằng không có phiên bản __LINE__==6nào không thể loại bỏ một chuỗi con và vẫn đúng, vì cả hai 6__LINE__bản thân chúng đều là sự thật. Nó cũng sử dụng -Werror=undefsao cho những thứ như #ifdef(LINE__)không đánh giá thành sai, nhưng là một lỗi.

Với gcc (trên Linux, ít nhất), putstrả về số lượng ký tự được in (bao gồm cả dòng mới), do đó, việc xóa bất kỳ phần nào của chuỗi sẽ puts("...")/6trả về 0, do đó 1/0gây ra ngoại lệ dấu phẩy động. Lưu ý rằng ngoại lệ này không được gây ra trừ khi 1/0được gán cho một cái gì đó, vì vậy a=bắt buộc phải có.

Không có phần nào khác của bất kỳ dòng nào có thể được loại bỏ mà không tạo ra lỗi, thường là lỗi cú pháp hoặc lỗi liên kết.

Như một phần thưởng, điều này mang lại một giải pháp 86 byte cho C ++ khá tầm thường, chỉ cần thêm #include <cstdio>và khai báo alà một int. Hãy thử trực tuyến! (C ++)


Trừ khi tôi nhầm, bạn có thể xóa 1/trong khi rời dòng mới và nó vẫn sẽ chạy .
dạ dày

@gastropner Đúng rồi bạn. 1Tôi đã tin vào dòng trước tôi tin.
Chris

Đáng buồn thay, điều tương tự giữ. Sau đó bạn có thể loại bỏ =1. Tôi nghĩ rằng bạn cần phải đặt 1 trên một dòng trên chính nó.
dạ dày

@gastropner Tôi nghĩ bạn đúng. Tôi sẽ xem xét sau. Cảm ơn!
Chris

2

PHP, 73 byte

<?=call_user_func(($p='ns')|(($f="u{$p}erialize"))?$f:'','s:5:"world"');

Giải thích

Tôi giả sử cấu hình php.ini mặc định. Vì vậy, short_tags bị vô hiệu hóa. Điều này có nghĩa là bạn không thể xóa =thẻ mở.

Đây là cơ bản <?=unserialize('s:5:"world"');.

Nếu bạn loại bỏ bất kỳ phần nào của chuỗi nối tiếp, bạn sẽ gặp lỗi.

Bạn có thể chỉ cần loại bỏ unserializevà tập lệnh sẽ chỉ xuất chuỗi nối tiếp. Để khắc phục điều này tôi sử dụng call_user_func. Loại bỏ một trong các thông số sẽ dẫn đến một lỗi.

'<?=call_user_func('unserialize','s:5:"world"');

Tuy nhiên, bạn có thể loại bỏ un, để gọi serializechức năng. Vì vậy, chúng tôi đưa ra 'ns`. Xóa bất kỳ ký tự nào sẽ không dẫn đến tên hàm không chính xác.

<?=call_user_func(($p='ns')&&($f="u{$p}erialize")?$f:'','s:5:"world"');

Chúng tôi sẽ sử dụng một nội tuyến nếu để sử dụng gán biến với thẻ đầu ra. Thay vì sử dụng, &&chúng tôi sử dụng '|' để ngăn chặn việc xóa một &hoặc xóa $fbài tập

Bạn có thể loại bỏ ='ns')&&($f="u{$p}erialize"và kết thúc với ($p)?$f:''. Do đó tôi thêm dấu ngoặc đơn xung quanh $f="u{$p}erialize".

Ghi chú

Về mặt kỹ thuật, bạn có thể loại bỏ các thẻ mở mà không gây ra lỗi. Tuy nhiên, đây không còn là tập lệnh PHP mà chỉ là một tệp văn bản thuần túy.


2
Về lưu ý cuối cùng của bạn, tệp văn bản đơn giản vẫn sẽ là một chương trình PHP hợp lệ, phải không? Vì vậy, tôi không chắc chắn điều này là hợp lệ.
Sở thích của Calvin

Nó không còn là PHP, mà là plaintext / html, do đó không còn là chương trình php hợp lệ nữa
Martijn

1

Matlab (77)

bsxfun(@(c,b)arrayfun(@(x)getfield(c,{x}),conv(b,ismember(4,b))),'world',1:5)

thử nó

Ghi chú:

Theo lời khuyên của @ Optimiser về việc thiết kế CPR hoặc một cái gì đó, tôi đã phải đối mặt với chuỗi con không lường trước được, điều này không dẫn đến bất kỳ lỗi biên dịch nào khi bị xóa, ví dụ: xóa arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),khỏi chỉnh sửa trước đó feval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')không tạo ra bất kỳ lỗi nào! Ngoài ra, đối với cùng một phiên bản gần đây, đã có bsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)bsxfun(@(a,b)a,'world',1:5), nếu bạn hỏi về việc tôi đã tìm thấy chúng như thế nào trong bảng điều khiển đầu ra của mình, tôi đã khóc như một đứa bé, vì vậy đây là chương trình:

b=0;string='bsxfun(@(c,b)arrayfun(@(x)getfield(c,{x}),conv(b,ismember(4,b))),''world'',1:5)'
for u=1:numel(string),for j=u:numel(string)-2,try a=eval([string(1:u) string(j+2:end)]);catch(b); a=0;end; if a~=0, ['here is it : ' string(1:u) string(j+2:end)],end;end;end

Một ví dụ về chương trình không phổ biến

biên tập:

Cảm ơn tất cả mọi người bên cạnh @Martin đã chỉ ra mã trước đây của tôi (không phải lỗi).


1

SmileBASIC, 63 byte

REPEAT
A=1/(PRGSIZE(0,1)==63)?"world
UNTIL 1/(PRGSIZE(0,1)==63)

1

Cây lê , 17 byte

Chương trình này chứa các byte với tập bit cao (không phải là UTF-8 hợp lệ và do đó không thể được đăng trên TIO), vì vậy đây là một xxdhexdump có thể đảo ngược:

00000000: 7072 696e 7427 776f 726c 6427 23cd 4290  print'world'#.B.
00000010: bf                                       .

Giải trình

Đây chỉ là print'world'với một tổng kiểm tra được nối thêm. Tôi đã xác minh bằng vũ lực rằng không có thao tác xóa nào có thể đưa ra một chương trình có tổng kiểm tra hợp lệ, do đó bạn sẽ gặp lỗi sau khi xóa bất kỳ trường hợp nào.

Khá nhàm chán, nhưng ràng buộc với nhà lãnh đạo hiện tại, vì vậy tôi cảm thấy nó đáng để đăng.

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.