... pelo menos para alguma definição de "auto-modificação".
A tarefa
Neste desafio, sua tarefa é escrever três cordas A
, B
e C
que satisfaçam as seguintes propriedades.
A cadeia
B
tem comprimento pelo menos 1.Para todos
n ≥ 0
, a string é um programa válido (ou seja, programa executável completo ou definição de função) na sua linguagem de programação preferida. A repetição denota sobrescritos, então isso significa que as cordas , , , etc. Cada programa tem uma string como entrada e retorna uma seqüência de caracteres como saída.ABnC
AC
ABC
ABBC
ABBBC
Para qualquer
m, n ≥ 0
, se o programa for executado com entrada , ele retornará . Para entradas não deste formulário, o programa pode fazer qualquer coisa, incluindo falha.ABmC
ABnC
ABm*n+1C
Alguns exemplos no formato program(input) -> output
:
AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC
Regras e Pontuação
Sua pontuação é o comprimento total A
eC
, quanto menor a pontuação, melhor. Observe que, embora B
não seja contado para a pontuação, ela deve ser produzida por A
e C
como no primeiro exemplo.
As brechas padrão não são permitidas. Os programas não têm permissão para acessar direta ou indiretamente seu próprio código-fonte (exceto quando forem fornecidos como entrada). Você é obrigado a identificar as seqüências de caracteres e A
, de alguma forma, na sua resposta, e é incentivado a explicar sua solução.B
C
fonte
Pitão, 10
Dividimos a fonte em duas linhas. A primeira linha é A, a segunda linha são as Bs. Como A está na primeira linha, a primeira
w
apenas imprime A - fácil, pronto.Em Pyth, os zeros à esquerda são tokens separados, o que
[00)
realmente é[0, 0]
. Observe que a primeira linha termina eml[
e a segunda linha consiste em0000...
. Então,l[
na verdade, conta o número de Bs neste programa. A segundaw
lê na segunda linha da entrada - este é o número de Bs da entrada. A partir daqui, é simples multiplicar, incrementar e gerar muitos zeros.fonte
Retina ,
2519 bytesABC
Código de exemplo :O código possui duas etapas de substituição:
mudar a entrada
AB^mC
emAB^(m*n)C
alterando cadaB
paraB^n
:]\]
corresponde a cadaB
entrada e nada mais, graças ao escape nas linhas do padrão]]...]]
éB^n
mudar
B^(m*n)
paraB^(m*n+1)
porm`^]*$
tomando a linha com apenas]
's]$0]
adicionando um par extra]]
para que essa linha não corresponda ao primeiro regexAdicionei 3 bytes à pontuação para o
-s
sinalizador de várias linhas, necessário para que todo o código da Retina pudesse estar em um arquivo.2 bytes salvos graças ao @ MartinBüttner.
fonte
Python 3, 51 bytes
Exemplo de uso:
A função calcula
n*m+1
com(1+len("xxx")*(len(s)-51))
onde hám
x
a string (xxx
parte é aB^m
). Multiplicar a string"x"
com esse número forneceB^(n*m+1)
e a função retiraA
eC
sai da entrada e concatena tudo isso para obterAB^(n*m+1)C
.A mesma abordagem em J:
J, 35 bytes
fonte
CJam, 22
Exemplo de execução:
que se traduz em
com entrada como
que fornece a seguinte saída:
Como funciona :
Vamos dar uma olhada em quais programas
AC
eABC
como:Percebemos que
C
=B_~
Vamos analisar o que
B
está fazendo:Agora vamos ver o que a execução
AC
sem nenhuma entrada fará:Uau, a saída é
ABC
.Basicamente, contamos quantos
B
existem no código. Em seguida, quantos estão na entrada (usando comprimento). Multiplique-os, aumente duas vezes (já queC
também possuiB
) e acrescente_~
para obterC
Experimente online aqui
fonte
Haskell , 50 bytes
f
é uma função que leva e retorna aString
.A string B é apenas um espaço único, enquanto C começa com um.
Experimente online!
_:b=" "
cessionários todos, mas o primeiro dos espaços na string literal parab
, fazendo que igual ao do programa m cópias B.s
é a sequência de entrada.a:c<-words s
divide-o em palavras separadas por espaço, para quea
se torne A ec
se torne uma lista das palavras que compreendem C. As cópias B são ignoradas, uma vez quewords
espremem vários espaços (o que o restante do programa evita).drop 50s
é uma sequência com comprimento igual ao número n de B cópias na entrada.drop 50s>>b
concatena muitas cópias deb
, dando espaço para o manganês .unwords$a:(drop 50s>>b):c
junta todas as cordas de volta com espaços. Como há uma "palavra" extra(drop 50s>>b)
inserida na lista, também há um espaço de junção extra, adicionando automaticamente o +1 à multiplicação.fonte
Matlab, 85
A primeira vez que fiz um desafio tão abstrato, então para mim foi mais um desafio de codificação do que um desafio de golfe com código!
As três strings são, sem as aspas:
Como funciona: divido o argumento de entrada em espaço em branco, para que
n
possa ser determinado a partir do número de partes da string. B funciona como uma espécie de contador para obterm
. Para reconstruir a resposta que eu uso A e C da divisão, repita B m * n + 1 vezes e insiro os espaços usando seu valor ASCII, para que nenhuma divisão indesejada ocorra em C.EDIT: gritos, acidentalmente contados A + B
fonte
C (gcc) , 81 bytes
O requisito de identificar as strings parece estar em desacordo com o fato de termos um comportamento arbitrário permitido para entrada ilegal, a menos que tenhamos padrões bastante relaxados do que a identificação implica. Naturalmente, tomei a interpretação que lança mais bytes.
Experimente online!
fonte
TI-Basic (série 83), 65 bytes
Segmento A (33 bytes):
Segmento B:
Segmento C (32 bytes):
Estou realmente empolgado em encontrar esse desafio de qualidade! A maioria dos quines não funciona no TI-Basic sem pelo menos um pouco de trapaça, porque não há como escapar do
"
símbolo. (Nos dois sentidos da palavra "escape".) Mas aqui, obtemos uma string de entrada por meio doInput
comando, e digitar um"
lá é perfeitamente adequado.Ainda há uma certa bobagem do TI-Basic por aqui: uma string vazia é inválida; portanto, a solução ingênua de inserir a string
"XXX...XX"
em um loop não funcionará quando n = 0. Em vez disso, calculamos manualmente o valor de mn + 1 e inserimos a string"X"
várias vezes.As constantes mágicas
27
e28
no programa são ligeiramente fora a partir das contagens de bytes 33 e 32, por causaStr1
,sub(
, elength(
são símbolos de dois bytes que apenas contribuem 1 ao comprimento de uma cadeia de caracteres.Se usarmos novas linhas em vez de
:
, parece que é possível salvar alguns bytes deixando de lado as aspas finais, mas na verdade isso não funciona. Primeiro de tudo, você precisa de um editor hexadecimal antes de adicionar o caractere de nova linha em uma string: não é possível digitar apenas porque, se você pressionar ENTER durante umInput
comando, ele enviará a entrada. Quando tentei a abordagem do editor hexadecimal, acabei recebendo um erro estranho de estouro de buffer que modificou o conteúdo do meu programa; portanto, não tente fazer isso em casa com sua calculadora cara.fonte
Java 11,
13565 + 26 = 91 bytesUMA
B
C
Experimente on-line aqui (o TIO ainda não possui o Java 11, portanto, ele conta com um método auxiliar em vez de
String::repeat()
).Ungolfed:
fonte