Combien de fois devrez-vous jouer au golf à quine?


12

Pour ce défi, vous devez créer un programme qui prend un entier xet génère xplusieurs fois sa source .

Règles

  • Ceci est du codegolf, le but est de jouer à votre programme pour avoir le moins d'octets

  • Si vous soumettez une fonction, la fonction doit prendre xcomme paramètre et retourner ou imprimer xplusieurs fois l'intégralité de votre code à STDOUT. Le corps de la fonction ne doit pas non plus être vide

  • Si vous soumettez un lambda, il n'est pas nécessaire que vous l'attribuiez à une variable

  • Des restrictions standard contre les échappatoires s'appliquent.

  • Les programmes vides sont interdits

  • Votre programme ne doit fonctionner que si xun entier entier est supérieur ou égal à 0

  • Votre programme peut également ne lire directement aucune partie de son code source


Belle première question
Bald Bantha

Peut- xêtre 0, ou pouvons-nous le limiter à des entiers positifs?
mbomb007

La lecture de la source de notre fonction est-elle autorisée?
Shaggy

@ mbomb007, j'ai fait une modification pour clarifier les règles, xpeut - être n'importe quel entier entier supérieur ou égal à 0
Dignissimus - Spammy

@Shaggy, je pensais que c'était une échappatoire standard, il semble que ce ne soit pas le cas. J'ai apporté une modification à la question pour indiquer clairement qu'un programme ne peut lire aucune partie de la partie de son code source
Dignissimus - Spammy

Réponses:


8

Python 2 , 50 octets

Notez la virgule de fin et la nouvelle ligne.

s='s=%r;print s%%s*input(),\n';print s%s*input(),

Essayez-le en ligne!


@ mbomb007 Supposons qu'il y ait une nouvelle ligne à la fin du code. Problème résolu.
MD XF

L'OP a dit que x peut être zéro, auquel cas rien ne devrait être imprimé, donc cette réponse est fausse.
mbomb007

@NickA Non, il imprime une nouvelle ligne, ce qui est faux.
mbomb007

0 ne semble pas m'imprimer une nouvelle ligne, comme testé en utilisant sys.stdout.write("2")après.
Ørjan Johansen

5

Japt , 14 octets

"iQ ²pU"iQ ²pU

Essayez-le en ligne!

Explication

"iQ ²pU"iQ ²pU
"iQ ²pU"       # Take this string
        iQ     # Prepend a quote
           ²   # Double the string (= source code)
            pU # Duplicate input times

4

RProgN 2 , 8 octets

{`{.*¶}{

La quine RProgN2 Loop fonctionne particulièrement bien pour cela!

{     } # A function literal
       {# Without a matching }, this loops back to the second instruction, which essentially runs the function. This is a bug, but it works to make the "Looping Quine".
 `{.    # Append the literal {, stringifying the function.
    *   # Multiply the stringified function by the input.
     ¶  # Terminate the program.

Essayez-le en ligne!


4

Mathematica, 40 33 octets

Merci à lanlock4 pour avoir économisé 7 octets!

StringRepeat[ToString[#0], #1] & 

Fonction pure prenant un argument entier non négatif. ToString[#0]est la méthode standard de Mathematica pour accéder à la définition de la fonction pure actuelle; StringRepeat[..., #1]concatène (entrée) des copies de cette chaîne ensemble. Par exemple,

StringRepeat[ToString[#0], #1] & [2]

rendements:

StringRepeat[ToString[#0], #1] & StringRepeat[ToString[#0], #1] & 

Pourriez-vous publier un exemple d'utilisation? La course, par exemple , StringJoin @@ Table[ToString[#0], #1] & [2]me donne une erreur.
Julian Wolf

Vraiment? Cet appel exact fonctionne pour moi. J'utilise Mathematica 11 ....
Greg Martin

Hmm, j'utilise toujours 10 (v10.0.1.0) - ça pourrait être ça. Pour référence, voici l'erreur que j'obtiens:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf

Aha — je découvre que Table[x,5]cela reviendra {x,x,x,x,x}dans Mathematica 10.2 et au-delà, mais dans Mathematica 10.1 cela donne une telle erreur (il s'attend Table[x,{5}]).
Greg Martin

Je pense que vous pouvez remplacer StringJoin @@ Tablepar StringRepeat.
Pas un arbre


3

dc , 31 octets

[[1-rd91Pn93P[dx]Pdx]s.rd0<.]dx

Essayez-le en ligne!

Explication:

[[1-rd91Pn93P[dx]Pdx]s.rd0<.]dx
[     91Pn93P[dx]P          ]dx  # Same old regular quine
 [1-rd            dx]s.rd0<.     # Loop until the counter is zero

3

Python 2, 70 octets

Cette solution fonctionne si x=0. Il existe une seule nouvelle ligne de fin.

s='s=%r;exec"print%%r;"%%(s%%s)*input()';exec"print%r;"%(s%s)*input()

Essayez-le en ligne


Python 2, 60 octets (invalide)

Cela suppose que x>=1, mais le PO a précisé que cela xpeut être zéro. Il existe une seule nouvelle ligne de fin.

s='s=%r;print(s%%s*input())[:-1]\n';print(s%s*input())[:-1]

Essayez-le en ligne


2

Sous-charge , 12 octets

(a(:^)*~^):^

Essayez-le en ligne!

Soumission de la fonction, car Underload n'a pas d'autre moyen de saisir des données. (Le lien TIO affiche le numéro 4 donné en entrée et ajoute du code pour imprimer la sortie résultante).

Ceci est juste un constructeur de quine universel (a(:^)*):^, plus ~^("faire un nombre de copies égal à l'argument").



1

Gelée , 10 octets

“;⁾vṾẋɠ”vṾ

Essayez-le en ligne!

Comment ça fonctionne

“;⁾vṾẋɠ”vṾ  Main link. No arguments.

“;⁾vṾẋɠ”    Set the argument and the return value to the string ';⁾vṾẋɠ'.
         Ṿ  Uneval; yield '“;⁾vṾẋɠ”'.
        v   Eval ';⁾vṾẋɠ' with argument '“;⁾vṾẋɠ”'.
  ⁾vṾ           Yield 'vṾ'.
 ;              Concatenate '“;⁾vṾẋɠ”' and 'vṾ', yielding the source code.
      ɠ         Read an integer from STDIN.
     ẋ          Repeat the source code that many times.

4
Cela a l'air délicieux, mais ma maman m'a toujours dit de ne pas mettre de choses étranges dans ma bouche.
Mateen Ulhaq

1

Marque GNU , 49 octets

$(foreach ,$(shell seq $1),$(strip $(value $0))) 

Make joindra les copies par un seul espace, donc je dois inclure le caractère d'espace supplémentaire à la fin et le supprimer avec un stripentre afin de suivre fidèlement l'exigence.


On dirait qu'il lit le code source, qui est à la fois par défaut et explicitement interdit.
Ørjan Johansen

@ ØrjanJohansen Non, il ne lit pas la source, il lit une valeur variable. C'est exactement le même principe que dans d'autres réponses, prenez par exemple JS ou Python.
eush77

@ ØrjanJohansen Oh, je vois. $0dans les fonctions Make n'est pas la même chose que dans les shells. C'est le nom de la variable sous laquelle la fonction est appelée. Voir gnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77

Soupire une telle zone grise. BTW, les Python ne font pas ça.
Ørjan Johansen

@ ØrjanJohansen Je dirais que cette réponse est beaucoup plus proche de Python que de JS. Tout callce que vous faites est de remplacer $0et $1avec des paramètres réels - c'est une simple interpolation de chaînes, tout comme celle de Python %.
eush77

1

Pyth, 17 octets

j*]jN*2]"j*]jN*2]

Essayez-le en ligne!

Extension triviale au jN*2]"jN*2]quine assez bien connu , mais peut probablement être joué au golf


1

Betaload , 203 octets

Ajout de nouvelles lignes pour plus de clarté:

(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^

Je me suis donné la restriction qu'il doit lire depuis STDIN plutôt que depuis le haut de la pile comme le ferait généralement une réponse Underload. J'ai également utilisé une entrée décimale appropriée, qui constitue la majeure partie du code.

Explication:

J'emballe le programme dans une enveloppe quine: (a(:^)*et ):^. Cela signifie que tout le code à l'intérieur du wrapper quine aura le code source du programme au bas de la pile.

Afin de convertir les chiffres en un chiffre d'église normal, j'utilise la technique de remplacement de chaque chiffre par le code pour multiplier par 10 et ajouter ce chiffre:

0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*

Il y a beaucoup de répétitions ici, alors empaquetons-le dans un sous-programme qui prendra un chiffre Church du haut de la pile et l'utilisera pour construire la "chaîne de chiffres:"

:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*

Je mets cela dans un nouvel environnement afin qu'il soit accessible rapidement:

#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>

Maintenant, je peux créer le code de remplacement pour R. Rutilise les éléments supérieurs de la pile pour former une table de recherche pour remplacer une chaîne de STDIN par du code Betaload. Cela fonctionne comme ceci:

()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R

Cependant, nous pouvons utiliser le sous-programme que nous venons de créer pour générer les segments de code:

(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...

Lorsqu'il Rest exécuté, il transformera l'entrée en une série de sous-programmes qui construisent un chiffre d'église. Lorsque ce sous-programme est exécuté, il crée ce chiffre d'église sur l'élément suivant de la pile (0, qui a été placé plus tôt). Cela signifie que, après R^, la valeur la plus élevée sur la pile sera le chiffre de l'Église. Nous avons ensuite ^une fois de plus pour appliquer le chiffre de l'Église au dernier élément de la pile (le code source du programme) pour obtenir la réponse.

Fait amusant: j'ai le MD de cette soumission depuis plusieurs mois. Je l'avais gardé après avoir mal compris une question (que je n'arrive plus à trouver). J'ai dû le déterrer de ma corbeille pour le poster ici.



1

Python 2 , 41 octets

_="input('_=%r;exec _'%_*input())";exec _

Essayez-le en ligne!

Est -ce une sortie un peu hacky en utilisant au inputlieu de print, car printa un bug bizarre impliquant l' impression d' un saut de ligne quand il est pas censé ... . Quitte avec une erreur EOF.

Explication:

_="input('_=%r;exec _'%_*input())"; # Set _ to a string
exec _                              # Execute that string
input(                        )     # "print"
      '_=%r;exec _'%_               # The source code with _ formatted in
                     *input()       # Actual input many times



0

Perl, 48 octets

print"$_\47"x(2*pop)for'print"$_\47"x(2*pop)for'

\47est l'échappement octal pour une seule citation ( '). Il est interprété entre guillemets doubles ( "), mais pas entre guillemets simples.


0

Javascript ES6, 27 37 octets

_=>alert(`${f.name}=${f}`.repeat(_))

Éditer

+10 octets si f=devrait également être affiché


f=

_=>alert(`${f.name}=${f}`.repeat(_))

f(2);


@Downvoter pourquoi?
Weedoze

@Kaiido Je ne sais pas .. Dois-je garder le f=?
Weedoze

Votre code se lit lui-même en appelant implicitement toStringla fonction.
aebabis

@acbabis Appel f.toString()ou fest le même mais il n'affichera pas le nom de la fonction
Weedoze

Je crois que ce que @acbabis voulait dire, c'est qu'il viole le dernier point du défi "Votre programme peut également ne lire directement aucune partie de son code source" - utiliser de fcette façon fait référence à sa propre source.
skyline3000

0

CJam , 20 12 octets

8 octets économisés grâce à Martin Ender

{"_~"+ri*}_~

Essayez-le en ligne!

Exaplanation

{       e# Begin a block literal:
 "_~"+  e#  Add whatever's on the stack to the beginning of the array ['_', '~'].
 ri*    e#  Repeat the resulting array a number of times equal to the input.
}       e# Close the block. Push it on the stack.
_~      e# Copy it and run it.

0

PHP, 194 octets

<?php $a="PD9waHAgJGE9IiMiOyRpPSRhcmd2WzFdO3doaWxlKCRpLS0pZWNobyBzdHJfcmVwbGFjZShjaHIoMzUpLCRhLGJhc2U2NF9kZWNvZGUoJGEpKTs=";$i=$argv[1];while($i--)echo str_replace(chr(35),$a,base64_decode($a));

Essayez-le en ligne!

Pas du tout golfique, comme les quines b64 ont tendance à l'être.


0

Aller , 257 254 octets

Cela me fait mal.

package main;import(."fmt";."strings";."strconv";."os");func main(){s:="package main;import(.\"fmt\";.\"strings\";.\"strconv\";.\"os\");func main(){s:=%q;n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}";n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}

Essayez-le en ligne!


0

Microscript II, 22 octets:

"v{lqp}sN*h"v{lqp}sN*h

Microscript II, 20 octets (mais techniquement invalide car il accède au code source d'un bloc de code):

{s""+`"~sN*"s`+}~sN*

0

C, 144 116 octets

i;main(a){for(i=getchar()-48;i--;)printf(a="i;main(a){for(i=getchar()-48;i--;)printf(a=%c%s%c,34,a,34);}",34,a,34);}

0

Python 3, 69 octets

s='s=%r\nx=int(input())\nprint(s%%s*x)\n'
x=int(input())
print(s%s*x)


0

05AB1E , 17 octets

0"D34çý×?"D34çý×?

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

Essayez-le en ligne.

Explication:

0                   # Push 0 to the stack
                    #  STACK: [0]
 "D34çý×?"          # Push the string 'D34çý×?' to the stack
                    #  STACK: [0, 'D34çý×?']
          D         # Duplicate this string
                    #  STACK: [0, 'D34çý×?', 'D34çý×?']
           34ç      # Push '"' to the stack
                    #  STACK: [0, 'D34çý×?', 'D34çý×?', '"']
              ý     # Join the stack by this '"' delimiter
                    #  STACK: ['0"D34çý×?"D34çý×?']
               ×    # Repeat the string the (implicit) input amount of times
                    #  input = 2 → STACK: ['0"D34çý×?"D34çý×?0"D34çý×?"D34çý×?']
                ?   # Output to STDOUT without trailing newline
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.