Quante volte dovrai giocare a golf a quine?


12

Per questa sfida, è necessario creare un programma che accetta un numero intero xe genera la sua fonte xmolte volte.

Regole

  • Questo è codegolf, l'obiettivo è quello di golf il tuo programma per avere il minor numero di byte

  • Se si invia una funzione, la funzione deve assumere xcome parametro e restituire o stampare più volte l'intero codice xsu STDOUT. Anche il corpo della funzione non deve essere vuoto

  • Se si invia un lambda, non è necessario assegnarlo a una variabile

  • Si applicano le restrizioni standard sulle scappatoie .

  • I programmi vuoti sono vietati

  • Il tuo programma deve funzionare solo quando xun intero intero è maggiore o uguale a 0

  • Il tuo programma potrebbe anche non leggere direttamente nessuna parte del suo codice sorgente


Bella prima domanda
Bald Bantha,

Può xessere 0o possiamo limitarlo a numeri interi positivi?
mbomb007,

È consentita la lettura della fonte della nostra funzione?
Shaggy,

@ mbomb007, ho fatto una modifica per chiarire le regole, xforse un intero intero più grande o uguale a 0
Dignissimus - Spammy,

@Shaggy, ho pensato che fosse una scappatoia standard, sembra che non lo fosse. Ho apportato una modifica alla domanda per affermare chiaramente che un programma potrebbe non leggere alcuna parte della parte del suo codice sorgente
Dignissimus - Spammy,

Risposte:


8

Python 2 , 50 byte

Nota la virgola finale e la nuova riga.

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

Provalo online!


@ mbomb007 Supponiamo che alla fine del codice sia presente una nuova riga. Problema risolto.
MD XF,

L'OP ha affermato che x può essere zero, nel qual caso non dovrebbe essere stampato nulla, quindi questa risposta è errata.
mbomb007,

@NickA No, stampa una nuova riga, che è errata.
mbomb007,

0 non sembra stampare una nuova riga per me, come testato usando sys.stdout.write("2")dopo di esso.
Ørjan Johansen,

5

Japt , 14 byte

"iQ ²pU"iQ ²pU

Provalo online!

Spiegazione

"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 byte

{`{.*¶}{

RPine N2 Loop Quine funziona particolarmente bene per questo!

{     } # 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.

Provalo online!


4

Mathematica, 40 33 byte

Grazie a lanlock4 per aver salvato 7 byte!

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

Funzione pura che accetta un argomento intero non negativo. ToString[#0]è il modo standard di Mathematica per accedere alla definizione della funzione pura corrente; StringRepeat[..., #1]concatena (input) copie di quella stringa insieme. Per esempio,

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

rendimenti:

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

Potresti pubblicare un esempio di utilizzo? L'esecuzione, ad esempio , StringJoin @@ Table[ToString[#0], #1] & [2]mi dà un errore.
Julian Wolf,

Veramente? Quella chiamata esatta funziona per me. Sto usando Mathematica 11 ....
Greg Martin,

Hmm, sto ancora usando 10 (v10.0.1.0) - potrebbe essere. Per riferimento, ecco l'errore che ottengo:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf,

Ah, ho scoperto che Table[x,5]tornerà {x,x,x,x,x}in Mathematica 10.2 e oltre, ma in Mathematica 10.1 dà un tale errore (si aspetta Table[x,{5}]).
Greg Martin,

Penso che puoi sostituirlo StringJoin @@ Tablecon StringRepeat.
Non un albero


3

dc , 31 byte

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

Provalo online!

Spiegazione:

[[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 byte

Questa soluzione funziona se x=0. C'è una sola nuova riga finale.

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

Provalo online


Python 2, 60 byte (non valido)

Ciò presuppone che x>=1, ma l'OP ha chiarito che xpuò essere zero. C'è una sola nuova riga finale.

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

Provalo online


2

Sottocarico , 12 byte

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

Provalo online!

Invio di funzioni, perché Underload non ha altro modo per ricevere input. (Il collegamento TIO mostra il numero 4 indicato come input e aggiunge il codice per stampare l'output risultante).

Questo è solo un costruttore universale di quine (a(:^)*):^, più ~^("fai un numero di copie uguale all'argomento").



1

Gelatina , 10 byte

“;⁾vṾẋɠ”vṾ

Provalo online!

Come funziona

“;⁾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
Sembra delizioso, ma mia mamma mi ha sempre detto di non mettere in bocca cose strane.
Mateen Ulhaq,

1

GNU Make , 49 byte

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

Make unirà le copie di un singolo spazio, quindi devo includere il carattere di spazio aggiuntivo alla fine e rimuoverlo con una via stripdi mezzo per seguire fedelmente il requisito.


Sembra che legga il codice sorgente, che è sia per impostazione predefinita che esplicitamente vietato.
Ørjan Johansen,

@ ØrjanJohansen No, non legge la fonte, legge un valore variabile. È esattamente lo stesso principio delle altre risposte, ad esempio JS o Python.
eush77,

@ ØrjanJohansen Oh, capisco. $0nelle funzioni Make non è la stessa cosa delle shell. È il nome della variabile come viene chiamata la funzione. Vedi gnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77

Sospira una zona così grigia. A proposito, quelli di Python non lo fanno.
Ørjan Johansen,

@ ØrjanJohansen Direi che questa risposta è molto più vicina a quella di Python che a quella di JS. Tutto callciò che sta facendo è sostituire $0e $1con parametri reali: è una semplice interpolazione di stringhe, proprio come quella di Python %.
eush77,

1

Pyth, 17 byte

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

Provalo online!

Ampia estensione del jN*2]"jN*2]quine piuttosto noto , ma probabilmente può essere giocato a golf


1

Betaload , 203 byte

Newline aggiunti per chiarezza:

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

Mi sono dato la restrizione che deve leggere da STDIN piuttosto che dall'alto dello stack come farebbe normalmente una risposta di sottocarico. Ho anche usato un input decimale corretto, che costituisce la maggior parte del codice.

Spiegazione:

Avvolgo il programma in un involucro di quine: (a(:^)*e ):^. Ciò significa che tutto il codice all'interno del wrapper quine avrà il codice sorgente del programma nella parte inferiore dello stack.

Per convertire le cifre in un normale numero della Chiesa, utilizzo la tecnica di sostituzione di ogni cifra con il codice per moltiplicare per 10 e aggiungere quella cifra:

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

C'è molta ripetizione qui, quindi impacchettiamolo in un sottoprogramma che prenderà un numero Church dalla cima dello stack e lo useremo per costruire la "stringa di cifre:"

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

Ho inserito questo in un nuovo ambiente in modo che sia possibile accedervi rapidamente:

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

Ora posso creare il codice di sostituzione per R. Rutilizza gli elementi principali dello stack per formare una tabella di ricerca per sostituire una stringa da STDIN con il codice Betaload. Funziona così:

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

Tuttavia, possiamo usare il sottoprogramma che abbiamo appena creato per generare i segmenti di codice:

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

Quando Rviene eseguito, trasformerà l'input in una serie di sottoprogrammi che costruiscono un numero di Church. Quando questo sottoprogramma viene eseguito, crea quel numero Church sull'elemento successivo nella pila (0, che è stato posizionato in basso). Ciò significa che, dopo R^, il valore più alto nella pila sarà il numero della Chiesa. Abbiamo quindi ancora ^una volta di applicare il numero Church all'elemento finale nello stack (il codice sorgente del programma) per ottenere la risposta.

Curiosità: ho avuto il MD per questa presentazione per diversi mesi. L'avevo tenuto dopo aver frainteso una domanda (che non riesco più a trovare). Ho dovuto scavarlo dal mio cestino per pubblicarlo qui.



1

Python 2 , 41 byte

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

Provalo online!

Fa un po 'hacky uscita utilizzando inputal posto di print, dal momento che printha uno strano bug che coinvolge la stampa di un ritorno a capo quando non dovrebbe ... . Esce con un errore EOF.

Spiegazione:

_="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 byte

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

\47è la fuga ottale per una singola citazione ( '). Viene interpretato tra virgolette doppie ( "), ma non tra virgolette singole.


0

Javascript ES6, 27 37 byte

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

modificare

+10 byte se f=devono essere visualizzati anche


f=

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

f(2);


@Downvoter perché?
Weedoze,

@Kaiido Non lo so .. Devo tenere il f=?
Weedoze,

Il codice si sta leggendo richiamando implicitamente toStringla funzione.
aebabis,

@acbabis Calling f.toString()o fè lo stesso ma non mostrerà il nome della funzione
Weedoze

Credo che il significato di @acbabis sia che viola l'ultimo punto della sfida "Il tuo programma potrebbe anche non leggere direttamente nessuna parte del suo codice sorgente", usando fquesto modo si riferisce alla propria fonte.
skyline3000,

0

CJam , 20 12 byte

8 byte salvati grazie a Martin Ender

{"_~"+ri*}_~

Provalo online!

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 byte

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

Provalo online!

Non è affatto da golf, come tendono ad esserlo i b64.


0

Vai , 257 254 byte

Questo mi fa male.

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

Provalo online!


0

Microscript II, 22 byte:

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

Microscript II, 20 byte (ma tecnicamente non valido in quanto accede al codice sorgente di un blocco di codice):

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

0

C, 144 116 byte

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 byte

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


0

05AB1E , 17 byte

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

Modifica del predefinito 0"D34çý"D34çýaggiungendo ×?.

Provalo online.

Spiegazione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.