Est-ce une sous-chaîne d'elle-même?


21

Étant donné une chaîne, indiquez si la chaîne est une sous-chaîne du code source du programme.

Les règles de quine standard s'appliquent, ce qui signifie que vous ne pouvez pas lire votre propre code source. La longueur de l'entrée est garantie inférieure ou égale à la durée du programme. Vous pouvez renvoyer deux valeurs distinctes, pas nécessairement des valeurs véridiques et falsey. Vous pouvez également soumettre une fonction, plutôt qu'un programme complet.

C'est un donc le code le plus court gagne!

Un exemple

Si votre code source l'est print(input() = False), il doit renvoyer True for nt(imais False for tupn.



2
@totallyhuman comme avec la plupart des défis, oui.
caird coinheringaahing


10
@StanStrum Ce n'est pas pour signaler les doublons, c'est pour montrer les défis connexes qui pourraient intéresser les gens et pour les montrer dans la barre latérale à droite.
totalement humain

1
L'entrée peut-elle être vide? (En fait, le code peut-il être vide?)
Lynn

Réponses:



6

JavaScript , 25 octets

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

Essayez-le en ligne!

Personnellement, je ne suis pas fan de cela, mais c'est permis .

Solution alternative (non valide?), 19 octets

Cela prend l'entrée comme une expression régulière.

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

Essayez-le en ligne!


Ne se lit-il pas?
Adám


Quel est le but de mentionner explicitement (Node.js)? Cela ne fonctionne-t-il pas aussi dans les navigateurs?

@ThePirateBay Fonctionne comme prévu dans Chrome.
steenbergh

1
Vous pensez bien à l'avenir, c'est juste à partir du modèle TIO. : P
totalement humain

5

Java 8, 124 112 octets (fonction)

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

Essayez-le ici.


Le voici en tant que programme complet à la place (pour voir l'une des raisons pour lesquelles les fonctions sont autorisées sur PPCG, car certains langages, comme Java, nécessitent un code passe-partout obligatoire très détaillé pour les programmes complets).

Java 8, 226 214 octets (programme complet)

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

Essayez-le ici.


Explication:

  • Le String scontient le code source non formaté.
  • %sest utilisé pour entrer cette chaîne en elle-même avec le s.format(...).
  • %c, %1$cEt 34sont utilisés pour formater les guillemets doubles.
  • s.format(s,34,s) met tout cela ensemble.

Et .contains(...)est ensuite utilisé pour vérifier si ce code source contient l'entrée donnée.


Cela me donne la vérité pour toutes les chaînes lorsque je "l'essaie en ligne".
MichaelK

1
@MichaelKarnerfors pas pour moi ... Êtes-vous sûr de ne pas ajouter d'arguments à chaque fois? Un seul argument est utilisé. Vous devez exécuter le programme en changeant l'argument chaque fois que vous effectuez un nouveau test.
Olivier Grégoire

@ OlivierGrégoire Vous avez raison, j'ai mal utilisé la page TIO. Merci. :)
MichaelK

3

Bash, 43 , 28 octets

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

essayez-le en ligne


Je ne connais pas Bash, mais cela peut-il être approfondi en supprimant une grande partie de l'espace blanc?
caird coinheringaahing

@cairdcoinheringaahing Je ne pense pas, typesetformate-le comme ceci AFAICT. Essayez-le en ligne!
Erik the Outgolfer

mais peut être amélioré peut-être en utilisant une autre technique
Nahuel Fouilleul

vient de trouver une autre solution
Nahuel Fouilleul

Que fait $1-il?
caird coinheringaahing

2

Haskell , 92 octets

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

Essayez-le en ligne! Extension évidente du quine standard. Se débarrasser de l'importation serait bien, mais je doute qu'il isInfixOfpuisse être calculé en un nombre d'octets plus court.



2

QBIC , 28 octets

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

Ceci affiche 0 si l'entrée n'est pas une sous-chaîne de la source, et X sinon où X est le (premier) index de la sous-chaîne.

Explication

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

#définit un littéral de chaîne dans QBIC et l'affecte à la première variable de chaîne disponible. C'est B$dans ce programme, car A$est déjà pris par ;(lire une chaîne de la ligne cmd). Ensuite, tout jusqu'au délimiteur est introduit dans le littéral; le délimiteur est un backtick - ce qui en fait également le seul caractère ASCII non inclus dans les lits de chaînes. Dans ce cas, QBIC n'a pas besoin d'un backtick, car le littéral est terminé à la fin du code par la fonction de fermeture automatique de QBIC. Pour plus d'informations sur les littéraux QBIC, consultez le fil de discussion .


Qu'est- Ace que c'est dans ce contexte?
caird coinheringaahing

@cairdcoinheringaahing une petite erreur de mon côté, aurait dû l'être Bet une explication est ajoutée.
steenbergh

2

Gelée , 10 octets

“;⁾vṾƓẇ”vṾ

Essayez-le en ligne!

Comment ça marche

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

Je comprends maintenant ce que les gens veulent dire quand ils disent que les problèmes de quine ne sont que des variations de la quine classique.

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

Explication

#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 octets

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

Modification du 0"D34çý"D34çý par défaut en ajoutant .

Essayez-le en ligne.

Explication:

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.