Considere um quadrado de caracteres ASCII imprimíveis (pontos de código 0x20 a 0x7E) para o comprimento lateral N , como o seguinte (aqui, N = 6 ):
=\
g \
7
m+y "g
L ~
e> PHq
Também exigimos que cada linha e cada coluna contenha pelo menos 1 espaço e 1 caractere não espacial . (O exemplo acima satisfaz isso.)
Definimos o negativo de tal quadrado, como um quadrado do mesmo tamanho, onde cada espaço é substituído por um não-espaço e vice-versa. Por exemplo, o seguinte seria um negativo válido do exemplo acima:
1234
a b cd
ZYXWV
!
{} [ ]
?
A escolha de caracteres não espaciais é irrelevante (desde que sejam do intervalo ASCII imprimível).
O desafio
Você deve escrever um programa, com um código-fonte quadrado com o comprimento do lado N> 1 , que imprima um negativo para STDOUT. Os espaços à direita devem ser impressos. Você pode ou não imprimir uma única linha nova à direita.
As regras habituais de quine também se aplicam, portanto, você não deve ler seu próprio código fonte, direta ou indiretamente. Da mesma forma, você não deve assumir um ambiente REPL, que imprime automaticamente o valor de cada expressão inserida.
O vencedor é o programa com o menor comprimento lateral N . Em caso de empate, o envio com o menor número de caracteres não espaciais no código-fonte vence. Se ainda houver um empate, a resposta mais antiga vence.
fonte
Respostas:
CJam, 4 x 4 (8 não espaços)
Experimente online no intérprete CJam .
Resultado
Como funciona
L
empurra uma matriz vazia e_
empurra uma cópia dela.O bloco
empurra esse bloco na pilha.
_
empurra uma cópia do bloco de código e op
imprime, seguido por um avanço de linha.Finalmente, o intérprete imprime todos os itens restantes na pilha: duas matrizes vazias que não afetam a saída e o bloco de código original.
Versão alternativa
Experimente online no intérprete CJam .
Resultado
Como funciona
L
empurra uma matriz vazia e a~
despeja. A pilha está vazia novamente.O bloco
empurra esse bloco na pilha.
_
empurra uma cópia do bloco e~
executa a cópia.A parte
_
interna da cópia do bloco enviará uma cópia do bloco original, quep
será impresso, seguido de um avanço de linha.Finalmente, o intérprete imprime o item restante na pilha: o bloco de código original.
fonte
Perl, 7 × 7 (42 não espaços)
Resultado:
fonte
7
feito7
. :)CJam, 4X4 (
1210 não espaços)Resultado:
Versão anterior com 12 não espaços:
E a saída é
Como apontado por Martin, esta versão tem
*
,4
,4
como a saída;)
Experimente online aqui
fonte
Marbelous - 16x16
Teste aqui! Espaços como espaços em branco, placa cilíndrica e bibliotecas de inclusão devem ser verificados.
Resultado
Explicação
Existem duas placas aqui: a placa principal (mostrada abaixo) e a
ss
placa, que não recebe entradas e gera dois espaços (0x20) para STDOUT.Uma célula em branco é equivalente a a
..
, e qualquer coisa após a#
é um comentário.Cada tick
ss
gera dois espaços para STDOUT.O caminho verde é um loop simples que gera uma nova linha (0x0A) no final de cada 7º tick.
O caminho azul produzirá os números (
Hp
imprime uma bola de gude com dois dígitos hexadecimais) presentes na saída, no final de cada sexto tique.Depois de imprimir
01
uma vez, o loop termina e desce o caminho vermelho, que duplica esse mármore.Uma duplicata é impressa (a segunda
01
) e a outra é enviada pelo caminho preto, que termina a placa na!!
célula. Devido à localização doHp
usado nesta última impressão, ele01
aparece antes dos dois espaços do mesmo tick, e não depois, do comportamento de todas as outrasHp
chamadas.fonte
Python - 11x11
Resultado
É uma solução bastante bagunçada e chata, mas pensei em mostrar isso ...
Esta solução tira proveito do fato de que, se você estiver dentro de um par de colchetes no Python, poderá dividir seu código em várias linhas e adicionar espaços arbitrariamente sem obter um
IndentationError
. Outra maneira de fazer algo assim é encerrando a linha com uma barra invertida.fonte
Python - 7x7 (37 não espaços)
Resultado
Usa o antigo
%
operador de formatação de string do Python para fazer o trabalho:+7
e-7
cuida da justificação direita / esquerda e do último espaço para corresponder ao parêntese de fechamento,print
em particular. Ao preparar a string de formato, também temosfonte
JavaScript (9x9)
Resultado
Notas
Criei e joguei golfe (da melhor maneira possível) para um quadrado com diagonal de qualquer tamanho n:
substituindo os números *** asdf *** por constantes, dependendo do comprimento do lado n, por exemplo, para n = 6:
Mas, mesmo que esse código tenha o tamanho 46, não consegui alinhar o espaço constante com um espaço na diagonal do código até que fosse tão grande quanto um 9x9, com uma linha desperdiçada (a 5ª)
Editar: alterado para adicionar alerta (). Antes:
fonte
CJam, 5x5, 12 não espaços
Não sou um vencedor, mas queria adicionar um envio pequeno e esparso , pois a maioria das respostas imprime apenas uma diagonal.
impressões
Teste aqui.
Os dois últimos caracteres do código não fazem nada; portanto, ele possui apenas 10 bytes de código real. Para uma grade menor, eu poderia reduzi-la em mais dois bytes para 8, mas isso não se encaixa em 3x3, e esse código não funciona para tamanhos de grade iguais.
Como funciona:
fonte
Befunge , 9x9
Eu não tenho idéia do por que fiz isso. Levou caminho muito longo. Eu tenho uma dor de cabeça enorme agora.
Resultado:
Alguma explicação
O código usa
g
para ler os@
caracteres da grade "on the fly" (e também o espaço final, que é@ / 2
), ep
modificar o loop para escrever a última linha de saída.Cada caractere único no código é usado em algum momento, como código ou como dados (o
9
e o@
nas duas últimas linhas).Eu basicamente tive que fazer várias soluções alternativas para fazer o código funcionar. O ponteiro de instruções faz várias interseções durante a execução, das quais algumas são saltadas. (Eu não poderia usar nenhuma instrução lá para direções diferentes, pois elas interfeririam. Não existe NOP.) Em outros lugares, eu reutilizei o mesmo caractere ou apenas o desfiz (veja
$:
no meio).Também fiz alguns trabalhos criativos na pilha:
n,0
. Eu então tenho que diminuirn
. A solução óbvia seria$1-
, mas consegui reduzi-la usando!-
.0
. Organizei o changer de código (20g46p7g46\p
) para usá-lo0
, em vez de desperdiçar 2 caracteres$0
.fonte
!-
; isso é algo que eu faria. Curiosidade: No Funge-98,z
é um NOP.z
não estava listado no wiki e eu usei isso para codificação, o que significava que qualquer não-comando invertia a direção do IP. Bastante teve que refatorar 70% do código devido a um local que deveria ser NOP.Python 3, 8x8
Existem 50 caracteres não espaciais e 14 espaços. A última linha tem um caráter inútil, mas tudo o mais é necessário.
Resultado:
fonte
(a,*b,c)="12345"
... atribuição estrelada é :) interessanteRuby, 8x8
Resultado:
fonte
CJam, 5X5
E a saída é
Eu estava tão perto da solução 4X4.Veja minha outra resposta<sigh>
Experimente online aqui
fonte
C ++, 12x12
Edit: Então, fiquei um pouco obcecado com esse desafio e consegui reduzi-lo de 17x17 para 12x12. Demorei um pouco para perceber que eu poderia usar
/**/
como um delimitador de token. Esse código tira proveito do fato de que uma emenda de linha ainda funciona em Clang com um espaço a seguir, apesar de emitir avisos e arruinar a coloração do código pelo Xcode.Resultado:
fonte
Befunge-98 , 8x8 (56 não espaços [11 nops])
Nota: No interesse de uma boa pessoa esportiva, ela lê sua própria fonte
'
, tornando-a um truque para alguns. Leia o debate aqui .Programa
Resultado
Explicação
A versão sem golfe
(não-espaço e espaço são substituídos por 'n' e 'para facilitar a leitura.)
Essa solução é baseada no fato de que, usando um índice [0, width ^ 2) mod, a largura do quadrado pode dizer se você está no final da linha ou na diagonal. Como todos os espaços são colocados ao longo da diagonal, é fácil saber quando imprimir um não espaço!
Em Pseudocódigo
Discussão
Estou muito orgulhoso disso, apesar de desejar ter feito de todos os não-espaços também um não-nop. Também estou orgulhoso de não ter usado o padrão Befunge get-increment-put trope! Ele imprime símbolos diferentes para o não-espaço, porque eu tinha espaço para isso e não queria ser chato.
Experimente no Windows com o BefungeSharp !
fonte
CJam, 4 x 4 (8 não espaços)
Experimente online no intérprete CJam .
Resultado
Como funciona
N
envia um avanço de linha como uma sequência de singleton.a
quebra essa string em uma matriz.`
inspeciona o resultado, ou seja, empurra uma representação de string da matriz.Este é o resultado:
S*
une a sequência resultante (matriz de caracteres), separando seus elementos usando espaços. Em outras palavras, coloca um caractere de espaço entre todos os pares de caracteres adjacentes da sequência.Este é o resultado:
N
empurra outro avanço de linha.X$
copia o item da pilha no índice 1 (contando a partir do topo), ou seja, a sequência de várias linhas.Por fim, o intérprete imprime todos os itens da pilha: a sequência de múltiplas linhas original, o avanço de linha e a cópia da sequência de várias linhas.
fonte
SOGL V0.12 , 2x2 (2 não espaços)
Experimente aqui!
Resultado
Explicação
No SOGL, todas as linhas, exceto a última, estão substituindo as linhas - ele substitui em todo lugar no código contínuo o último caractere da linha por tudo o que está antes. Então a primeira linha aqui é
replace space with 2 in the next line
.Em seguida, a próxima linha -
2╚
é executada:2
empurra 2 e╚
cria uma diagonal de tamanho 2.fonte
CBM BASIC v2.0 (8 × 8)
Uma melhoria em relação à minha resposta anterior , usando uma abordagem completamente diferente:
Resultado:
fonte
Rubi,
8x87x7Resultado:
Versão anterior, 8x8 com 20 espaços:
Resultado:
fonte
Pushy , quadrado 4x4
Não competir, pois o idioma pós o desafio:
Código:
Saídas:
Experimente online!
Como o espaço em branco é irrelevante no Pushy, o código é facilmente organizado para corresponder ao negativo de sua saída. O programa atual é assim:
As barras invertidas iniciam um comentário; portanto, o final
\o/
está lá para concluir o negativo e parecer legal.Como alternativa, para a mesma pontuação, podemos ter as seguintes soluções:
fonte
Haskell, 10 × 10
Define uma função auxiliar
a ! b
que imprime uma linha do formuláriobbbbbbbbba
e uma função recursivan & c
que imprimen
linhas do formulárioccccccccc␣
seguidas por uma linha do formulário␣␣␣␣␣␣␣␣␣c
.Usa
<$
(fmap const
, novamente) em um intervalo para repetir um caractere. Observe que<$
só está disponível sem importações desde o GHC 7.10, que pós-data deste desafio.Não tenho muita certeza se isso torna este envio não competitivo.Nada realmente emocionante com a escolha do layout ou algoritmo aqui; Eu não tinha muitos bytes de sobra e é uma sorte que as quebras de linha ocorram
putStrLn
da maneira que ocorreram .fonte
05AB1E , 3x3 (6 bytes sem espaço )
Resultado:
Experimente online.
Explicação:
fonte
Perl, 6x6 (26 não espaços)
Passei um tempo analisando essas informações e tinha certeza de que haveria uma solução Perl menor que 7x7 de alguma forma ... Um desafio muito divertido! Esta solução requer
-E
.Uso:
Resultado:
fonte
CBM BASIC v2.0 (9 × 9)
Resultado:
fonte
C (gcc) ,
7x78x8EDIT: versão anterior teve comportamento incorreto.
Experimente online!
fonte
Gelatina , 4 x 4 (12 não espaços)
Experimente online!
Resultado:
Isso foi bem divertido.
Como funciona
Parte fácil: o Jelly ignora os espaços em branco (desde que apenas os bytes de um byte sejam usados).
Parte difícil: cada linha no Jelly é um link (ou função) separado, portanto não é muito curto espalhar uma declaração constante em várias linhas. Usar um literal de cadeia de caracteres é um bom candidato, mas não faz ideia de como gerar o negativo.
fonte