มันเป็นสตริงย่อยของตัวเองหรือไม่?


21

รับสตริงส่งคืนว่าสตริงเป็นสตริงย่อยของซอร์สโค้ดของโปรแกรมหรือไม่

ใช้กฎ quine มาตรฐานซึ่งหมายความว่าคุณไม่สามารถอ่านซอร์สโค้ดของคุณเอง ความยาวของอินพุตมีการรับประกันว่าจะน้อยกว่าหรือเท่ากับความยาวของโปรแกรม คุณอาจส่งคืนค่าที่แตกต่างกันสองค่าโดยไม่จำเป็นต้องเป็นค่าจริงและค่าเท็จ นอกจากนี้คุณยังสามารถส่งฟังก์ชั่นแทนที่จะเป็นโปรแกรมเต็มรูปแบบ

นี่คือสั้นที่สุดที่จะชนะ!

ตัวอย่าง

ถ้ารหัสที่มาของคุณprint(input() = False)ก็ควรจะกลับ True สำหรับแต่สำหรับเท็จnt(itupn



2
@tallyallyhuman เช่นเดียวกับความท้าทายส่วนใหญ่ใช่
caird coinheringaahing


10
@StanStrum มันไม่ได้เป็นการชี้ให้เห็นความซ้ำซ้อน แต่ก็คือการแสดงความท้าทายที่เกี่ยวข้องที่ผู้คนอาจสนใจและแสดงพวกเขาบนแถบด้านข้างทางด้านขวา
สิ้นเชิงมนุษย์

1
อินพุตว่างเปล่าได้ไหม (อันที่จริงแล้วโค้ดจะว่างเปล่าหรือเปล่า?)
ลินน์

คำตอบ:



6

JavaScriptขนาด 25 ไบต์

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

ลองออนไลน์!

ผมเองไม่ได้เป็นแฟนของเรื่องนี้ แต่ได้รับอนุญาต

โซลูชันสำรอง (ไม่ถูกต้อง?) ขนาด 19 ไบต์

สิ่งนี้ใช้อินพุตเป็น regex

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

ลองออนไลน์!


มันไม่อ่านเองเหรอ?
Adám


อะไรคือจุดประสงค์ของการกล่าวถึงอย่างชัดเจน(Node.js)? มันไม่ทำงานในเบราว์เซอร์ด้วยหรือไม่

@ThePirateBay ทำงานอย่างที่คาดไว้ใน Chrome
steenbergh

1
พวกคุณกำลังคิดไปข้างหน้ามันเป็นเพียงแค่จากแม่แบบ TIO : P
มนุษย์

5

Java 8, 124 112 ไบต์ (ฟังก์ชัน)

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);}

ลองที่นี่


นี่คือโปรแกรมเต็มรูปแบบแทน (เพื่อดูหนึ่งในเหตุผลที่อนุญาตให้ใช้ฟังก์ชั่นบน PPCG ได้เนื่องจากบางภาษาที่เหมือน Java จำเป็นต้องใช้รหัสสำเร็จรูปที่จำเป็นสำหรับโปรแกรมเต็มรูปแบบ)

Java 8, 226 214 ไบต์ (โปรแกรมเต็มรูปแบบ)

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]));}}

ลองที่นี่


คำอธิบาย:

  • String sมีรหัสที่มาที่ยังไม่ฟอร์แมต
  • %sจะใช้ในการป้อนข้อมูล String s.format(...)นี้ลงในตัวเองด้วย
  • %c, %1$cและ34จะใช้ในการจัดรูปแบบราคาสองครั้ง
  • s.format(s,34,s) ทำให้มันเข้าด้วยกัน

จากนั้น.contains(...)จะใช้เพื่อตรวจสอบว่าซอร์สโค้ดนี้มีอินพุตที่กำหนดหรือไม่


สิ่งนี้ทำให้ฉันเป็นจริงสำหรับสตริงทั้งหมดเมื่อฉัน "ลองออนไลน์"
MichaelK

1
@MichaelKarner ไม่เหมาะสำหรับฉัน ... คุณแน่ใจหรือว่าคุณไม่ได้เพิ่มการขัดแย้งในแต่ละครั้ง? มีการใช้อาร์กิวเมนต์เดียวเท่านั้น คุณต้องเรียกใช้โปรแกรมเพื่อเปลี่ยนอาร์กิวเมนต์ทุกครั้งที่คุณทำการทดสอบใหม่
Olivier Grégoire

@ OlivierGrégoireคุณถูกต้องฉันใช้หน้า TIO ผิด ขอขอบคุณ. :)
MichaelK

3

Bash, 43 , 28 bytes

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

ลองออนไลน์


ฉันไม่รู้จัก Bash แต่สามารถเล่นกอล์ฟต่อไปได้หรือไม่โดยการลบช่องว่างออกจำนวนมาก?
caird coinheringaahing

@cairdcoinheringaahing ฉันไม่คิดอย่างนั้นจัดtypesetรูปแบบเช่นนี้ AFAICT ลองออนไลน์!
Erik the Outgolfer

แต่อาจได้รับการปรับปรุงให้ดีขึ้นอาจใช้เทคนิคอื่น
Nahuel Fouilleul

เพิ่งค้นพบวิธีแก้ปัญหาอื่น
Nahuel Fouilleul

อะไร$1ทำอย่างไร
caird coinheringaahing

2

Haskell , 92 ไบต์

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

ลองออนไลน์! ส่วนขยายที่เห็นได้ชัดของควินมาตรฐาน การกำจัดการนำเข้าจะดี แต่ฉันสงสัยว่าisInfixOfสามารถคำนวณได้ในจำนวนไบต์ที่สั้นกว่า



2

QBICขนาด 28 ไบต์

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

สิ่งนี้จะพิมพ์ 0 หากอินพุตไม่ใช่ซับสตริงของซอร์สและ X มิฉะนั้นโดยที่ X คือดัชนี (แรก) ของซับสตริง

คำอธิบาย

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

#กำหนดสตริงตัวอักษรใน QBIC และกำหนดให้กับตัวแปรสตริงแรกที่มี ที่อยู่B$ในโปรแกรมนี้เพราะA$ถูกใช้ไปแล้ว;(อ่านสตริงจากบรรทัด cmd) จากนั้นทุกอย่างจนถึงตัวคั่นจะถูกป้อนเข้าสู่ตัวอักษร ตัวคั่นเป็น backtick ซึ่งทำให้ ASCII ถ่านตัวเดียวที่ไม่สามารถรวมในสตริง lits ได้ ในกรณีนี้ QBIC ไม่จำเป็นต้องมี backtick เพราะตัวอักษรถูกยกเลิกในตอนท้ายของรหัสโดยคุณสมบัติปิดอัตโนมัติของ QBIC สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวอักษร Qbic ให้ดูด้ายตู้โชว์


คืออะไรAในบริบทนี้?
caird coinheringaahing

@cairdcoinheringaahing ข้อผิดพลาดเล็กน้อยในด้านของฉันควรได้รับBและคำอธิบายจะถูกเพิ่ม
steenbergh

2

เยลลี่ 10 ไบต์

“;⁾vṾƓẇ”vṾ

ลองออนไลน์!

มันทำงานอย่างไร

“;⁾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

จูเลีย 72 ไบต์

ตอนนี้ฉันเข้าใจสิ่งที่ผู้คนหมายถึงเมื่อพวกเขาพูดว่าปัญหาควินินเป็นเพียงรูปแบบที่แตกต่างกันในแบบคลาสสิก

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

คำอธิบาย

#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 ไบต์

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

การปรับเปลี่ยนของการเริ่มต้น โดยการเพิ่ม0"D34çý"D34çý

ลองออนไลน์

คำอธิบาย:

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.