Czy to podciąg sam w sobie?


21

Podany ciąg znaków zwraca, czy ciąg jest podciągiem kodu źródłowego programu.

Obowiązują standardowe zasady quine, co oznacza, że ​​nie możesz odczytać własnego kodu źródłowego. Gwarantowana długość wejścia jest mniejsza lub równa długości programu. Możesz zwrócić dowolne dwie różne wartości, niekoniecznie prawdziwe i fałszywe. Możesz również przesłać funkcję zamiast pełnego programu.

To jest więc wygrywa najkrótszy kod!

Przykład

Jeśli twój kod źródłowy to print(input() = False), powinien zwracać wartość True dla, nt(iale False dla tupn.



2
@ totalniehuman, jak w przypadku większości wyzwań, tak.
caird coinheringaahing


10
@StanStrum Nie chodzi o wskazywanie duplikatów, ma na celu pokazanie powiązanych wyzwań, którymi ludzie mogą być zainteresowani, i pokazanie ich na pasku bocznym po prawej stronie.
całkowicieludzki

1
Czy dane wejściowe mogą być puste? (W rzeczywistości, czy kod może być pusty?)
Lynn

Odpowiedzi:



6

JavaScript , 25 bajtów

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

Wypróbuj online!

Osobiście nie jestem fanem tego, ale jest to dozwolone .

Alternatywne (nieprawidłowe?) Rozwiązanie, 19 bajtów

Pobiera to dane wejściowe jako wyrażenie regularne.

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

Wypróbuj online!


Czy to nie czyta się?
Adám


Jaki jest cel wyraźnego wspominania (Node.js)? Czy to też nie działa w przeglądarkach?

@ThePirateBay Działa zgodnie z oczekiwaniami w Chrome.
steenbergh

1
Myślicie naprzód, to tylko szablon TIO. : P
totalnie ludzki,

5

Java 8, 124 112 bajtów (funkcja)

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

Wypróbuj tutaj.


Oto pełny program (aby zobaczyć jeden z powodów, dla których funkcje są dozwolone w PPCG, ponieważ niektóre języki, takie jak Java, wymagają bardzo pełnego obowiązkowego kodu pełnego dla pełnych programów).

Java 8, 226 214 bajtów (pełny program)

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

Wypróbuj tutaj.


Wyjaśnienie:

  • String sZawiera kod źródłowy niesformatowany.
  • %ssłuży do wprowadzania tego ciągu do siebie za pomocą s.format(...).
  • %c, %1$ci 34służą do formatowania podwójnych cudzysłowów.
  • s.format(s,34,s) łączy to wszystko.

A następnie .contains(...)służy do sprawdzenia, czy ten kod źródłowy zawiera dane wejściowe.


To daje mi prawdę dla wszystkich ciągów, gdy „Wypróbuj online”.
MichaelK

1
@MichaelKarnerfors nie dla mnie ... Czy na pewno nie dodajesz argumentów za każdym razem? Używany jest tylko jeden argument. Musisz uruchomić program zmieniając argument za każdym razem, gdy wykonujesz nowy test.
Olivier Grégoire,

@ OlivierGrégoire Masz rację, źle użyłem strony TIO. Dziękuję Ci. :)
MichaelK

3

Bash, 43 , 28 bajtów

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

spróbuj online


Nie znam Basha, ale czy można to pograć w golfa, usuwając spację?
caird coinheringaahing

@cairdcoinheringaahing Nie sądzę, typesetformatuje to w ten sposób AFAICT. Wypróbuj online!
Erik the Outgolfer

ale może zostać ulepszony może przy użyciu innej techniki
Nahuel Fouilleul

właśnie znalazłem inne rozwiązanie
Nahuel Fouilleul

Co ma $1zrobić?
caird coinheringaahing

2

Haskell , 92 bajty

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

Wypróbuj online! Oczywiste rozszerzenie standardowego quine. Pozbycie się importu byłoby przyjemne, ale wątpię, czy isInfixOfmożna go obliczyć w krótszej ilości bajtów.



2

QBIC , 28 bajtów

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

Wyświetla 0, jeśli dane wejściowe nie są podłańcuchem źródła, a X w przeciwnym razie gdzie X jest (pierwszym) indeksem podłańcucha.

Wyjaśnienie

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

#definiuje literał łańcucha w QBIC i przypisuje go do pierwszej dostępnej zmiennej łańcucha. To jest B$w tym programie, ponieważ A$jest już zajęty przez ;(przeczytaj ciąg z linii cmd). Następnie wszystko, aż do ogranicznika, jest wprowadzane do literału; ogranicznik jest znakiem wstecz - co sprawia, że ​​jest to jedyny znak ASCII, którego nie można włączyć w ciągach znaków. W tym przypadku QBIC nie potrzebuje znaku wstecz, ponieważ literał jest kończony na końcu kodu przez funkcję automatycznego zamykania QBIC. Aby uzyskać więcej informacji na temat literałów QBIC, zobacz wątek Prezentacja .


Co jest Aw tym kontekście?
caird coinheringaahing

@cairdcoinheringaahing mały błąd po mojej stronie, powinien być Bi wyjaśnienie zostało dodane.
steenbergh

2

Galaretka , 10 bajtów

“;⁾vṾƓẇ”vṾ

Wypróbuj online!

Jak to działa

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

Teraz rozumiem, co ludzie mają na myśli, gdy mówią, że problemy z quine to tylko wariacje na temat klasycznego quine.

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

Wyjaśnienie

#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 bajtów

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

Modyfikacja domyślnego 0"D34çý"D34çý przez dodanie .

Wypróbuj online.

Wyjaśnienie:

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.