Tivemos muitos desafios de quine , mas muitos dos formatos de quine são semelhantes, vamos criar alguma variação em nossos quines.
Sua tarefa é criar uma seleção de programas no mesmo idioma (pelo menos 2), todos com saída de seu próprio código-fonte; no entanto, nenhum desses programas pode compartilhar caracteres.
Por exemplo, se você criar um programa usando:
printf+qw(printf+qw(%s)x2)x2
Seu próximo programa não pode incluir nenhum dos seguintes:
%()+2finpqrstwx
e assim por diante.
Regras
- Você pode usar caracteres unicode, mas ainda deve pontuar em bytes.
- Todos os programas devem atender à definição da comunidade de uma solução adequada . Isso significa que a cadeia vazia não conta como uma solução válida, entre outras coisas.
- As brechas padrão são proibidas.
- Funções ou programas completos são permitidos desde que atendam à definição acima.
- Os idiomas independentes de símbolos (incluindo Lenguage e Headsecks) não são permitidos.
- A maioria dos programas vence, com o menor código total como desempate.
code-challenge
restricted-source
quine
Dom Hastings
fonte
fonte
Respostas:
V ,
3, 5 quines, 46 bytesExperimente online!
Hexdump:
Explicação:
Experimente online!
Hexdump:
Explicação:
Experimente online!
Hexdump:
Explicação:
Aqui é onde eles começam a ficar descolados ...
Experimente online!
Hexdump:
Explicação:
Experimente online!
Hexdump:
Explicação:
Esta resposta é preenchida com magia negra. Os Quines 1 e 4 não são novos, mas os outros 3 nunca foram encontrados antes, então mais da metade desses quines foram descobertos hoje.
fonte
normie :p
"REEEEEE--
Gelatina ,
2 3 45 quines,14 18 81 65 59 56 326 265 247 229216 bytes3 bytes
Experimente online!
Quine padrão.
”Ṙ
é o literal de um caractere paraṘ
.Ṙ
imprime a representação de string disso, em seguida, a stringṘ
é impressa implicitamente.4 bytes
Experimente online!
⁾
inicia um literal de cadeia de dois caracteres eḤ
dobra seu argumento. Com uma entrada de string,Ḥ
é mapeado para cada caractere. Assim,Ḥ
atuando na cadeia⁾Ḥ
produz⁾⁾ḤḤ
o código fonte.11 bytes
Experimente online!
No lado direito,
“ȮṾṖƊ}
está a string literal paraȮṾṖƊ}
. O caractere de fechamento da sequência é adicionado tacitamente ao EOF.À esquerda da string literal,
Ɗ
agrupa-seȮṾṖ
em uma única mônada e a}
transforma em uma díade que usa o argumento correto, a string literal.Ȯ
imprime a string (ȮṾṖƊ}
),Ṿ
cria uma representação de string (“ȮṾṖƊ}”
) eṖ
remove o”
caractere. A sequência“ȮṾṖƊ}
é deixada após a mônada e é impressa implicitamente.38 4936 bytesExperimente online!
Primeira vez que usei um espaço no golfe Jelly.
A lista de números no início contém
ord
o restante dos caracteres no código. Depois disso:270 198 180162 bytesExperimente online!
Usa números e índices de base 250 na página de códigos Jelly. Economizou 72 bytes alterando o algoritmo. Estava usando cada número para indexar na página de código de Jelly, mas agora estou convertendo o número inteiro de volta para a base 250 e depois indexando para a página de código de Jelly, basicamente diminuindo pela metade o número de literais de que preciso na primeira linha. Isso também reduz o número de caracteres únicos necessários, mas não consigo pensar em uma maneira de fazer mais quines.
Eu usei
⁾“”
quais criam literais de stringsỌ
eØJ
quais criam strings a partir de números. Não consigo pensar em nenhuma outra maneira de criar strings. Eu ainda tenho o dígito9
e está‘’
disponível, portanto, se houver outra maneira de criar strings a partir de números, poderá ser possível criar outra solução.fonte
Haskell , 3 quines, 1119 bytes
Quine 1, 51 bytes
Uma
IO
ação anônima que imprime diretamente no stdout.Experimente online!
Quine 2, 265 bytes
A função
f
pega um argumento fictício e retorna uma string.Experimente online!
Quine 3, 803 bytes
Tudo depois do
LANGUAGE
pragma é uma função desagradável, que pega um argumento fictício e retorna uma string.Experimente online!
Personagens
Quine 1:
Quine 2:
Quine 3:
Como funciona
Quine 1
Quine 1 é uma versão modificada do meu recente Golf, uma resposta quine (com melhorias de H.PWiz):
main=
foi removido.<>
e$
foram substituídos por seus quase sinônimosmappend
eid
.Isso libera os caracteres vitais
=<>
e o operador útil$
para as outras peças.Quine 2
O Quine 2 usa métodos semelhantes para programar 2 da minha recente resposta mutuamente exclusiva do Quines , mas adaptado para se ajustar diretamente e especialmente para evitar o uso de caracteres literais, necessários para o quine 3. Ambos são alcançados com a ajuda da
show
função, que por pura sorte ainda não teve nenhum de seus personagens.Esse quine usa guias em vez de espaços, mas usei os espaços abaixo para facilitar a leitura.
g
são os dados quine, como uma lista de números inteiros no final do código. Cada número representa um caractere do restante do código.9
, de modo que a guia é0
. Isso torna a codificação um pouco mais curta, permitindo que as letras minúsculas da função e dos nomes das variáveis caibam em 2 dígitos.b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
é uma função para converter um número em um caractere (na verdade, uma cadeia de um caractere).[[show 9!!0,show 1!!0..]!!6..]
é um intervalo de caracteres que começa com um caractere de tabulação indexado em!!c
.[show 9!!0,show 1!!0..]
, começando com os caracteres de dígitos'9'
e'1'
e salta para baixo em intervalos de 8.show
sequência do dígito correspondente.f c=[b=<<g]!!0++show g
é a função principal.c
é um argumento fictício.b=<<g
usa=<<
para converter cada número emg
seu caractere. (O uso de,=<<
e não por exemplo,map
é o motivo pelo qual eleb
precisa agrupar seu caractere retornado em uma lista.)show g
fornece a representação dag
lista de++
strings e concatena as strings.=<<
tem precedência menor que++
, é necessário algum bracketing. Para evitar o uso()
(reservado para o quine 3),[...]!!0
indexe em uma lista com um elemento.Quine 3
Por design dos outros quines, o quine 3 ainda tem acesso a parênteses, expressões lambda, literais de caracteres e o construtor string / list
:
. Isso será suficiente para construir uma função que precede o código do quine a uma string.Infelizmente, todas as vogais em letras minúsculas (exceto algumas vezes
y
) foram usadas, não deixando funções internas alfanuméricas úteis. Também[]""
se foram. Isso não deixa uma maneira normal de construir uma string vazia para começar a fingir o código.No entanto, quase todas as letras maiúsculas ainda estão disponíveis, portanto,
LANGUAGE
é possível um pragma para obter uma extensão de idioma. Novamente, por pura sorte,CPP
(ativar o pré-processador C) é a única extensão de idioma nomeada apenas com letras maiúsculas. E macros CPP geralmente têm nomes em maiúsculas.Portanto, para obter a string vazia essencial, o quine ativa
CPP
, usa a__TIME__
macro para obter uma constante de string da forma"??:??:??"
(convenientemente garantido que sempre tenha o mesmo comprimento) e as correspondências de padrões nela.Após o pragma da linguagem, o quine consiste em uma expressão lambda vinculando seus parâmetros a esses quatro argumentos (deixando um parâmetro fictício final
_
para ser aplicado posteriormente):q
vinculado a'\''
, fornecendo um caractere de aspas simples;_:_:_:_:_:_:_:_:z
obrigado a__TIME__
, também conhecido como uma string"??:??:??"
, criando assimz
uma string vazia;y
ligado a(\(?)v k x->v$k?x)
, um combinador lambda usado para ajudar a converter os dados do quine da forma associada à esquerda ("foldl") para a forma associada à direita ("foldr");(#)
vinculado a\(&)(%)v->v&'{'&'-'&...
, os próprios dados quine.Os dados quine são fornecidos em uma forma de codificação da Igreja, uma expressão lambda com parâmetros
(&)(%)v
.(&)
,(%)
ev
, essa codificação pode ser usada para construir o código principal do quine ou para reconstruir a própria representação de dados do quine.&
-%
se operadores associativos deixados dentro do lambda. Assim, os parâmetros dos caracteres são combinados com o inicialv
inicial da esquerda.k
, existe um correspondente&'k'
.k
é'
ou\
, que precisa ser escapado dentro dos literais de caracteres, a codificação é alternativa%'\k'
.Como a codificação de dados é deixada associativa, mas as seqüências são construídas da maneira associativa correta, o combinador
y = (\(?)v k x->v$k?x)
é introduzido para preencher a incompatibilidade.y(...)
destina-se a criar funções adequadas para uso como dados(&)
e(%)
operadores do quine .v
é uma função de cadeias de caracteres para cadeias de caracteres (os dados pretendidos do quinev
são exemplos).k
é um caractere,x
uma sequência e?
um operador que os combina em uma nova sequência. (Para o código principal(?)=(:)
. Para realmente reconstruir a representação de dados quine, é mais complicado.)y(?)v k = \x->v$k?x
é outra função de strings para strings.Como um exemplo de como isso muda a associatividade, se
(&)=y(:)
:De maneira mais geral, quando
(#)
é a função de dados quine ef1,f2
são funções que combinam caracteres com seqüências de caracteres:aplicar a função de dados quine com
(&)=y(f1)
e(%)=y(f2)
, e isso usa o prescritof1
ef2
para combinar os caracteres dos dados quine comx
e, em seguida, passa a sequência resultante parav
.O corpo da expressão principal lambda reúne tudo isso:
'&':q:k:q:x
para um caracterek
precede&'k'
a sequênciax
, enquanto'%':q:'\\':k:q:x
precede%'\k'
, que são seus formulários originais de dados quine.y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
são os parâmetros corretos para reconstruir a representação de dados quine, anexados à finalz
(a sequência vazia) e depois transmitidos à função a seguir.y(:)#y(:)
são os parâmetros corretos para acrescentar o código principal do quine a uma string, sem outra modificação.\x->x
que não faz nada com o quine construído, que é retornado.fonte
Perl 6 , 3 quines, 274 bytes
Quine 1, 52 bytes
Experimente online!
Quine 2, 102 bytes
Experimente online!
Quine 3, 120 bytes
Experimente online!
Verificação de conjuntos distintos de bytes
Houve muitas manobras na obtenção do terceiro quine. Perl 6 tem 4 métodos de saída (que eu saiba),
say
,put
,print
eprintf
. Ambassay
eput
novas linhas de saída, pois não posso usar as duas.put
,print
,printf
Todos contêmp
et
. Podemos contornar isso parcialmente usandoEVAL
para usar maiúsculasPRINT
. A partir daí, acho que não é possível obter 4 quines ... (embora talvez algo comoshell "echo 'quine'"
possa funcionar)Podemos então resolver problemas de espaçamento usando diferentes tipos de espaço em branco para separar operadores, espaços, guias e novas linhas.
Explicações:
Quine 1:
Quine 2:
Isso é um quine no formato
printf |(q[printf q[%s]]xx 2)
, ou seja, formata uma cópia da string em si mesma. No entanto, não podemos usar,s
uma vez que isso é usado no quine anteriorsay
. Então, usamos a string OR operator (~|
) em@
e!3
, para produzir a%s
peça, mas não podemos fazer isso com a string de formato e a string a ser inserida, por isso temos a verZ~
com a string extra e uma string vazia, embora não possamos usar,
para separar os dois, fazemos issoXx qw[1 0]
para multiplicar por 1 e 0.Quine 3:
Este é um quine EVAL que tenta o máximo possível para tornar tudo maiúsculo para evitar conflitos com os outros quines. Trata-se de um monte de
EVAL
s, bem como muito poucoslc
euc
converter entre os casos.fonte
MathGolf ,
4 56 quines, 193.535 bytes9 bytes
Experimente online!
45 bytes
Experimente online!
49 bytes
Experimente online!
99 bytes
Experimente online!
4488 bytes
Experimente online!
188.845 bytes
Eu realmente não posso vincular a este, então aqui está um programa Perl 6 que gera a solução atual
Verificação da distinção
Definitivamente, posso extrair outra solução disso, embora eu ache que tenha ficado sem meios de empurrar as cordas diretamente para a pilha, então terei que recorrer a métodos mais estranhos. Métodos ainda mais estranhos são recebidos enquanto eu tento uma sexta dose. Em alguns casos, os quines podem ser mais curtos, mas estou reduzindo os bytes usados na preparação.Tudo bem, tecnicamente eu posso ser capaz de fazer mais uma solução, já que ainda tenho alguns operadores necessários (cadeia de push, cadeia de incremento, duplicação, mapeamento, popping), é o loop que nos restringe. Os
{}
únicos operadores que podem indicar um bloco de código de tamanho arbitrário, e eu realmente preciso deles no 6º quine. Eu poderia usar alguns dos outros blocos de código, mas eles são limitados, e duvido que as seções de loop sejam tão curtas, já que estamos ficando sem operadores fáceis.Ok, algumas explicações tardias:
Todos os quines têm quase a mesma estrutura:
Quine 1:
É basicamente o mesmo que eu postei na pergunta normal do quine.
Quine 2
Quine 3:
Quine 4:
Quine 5:
Quine 6:
A razão deste Quine é assim muito mais tempo do que os outros é que incrementar cordas usa representações Unicode, que realmente é uma porcaria para a alguns dos personagens no código, especialmente quando estamos a tentar criar o personagem
⌂
no código, que infla o código por mais de 8000 caracteres, que aumentam a parte da representação em uma quantidade muito grande.Esse último quine seria reduzido significativamente se o MathGolf fosse consistente se as strings usavam a página de código nativa ou não.
fonte
chr/ord
um deles, eu deveria fazer com que ambos usassem a página de códigos em vez disso.Python 2, 2 quines,
434353349446 bytesIsso foi principalmente apenas para ver se eu poderia fazê-lo em Python.
30 bytes (incluindo uma nova linha à direita):
e 416 bytes, sem nova linha à direita:
(Golpeou 81 bytes graças a Lynn, mas adicionou uma carga devido a se preocupar com a nova linha.)
Explicação
O primeiro é apenas o quine curto padrão do Python , mas modificado para não ser usado
_
. Como esse é o Python 2, ele também não usa(
ou)
.O segundo pensou um pouco. A cadeia longa é codificada usando o
hex
codec (garantindo assim que ele conterá apenas0
-9
ea
-f
) e decodifica conformeIsso usa truques de quine para obter seu próprio código-fonte, depois codifica-o usando
hex_codec
e depois imprime-o ao redorexec"".decode("hex")
, usando-osys.stdout.write
para evitar a impressão de uma nova linha. A execução desse código gera o segundo quine, que é como eu o gerei.Suspeito que mais de dois sejam impossíveis no Python, embora eu gostaria de ver se estou errado!
Se você não se importa com as avaliações
Ørjan Johansen sugeriu o seguinte para o segundo quine pré-codificado
que pontuaria 30 + 248 = 278 bytes para a seguinte saída:
O uso
exec
dessa maneira não é trapacear de acordo com as regras de quine apropriadas do PPCG, mas me parece um pouco barato (elegante e inteligente, mas ainda barato), porque alguns caracteres estão sendo usados como código e dados. (Embora minha versão useexec
, o código e os dados são separados.) Portanto, vou manter minha pontuação em 446.fonte
"hex"
funciona em vez de"hex_codec"
, o que deve economizar alguns bytes!print '<tab>',
não adiciona um espaço no final. Usando isso, você pode retirar 85 bytes da sugestão de Jo King: tio.run/…Japt ,
23 quines,106172 bytesO primeiro é uma versão bastante detalhada da minha resposta ao N char quine .
Experimente aqui .
O segundo quine é o maior quine bom da ETHProduction , que é um bom quine padrão para Japt.
Experimente aqui .
O terceiro usa
``
e codifica o código XORing para armazenar os dados.Experimente aqui .
Como
()'
ainda estão disponíveis, pode ser possível extrair mais uma solução.fonte
"'[+U+']+R+(Umd)¬"q mc
fornece a primeira linha para atualizações rápidas, se isso for de alguma ajuda.Gol> <> ,
23 quines,17 28 2726 bytes6 bytes
Experimente online!
11 109 bytesExperimente online!
11 bytes
Experimente online!
Gol> <> tem três maneiras de imprimir qualquer caractere:
o
Pop um valor e imprimir como charH
Estale tudo, imprima como char e pareS"..."
Imprimir literal da string sem afetar a pilhaMas não consegui encontrar uma maneira de escrever um quine usando
S"..."
como o único método de saída, então criei os dois acima, utilizando os dois tipos de literais de string.O terceiro (de Jo King) usa o
p
comando para criar o"
inS"
-the-fly, que por sua vez imprime tudo, exceto o zero no final. Em seguida,Eh
imprime o zero e sai.Agora que usamos todos os comandos de saída E o
p
comando, acredito que seja impossível criar outro quine (a menos que alguém venha com oS"
quine semp
).fonte
S"..."
?Ruby , 2 quines, 27 + 44 = 71 bytes
Experimente online!
Experimente online!
Estou limitado principalmente por métodos de saída, aqui. Existem várias maneiras de manipular seqüências de caracteres, mas além de
$><<
todos os métodos de saída utilizáveis, eles parecem se cruzar demais. Eu acho que pode haver uma saída,eval
mas é complicado ter que aninhar várias manipulações de strings de diferentes tipos.fonte
Javascript ES6, 2 quines, 43 + 22 = 65 bytes
Quine 1:
Quine 2:
fonte
g=z=>"g="+g
um JS válido válido?> <> , 2 quines, 8 + 16 = 24 bytes
8 bytes
Experimente online!
Retirado desta resposta .
16 bytes
Experimente online!
Esta baseia-se no
'r3d*>o<
quine, exceptoo
e<
não pode ser utilizado, portanto, I substituídos<
com|
e criado dinamicamenteo
(111 = 8 * 13 + 7) e colocou-a em que o segundo>
é.2 quines é o limite
Infelizmente, estamos limitados pelo número de comandos de saída.
n
não é útil porque só gera números; portanto,o
deve ser executado em qualquer quine. A única maneira de criar dinamicamenteo
é comp
. Portanto, um quine pode usaro
e outro pode criá-lop
, mas não pode haver um terceiro quine.Pode ser possível que um terceiro quine deixe o código-fonte na pilha, se isso for importante.
fonte
Java 10, 2 quines,
14481248 bytes13501122 bytesExperimente online.
Equivalente a:
Explicação:
126 bytes
System.console()
retornaránull
quando nenhum for fornecido; portanto, o TIO retornará aNullPointerException
nesse caso .Para provar que é uma solução funcional, substitua
System.console()
porSystem.out
: Experimente online.Explicação:
Explicação geral:
Em Java, um quine geralmente é feito assim:
String s
contém o código fonte não formatado.%s
é usado para inserir esta String em si mesma com os.format(...)
.%c
,%1$c
E34
são usados para formatar as aspas.s.format(s,34,s)
coloca tudo junto.Nesse caso, a função lambda quine mais curta no Java 10 seria esta ( 82 bytes ):
Experimente online.
Como a única maneira de ter dois quines em Java é usar a versão unicode com
\uHEXA
, que é convertida em caracteres durante a compilação, não consigo usar os caracteres0123456789ABCDEF\u
na versão não unicode. Portanto, a versão menor não unicode usará emSystem.console()
vez dereturn
ouSystem.out
(ambos contendo um 'u') e usará'}'-'['
duas vezes em%c
vez de34
e%1$c
.Algumas coisas a serem observadas sobre a versão unicode:
%04X
vez de%04x
(para maiúsculas hexadecimal em vez de minúsculas).92
,%c
e%3$c
para formatar as barras.\U
vez de minúscula\u
não é permitido, aparentemente, caso contrário, eu teria usado apenasreturn
na versão mais curta, não unicode.fonte