Dicas para jogar golfe no carvão

15

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.

Okx
fonte
Dane-se, eu vou tentar fazer uma resposta de carvão em alguma coisa, brb. Talvez eu possa dar dicas menores sobre este tópico.
Urna Mágica do Polvo

Respostas:

5

Aproveite o deverbosifier

Usar o deverbosifier significa que você pode escrever em ASCII ( --dvou --deverbosifydeverbosify, -vou --verboseexecutar 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 -vlou -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.

Somente ASCII
fonte
Além disso, eu recomendo usar -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.
Neil
3

Use sobrecargas

Por exemplo, muitos comandos precisam apenas de um argumento:

  • Rectangle, OblongE Boxfazer um quadrado se apenas um argumento for dado
  • Reflect comandos padrão para refletir direito
  • Rotate comandos padrão a 90 graus no sentido anti-horário
  • Polygone PolygonHollowpode aceitar um comprimento multidirecional e um lado. Isso pode ser usado se todos os lados tiverem o mesmo comprimento.
Somente ASCII
fonte
Eu descobri esse fato PolygonHollowpor 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".
5197 Neil
Hmm a limitação é meio intencional, mas eu acho que eu deveria mudá-lo porque ele não iria prejudicar qualquer maneira
ASCII-only
Vejo que você corrigiu o Polygon para aceitar setas e multidirecionais em qualquer ordem, obrigado! Enquanto estou aqui, esperava ReflectButterfly dlschamar ReflectButterflypara cada direção, mas (como o wiki documenta corretamente) ele realmente chama ReflectOverlap.
Neil
@Neil lol oops, eu vou tentar corrigir isso o mais rápido possível (eu acho que é uma coincidência muito haha)
ASCII-only
3

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 ⁺¹×ι²e Plus(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.

Neil
fonte
3

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.

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

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.

Neil
fonte
Eles devem ser corrigidos no TIO agora, seria bom se você pudesse verificar se ele funciona
somente ASCII
@ Somente ASCII Você pode confirmar isso ye fé o contrário do que colei? (I pode ter interpretado mal as letras gregas quando eu escrevi originalmente este.)
Neil
Sim, eles são o contrário
apenas ASCII
3

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:

  • Comando: Nome do comando no modo verboso.
  • Transformação: se o carvão deve tentar virar ou girar os caracteres conforme ele os espelha ou os gira. Por exemplo, um /pode se tornar \após uma rotação ou inversão.
  • Manter original: se o carvão deve mesclar o resultado com a tela original.
  • Sobreposição: (Aplicável apenas quando Manter original é Sim.) Determina a posição do eixo de reflexão / rotação, em meios caracteres da borda. No caso de reflexões, equivalente ao número de linhas / colunas que não são afetadas e terminam no meio do resultado. No caso de rotações, a cópia girada pode substituir áreas claras (mas não espaços) no original.

Reflexões

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

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

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

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.

Neil
fonte
Pergunta: O que Transformsignifica?
CalculatorFeline
@CalculatorFeline Boa pergunta. Os casos em que Transform não é são simplesmente uma cópia de caractere por caractere. Por exemplo, um reflexo padrão de "4> 2" são apenas os caracteres na ordem inversa, ou seja, "2> 4". Isso nem sempre é desejável; portanto, o Transform tenta alternar os caracteres da maneira mais apropriada; assim, o reflexo de "4> 2" se tornaria "2 <4". A transformação pode não ser a melhor descrição disso, portanto, fique à vontade para sugerir algo melhor.
Neil
Como não consegue pensar em nada melhor, você deve explicar como Transformfunciona a resposta em algum lugar.
CalculatorFeline
@CalculatorFeline Adicionei uma chave à tabela, caso as outras colunas também não estivessem limpas.
19417 Neil
Os erros devem ser corrigidos agora. Também muito obrigado por dedicar um tempo para escrever esta explicação!
somente ASCII
2

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)

Somente ASCII
fonte
1
Você deve estar atento a ambiguidades, porque o comando anterior pode aceitar um parâmetro opcional.
Neil
2

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.

Somente ASCII
fonte
Alguma razão específica para que alguns comandos aceitem multidirecionais, mas outros exigem uma lista de direção? (Pode haver uma boa razão para isso que eu estou com vista, mas eu estava tentando fazer ReflectButtterflyOverlap(:¬, Modulo(g, 2));.)
Neil
@Neil Eu não penso assim, vai mudar o mais rápido possível
ASCII única
0

Faça pleno uso de Sum

Sum possui muitas sobrecargas úteis:

  • Em uma lista de cadeias, concatena-as juntas. No entanto, se for possível que a lista esteja vazia, isso daria None, portanto, nesse caso, use-o Join(..., "").
  • Em uma lista não vazia de números, basta pegar sua soma.
  • Em uma lista não vazia de listas, concatena-as juntas (nivela até a profundidade 1).
  • Em um número inteiro, obtém a soma de seus dígitos. (Os valores de ponto flutuante são truncados para número inteiro. Se você desejar a soma das casas decimais, faça a conversão para a string primeiro.)
  • Em uma sequência que contém apenas dígitos e, opcionalmente, um .caractere, obtém a soma dos dígitos.
  • Em uma sequência que contém números e separadores, leva a soma dos números convertidos para int ou float (mas observe que -conta como um separador).

Um efeito colateral conveniente das duas últimas regras é que, se você usar Sumum caractere, os dígitos 1-9serão convertidos em seu valor e todo o resto retornará zero, ao contrário do Castque ocorre com os valores que não são dígitos.

Neil
fonte
0

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.

Somente ASCII
fonte
0

Use Filtro para dividir o primeiro caractere de uma matriz ou sequência

Mesmo se você tiver sorte, usando Slicepara 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, Sliceserá 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.

Neil
fonte