Quantas vezes você terá que jogar uma taine?

12

Para esse desafio, você deve criar um programa que utilize um número inteiro xe produza sua fonte xvárias vezes.

Regras

  • Este é um codegolf, o objetivo é jogar golfe no seu programa para ter a menor quantidade de bytes

  • Se você enviar uma função, ela deve assumir xcomo parâmetro e retornar ou imprimir todo o seu código xvárias vezes para STDOUT. O corpo da função também não deve estar vazio

  • Se você enviar um lambda, não será necessário atribuí-lo a uma variável

  • Aplicam-se restrições de brecha padrão .

  • Programas vazios são proibidos

  • Seu programa só precisa funcionar quando xum número inteiro inteiro é maior ou igual a 0

  • Seu programa também pode não ler diretamente nenhuma parte do código-fonte

Dignissimus - Spammy
fonte
Primeira pergunta agradável
Bald Bantha
Pode xser 0, ou podemos restringi-lo a números inteiros positivos?
Mbomb007
É permitida a leitura da fonte de nossa função?
Shaggy
@ mbomb007, eu fiz uma edição para clarificar as regras, xtalvez qualquer número inteiro maior ou igual a 0
Dignissimus - Spammy
@ Shagy, eu pensei que era uma brecha padrão, parece que não era. Eu fiz uma edição para a pergunta a indicar claramente que um programa pode não ler qualquer parte da parte de seu código-fonte
Dignissimus - Spammy

Respostas:

8

Python 2 , 50 bytes

Observe a vírgula à direita e a nova linha.

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

Experimente online!

totalmente humano
fonte
@ mbomb007 Suponha que haja uma nova linha no final do código. Problema resolvido.
MD XF
O OP disse que x pode ser zero; nesse caso, nada deve ser impresso; portanto, esta resposta está errada.
Mbomb007
@NickA Não, ele imprime uma nova linha, o que está errado.
Mbomb007
0 não parece imprimir uma nova linha para mim, conforme testado usando sys.stdout.write("2")depois dela.
Ørjan Johansen
5

Japonês , 14 bytes

"iQ ²pU"iQ ²pU

Experimente online!

Explicação

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

RProgN 2 , 8 bytes

{`{.*¶}{

A solução RProgN2 Loop funciona particularmente bem para isso!

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

Experimente online!

ATaco
fonte
4

Mathematica, 40 33 bytes

Obrigado ao lanlock4 por economizar 7 bytes!

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

Função pura usando um argumento inteiro não negativo. ToString[#0]é a maneira padrão do Mathematica de acessar a definição atual da função pura; StringRepeat[..., #1]concatena (entrada) cópias dessa sequência juntas. Por exemplo,

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

rendimentos:

StringRepeat[ToString[#0], #1] & StringRepeat[ToString[#0], #1] & 
Greg Martin
fonte
Você poderia postar um exemplo de uso? Correr, por exemplo , StringJoin @@ Table[ToString[#0], #1] & [2]me dá um erro.
Julian Lobo
Verdade? Essa ligação exata funciona para mim. Estou usando o Mathematica 11 ....
Greg Martin
Hmm, ainda estou usando 10 (v10.0.1.0) - pode ser isso. Para referência, aqui está o erro que recebo:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf
Aha - eu descubro que Table[x,5]retornará {x,x,x,x,x}no Mathematica 10.2 e além, mas no Mathematica 10.1 ele gera esse erro (espera Table[x,{5}]).
Greg Martin
Eu acho que você pode substituir StringJoin @@ Tablepor StringRepeat.
Não é uma árvore
3

dc , 31 bytes

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

Experimente online!

Explicação:

[[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
eush77
fonte
3

Python 2, 70 bytes

Esta solução funciona se x=0. Há uma nova linha final à direita.

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

Experimente online


Python 2, 60 bytes (inválido)

Isso pressupõe isso x>=1, mas o OP esclareceu que xpode ser zero. Há uma nova linha final à direita.

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

Experimente online

mbomb007
fonte
2

Subcarga , 12 bytes

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

Experimente online!

Envio de função, porque o Underload não tem outra maneira de receber entrada. (O link TIO mostra o número 4 fornecido como entrada e adiciona código para imprimir a saída resultante).

Este é apenas um construtor universal de quine (a(:^)*):^, mais ~^("faça um número de cópias igual ao argumento").


fonte
1

Gelatina , 10 bytes

“;⁾vṾẋɠ”vṾ

Experimente online!

Como funciona

“;⁾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.
Dennis
fonte
4
Parece delicioso, mas minha mãe sempre me disse para não colocar coisas estranhas na minha boca.
Mateen Ulhaq
1

Marca GNU , 49 bytes

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

O Make juntará as cópias em um único espaço, por isso preciso incluir o caractere de espaço adicional no final e removê-lo com um stripintervalo para seguir fielmente o requisito.

eush77
fonte
Parece que ele lê o código-fonte, que é por padrão e explicitamente proibido.
Ørjan Johansen
@ ØrjanJohansen Não, não lê a fonte, lê um valor variável. É exatamente o mesmo princípio que em outras respostas, por exemplo, JS ou Python.
Eush77 19/05
@ ØrjanJohansen Oh, entendo. $0nas funções Make não é a mesma coisa que nas conchas. É o nome da variável que a função é chamada como. Veja gnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77
Suspire uma área tão cinzenta. BTW, os Python não fazem isso.
Ørjan Johansen
@ ØrjanJohansen Eu diria que esta resposta está muito mais próxima do Python do que do JS. Tudo o que callse faz é substituir $0e $1por parâmetros reais - é uma simples interpolação de strings, como a do Python %.
Eush77 # 19/17
1

Pitão, 17 bytes

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

Experimente online!

Extensão trivial para o bem conhecido jN*2]"jN*2]quine, mas provavelmente pode ser aproveitado

aplaudir
fonte
1

Betaload , 203 bytes

Novas linhas adicionadas para maior clareza:

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

Dei-me a restrição de que ele deveria ler do STDIN, e não do topo da pilha, como faria normalmente uma resposta do Underload. Também usei entrada decimal adequada, que compõe a maior parte do código.

Explicação:

Envolvo o programa em um invólucro de quine: (a(:^)*e ):^. Isso significa que todo o código dentro do Quine Wrapper terá o código-fonte do programa na parte inferior da pilha.

Para converter dígitos em um numeral normal da Igreja, uso a técnica de substituir cada dígito pelo código para multiplicar por 10 e adicionar esse dígito:

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

Há muita repetição aqui, então vamos empacotá-lo em um subprograma que pegará um número da Igreja do topo da pilha e o usará para construir a "sequência de dígitos:"

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

Coloquei isso em um novo ambiente para que ele possa ser acessado rapidamente:

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

Agora eu posso criar o código de substituição para R. Rusa os elementos principais da pilha para formar uma tabela de pesquisa para substituir uma sequência de STDIN pelo código Betaload. Funciona assim:

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

No entanto, podemos usar o subprograma que acabamos de criar para gerar os segmentos de código:

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

Quando Rexecutado, ele transforma a entrada em uma série de subprogramas que compõem um numeral da Igreja. Quando esse subprograma é executado, ele cria o número da Igreja no próximo elemento da pilha (0, que foi colocado anteriormente). Isso significa que, depois R^, o valor mais alto na pilha será o numeral da igreja. Mais ^uma vez, aplicamos o número da Igreja ao elemento final da pilha (o código-fonte do programa) para obter a resposta.

Curiosidade: eu tenho o MD dessa submissão há vários meses. Eu o mantive após entender mal uma pergunta (que parece que não consigo mais encontrar). Eu tive que desenterrá-lo da minha Lixeira para publicá-lo aqui.

Esolanging Fruit
fonte
1

Python 2 , 41 bytes

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

Experimente online!

Será que uma saída de meio hacky usando inputem vez de print, uma vez que printtem um bug estranho que envolve a impressão de uma nova linha quando não é suposto ... . Sai com um erro de EOF.

Explicação:

_="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
Brincadeira
fonte
0

Pitão, 13 bytes

*jN*2]"*jN*2]

Suíte de teste

O padrão Pyth quine mais dois *para a repetição.

isaacg
fonte
0

Perl, 48 bytes

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

\47é a fuga octal para uma aspas simples ( '). É interpretado entre aspas duplas ( "), mas não entre aspas simples.

Grimmy
fonte
0

Javascript ES6, 27 37 bytes

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

Editar

+10 bytes se f=também deve ser exibido


f=

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

f(2);

Weedoze
fonte
@Downvoter why?
Weedoze 19/05
@Kaiido Eu não sei .. Devo ficar com o f=?
Weedoze 19/05
Seu código está se lendo invocando implicitamente toStringa função.
aebabis
@acbabis Chamar f.toString()ou fé o mesmo, mas ele não irá exibir o nome da função
Weedoze
Acredito no que o @acbabis quis dizer é que ele viola o último ponto do desafio "Seu programa também não pode ler diretamente nenhuma parte do seu código-fonte" - usar fdessa maneira está se referindo à sua própria fonte.
skyline3000
0

CJam , 20 12 bytes

8 bytes economizados graças a Martin Ender

{"_~"+ri*}_~

Experimente online!

Exaplanação

{       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.
Gato de negócios
fonte
0

PHP, 194 bytes

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

Experimente online!

Nem golfe, como b64 quines tendem a ser.

Skidsdev
fonte
0

Go , 257 254 bytes

Isso me dói.

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

Experimente online!

totalmente humano
fonte
0

Microscript II, 22 bytes:

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

Microscript II, 20 bytes (mas tecnicamente inválido, pois acessa o código fonte de um bloco de código):

{s""+`"~sN*"s`+}~sN*
SuperJedi224
fonte
0

C, 144 116 bytes

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);}
MD XF
fonte
0

Python 3, 69 bytes

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

05AB1E , 17 bytes

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

Modificação do padrão 0"D34çý"D34çýadicionando ×?.

Experimente online.

Explicação:

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
Kevin Cruijssen
fonte