Nó có phải là một chuỗi con của chính nó?


21

Đưa ra một chuỗi, trả về xem chuỗi đó có phải là chuỗi con của mã nguồn của chương trình hay không.

Áp dụng quy tắc chuẩn quine, nghĩa là bạn không thể đọc mã nguồn của riêng mình. Độ dài của đầu vào được đảm bảo nhỏ hơn hoặc bằng độ dài của chương trình. Bạn có thể trả về bất kỳ hai giá trị riêng biệt nào, không nhất thiết là giá trị trung thực và giá trị falsey. Bạn cũng có thể gửi một chức năng, chứ không phải là một chương trình đầy đủ.

Đây là một để mã ngắn nhất chiến thắng!

Một ví dụ

Nếu mã nguồn của bạn là print(input() = False), nó sẽ trả về True cho nt(inhưng Sai cho tupn.



2
@totallyhuman như với hầu hết các thử thách, vâng.
caird coinheringaahing


10
@StanStrum Không phải là để chỉ ra các bản sao, nó là để hiển thị các thách thức liên quan mà mọi người có thể quan tâm và hiển thị chúng trên thanh bên bên phải.
hoàn toàn là

1
Đầu vào có thể để trống không? (Trên thực tế, có thể trống không?)
Lynn

Câu trả lời:



6

JavaScript , 25 byte

f=s=>('f='+f).includes(s)

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

Cá nhân tôi không phải là fan hâm mộ của nó, nhưng nó được cho phép .

Giải pháp thay thế (không hợp lệ?), 19 byte

Điều này có đầu vào như một regex.

f=s=>s.test('f='+f)

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


Nó không tự đọc à?
Adám


Mục đích của việc đề cập rõ ràng là (Node.js)gì? Nó cũng không hoạt động trong trình duyệt sao?

@ThePirateBay Hoạt động như mong đợi trong Chrome.
steenbergh

1
Các bạn đang nghĩ về phía trước, đó chỉ là từ mẫu TIO. : P
hoàn toàn là

5

Java 8, 124 112 byte (hàm)

p->{String s="p->{String s=%c%s%1$c;return s.format(s,34,s).contains(p);}";return s.format(s,34,s).contains(p);}

Hãy thử nó ở đây.


Đây là chương trình đầy đủ thay thế (để xem một trong những lý do tại sao các chức năng được phép trên PPCG, bởi vì một số ngôn ngữ giống như Java - yêu cầu mã soạn sẵn bắt buộc rất dài cho các chương trình đầy đủ).

Java 8, 226 214 byte (chương trình đầy đủ)

interface M{static void main(String[]a){String s="interface M{static void main(String[]a){String s=%c%s%1$c;System.out.print(s.format(s,34,s).contains(a[0]));}}";System.out.print(s.format(s,34,s).contains(a[0]));}}

Hãy thử nó ở đây.


Giải trình:

  • String schứa mã nguồn chưa được định dạng.
  • %sđược sử dụng để nhập Chuỗi này vào chính nó với s.format(...).
  • %c, %1$c34 được sử dụng để định dạng dấu nháy kép.
  • s.format(s,34,s) đặt tất cả lại với nhau

Và sau đó .contains(...)được sử dụng để kiểm tra xem mã nguồn này có chứa đầu vào đã cho hay không.


Điều này cho tôi đúng với tất cả các chuỗi khi tôi "Dùng thử trực tuyến".
MichaelK

1
@MichaelKarnerfors không dành cho tôi ... Bạn có chắc chắn bạn không thêm đối số mỗi lần? Chỉ có một đối số được sử dụng. Bạn phải chạy chương trình thay đổi đối số mỗi khi bạn thực hiện một bài kiểm tra mới.
Olivier Grégoire

@ OlivierGrégoire Bạn nói đúng, tôi đã sử dụng trang TIO sai. Cảm ơn bạn. :)
MichaelK

3

Bash, 43 , 28 byte

[[ $BASH_COMMAND = *"$1"* ]]

thử trực tuyến


Tôi không biết Bash, nhưng điều này có thể được đánh gôn hơn nữa bằng cách loại bỏ rất nhiều khoảng trắng?
caird coinheringaahing

@cairdcoinheringaahing Tôi không nghĩ vậy, typesetđịnh dạng nó giống như AFAICT này. Hãy thử trực tuyến!
Erik the Outgolfer

nhưng có thể được cải thiện bằng cách sử dụng một kỹ thuật khác
Nahuel Fouilleul

vừa tìm thấy một giải pháp khác
Nahuel Fouilleul

Không gì $1làm gì?
caird coinheringaahing

2

Haskell , 92 byte

import Data.List;f s=isInfixOf s$(++)<*>show$"import Data.List;f s=isInfixOf s$(++)<*>show$"

Hãy thử trực tuyến! Rõ ràng mở rộng của quine tiêu chuẩn. Loại bỏ việc nhập sẽ tốt, nhưng tôi nghi ngờ isInfixOfcó thể được tính bằng một lượng byte ngắn hơn.



2

QBIC , 28 byte

?instr(B+B,;)#?instr(B+B,;)#

Điều này in 0 nếu đầu vào không phải là chuỗi con của nguồn và X nếu không thì X là chỉ mục (đầu tiên) của chuỗi con.

Giải trình

Latter part:
#?instr(B+B,;)#   Define a string literal B$ with a copy of the source

First part:
?                 PRINT
 instr(   , )     the index of
           ;          the cmd line parameter A$
       B+B            in B$ concatenated with itself

#định nghĩa một chuỗi ký tự trong QBIC và gán nó cho biến chuỗi có sẵn đầu tiên. Đó là B$trong chương trình này, vì A$đã được thực hiện bởi ;(đọc một chuỗi từ dòng cmd). Sau đó, tất cả mọi thứ cho đến dấu phân cách được đưa vào nghĩa đen; dấu phân cách là một backtick - điều này cũng làm cho nó trở thành char ASCII duy nhất không thể có trong lits chuỗi. Trong trường hợp này, QBIC không cần backtick, vì nghĩa đen bị chấm dứt ở cuối mã bởi tính năng tự động đóng của QBIC. Để biết thêm thông tin về chữ của QBIC, hãy xem chủ đề Showcase .


Là gì Atrong bối cảnh này?
caird coinheringaahing

@cairdcoinheringaahing một lỗi nhỏ về phía tôi, nên đã được Bvà một lời giải thích được thêm vào.
steenbergh

2

Thạch , 10 byte

“;⁾vṾƓẇ”vṾ

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

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

“;⁾vṾƓẇ”vṾ  Main link. No arguments.

“;⁾vṾƓẇ”    Set the left argument and the return value to ';⁾vṾƓẇ'.
         Ṿ  Uneval; yield '“;⁾vṾƓẇ”'.
        v   Dyadic eval; eval ';⁾vṾƓẇ' with argument '“;⁾vṾƓẇ”'.

  ⁾vṾ       Yield 'vṾ'.
 ;          Append it to '“;⁾vṾƓẇ”', yielding the source code.
     Ɠ      Read a string from STDIN.
      ẇ     Check if it's a substring of the source code.

1

Julia, 72 byte

Bây giờ tôi hiểu ý của mọi người khi họ nói rằng các vấn đề về quine chỉ là các biến thể của câu hỏi cổ điển.

x="~y=contains\"x=\$(repr(x));\$x\",y)";~y=contains("x=$(repr(x));$x",y)

Giải trình

#Defines x to be the next line of the source, with the help of escaping characters
x="~y=contains\"x=\$(repr(x));\$x\",y)"; 
#Interpolates together a comparison string, including repr(x), the re-escaped from of x, and x itself, for comparison. 
~y=contains("x=$(repr(x));$x",y)


0

05AB1E , 17 byte

0"D34çýIå"D34çýIå

Sửa đổi mặc định 0"D34çý"D34çýbằng cách thêm .

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

Giải trình:

0                    # Push 0 to the stack
                     #  STACK: [0]
 "D34çýIå"           # Push the string 'D34çýIå' to the stack
                     #  STACK: [0, 'D34çýIå']
          D          # Duplicate this string
                     #  STACK: [0, 'D34çýIå', 'D34çýIå']
           34ç       # Push '"' to the stack
                     #  STACK: [0, 'D34çýIå', 'D34çýIå', '"']
              ý      # Join the stack by this '"' delimiter
                     #  STACK: ['0"D34çýIå"D34çýIå']
               I     # Take the input
                     #  STACK: ['0"D34çýIå"D34çýIå', 'Iå"D']
                å    # Check if it's a substring of the source code
                     #  STACK [1]
                     # (Output the top of the stack implicitly)
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.