O carvão vegetal é uma linguagem criada apenas pelo ASCII e pelo DLosc, especializada em desafios de arte ASCII.
Que dicas você tem para o golfe em Charcoal? Obviamente, estou procurando dicas relacionadas especificamente ao carvão vegetal, não aquelas que podem ser aplicadas na maioria dos idiomas, se não em todos.
Respostas:
Aproveite o deverbosifier
Usar o deverbosifier significa que você pode escrever em ASCII (
--dv
ou--deverbosify
deverbosify,-v
ou--verbose
executar como código detalhado). Além disso, ele comprime seqüências de caracteres para você, o que pode ser útil em alguns desafios da arte ASCII quando a seqüência de compactação é muito longa.A @Neil recomenda usar
-vl
ou-v --sl
. Isso é abreviação--verbose --showlength
, o que significa que será interpretado como Carvão Vegetal detalhado e o comprimento do código normal do Carvão Vegetal será mostrado. Além disso, ao efetuar o deverbosifying, verifique a saída para garantir que a entrada foi realmente analisada corretamente, pois o carvão vegetal geralmente ignora erros de análise. Se não é um erro de sintaxe, uso-a
(--astify
) ou--oa
(--onlyastify
) para ajudar a descobrir o problema.fonte
-v -sl
. Além disso, ao deverbosifying, verifique a saída para garantir que a entrada realmente tenha sido analisada corretamente, pois nem sempre você recebe um erro de análise.Use sobrecargas
Por exemplo, muitos comandos precisam apenas de um argumento:
Rectangle
,Oblong
EBox
fazer um quadrado se apenas um argumento for dadoReflect
comandos padrão para refletir direitoRotate
comandos padrão a 90 graus no sentido anti-horárioPolygon
ePolygonHollow
pode aceitar um comprimento multidirecional e um lado. Isso pode ser usado se todos os lados tiverem o mesmo comprimento.fonte
PolygonHollow
por acidente. Você pode até ter várias multidirecionais, mas elas têm que vir antes das setas normais (não sei se essa limitação é intencional). Eu usei isso na minha resposta ao desafio "Desenhe um cubo".ReflectButterfly dls
chamarReflectButterfly
para cada direção, mas (como o wiki documenta corretamente) ele realmente chamaReflectOverlap
.Evite constantes consecutivas do mesmo tipo
Por exemplo,
Plus(Times(i, 2), 1)
traduz como⁺×鲦¹
, mas você pode salvar um byte alternando os parâmetros:Plus(1, Times(i, 2))
converte como⁺¹×ι²
ePlus(Times(2, i), 1)
como⁺ײι¹
ambos salvam um byte.Plus(1, Times(2, i))
(que traduz como⁺¹×²ι
) seria ainda melhor se houvesse outra constante numérica a seguir.fonte
Use as variáveis predefinidas
Aqui está uma lista de todas as variáveis que podem ser usadas, fornecendo a letra grega sucinta e a letra detalhada que a representa.
As variáveis que representam entradas estarão vazias se não houver entrada suficiente, mas todas as outras variáveis não mostradas aqui devem ser atribuídas antes do uso.
fonte
y
ef
é o contrário do que colei? (I pode ter interpretado mal as letras gregas quando eu escrevi originalmente este.)Aprenda suas reflexões e rotações
Existem muitas variações da reflexão e rotação básicas, portanto vale a pena saber quais são as diferenças sutis. Chave para tabelas:
/
pode se tornar\
após uma rotação ou inversão.Reflexões
A direção da reflexão é opcional. O padrão é refletir uma vez à direita. Para aquelas reflexões que mantêm o original, é permitida uma direção múltipla, que simplesmente repete o comando para cada direção. (Isso significa que, por exemplo
ReflectMirror(:¬)
, criará quatro cópias no total.)O cursor é movido junto com a reflexão (mesmo quando o original é mantido).
Rotações
Para as rotações que mantêm o original, há uma origem opcional de rotação. O padrão é o canto inferior direito da tela. Os valores permitidos são qualquer uma das direções diagonais.
A quantidade de rotação (em incrementos de 45 °) é opcional. O padrão é 2, ou seja, 90 ° no sentido anti-horário (anti-horário). Para as rotações que mantêm o original, há duas opções alternativas: um número inteiro de vários dígitos especifica girar a tela uma vez para cada dígito e mesclar os resultados, enquanto uma lista inteira simplesmente repete o comando para cada rotação, com resultados variáveis dependendo de como a tela muda no meio.
fonte
Transform
significa?Transform
funciona a resposta em algum lugar.Use comandos sem um caractere de comando
Uma expressão que não faz parte de um comando é impressa.
Se for precedida por uma direção, a expressão será impressa na direção especificada.
Os números são impressos como uma linha com o comprimento especificado usando um caractere selecionado
\/-|
.Se uma direção não for seguida por uma expressão, ela será contada como um espaço para mover na direção especificada.
Nota: Às vezes, isso pode ser contado como parte do comando anterior, portanto, o caractere do comando pode ser realmente necessário. (obrigado Neil por me lembrar)
fonte
Use multidirecionais
Alguns comandos podem aceitar multidirectionals:
+X*|-\/<>^KLTVY7¬⌊⌈
. O que eles expandem estão aqui . Em geral, a lista de direção começa de cima e continua no sentido horário.fonte
ReflectButtterflyOverlap(:¬, Modulo(g, 2));
.)Faça pleno uso de
Sum
Sum
possui muitas sobrecargas úteis:Join(..., "")
..
caractere, obtém a soma dos dígitos.-
conta como um separador).Um efeito colateral conveniente das duas últimas regras é que, se você usar
Sum
um caractere, os dígitos1-9
serão convertidos em seu valor e todo o resto retornará zero, ao contrário doCast
que ocorre com os valores que não são dígitos.fonte
Use split para um array de strings, split e cast para um array numérico
A divisão para uma matriz de cadeia de caracteres tem apenas três caracteres de sobrecarga, e a divisão e conversão são de apenas quatro caracteres de sobrecarga. Compare isso com a escrita literal da matriz, o que exigiria o início e o fim da matriz e um separador entre cada elemento da matriz.
Se a sua matriz numérica tiver apenas números menores que 95, use uma conversão (se todos os números forem menores que 10) ou indexe em uma das variáveis predefinidas.
fonte
Use Filtro para dividir o primeiro caractere de uma matriz ou sequência
Mesmo se você tiver sorte, usando
Slice
para cortar o primeiro caractere de uma string leva 2 bytes:Slice(..., 1)
. Levará mais tempo se a expressão a ser cortada terminar em um número, exigindo um separador ou se o código a seguir puder ser interpretado como uma expressão, pois nesse caso,Slice
será necessário consumi-la como um parâmetro adicional.Em vez disso, basta usar
Filter(..., k)
, o que elimina o primeiro elemento, alcançando o resultado desejado. (Obviamente, use a variável de índice de loop apropriada se sua expressão estiver aninhada dentro de outro loop.) Isso é sempre 2 bytes e não pode ser afetado pelo código circundante.fonte