Estou tentando jogar golfe em C ++. É possível diminuir essa condição?
X > 3 & X - Y > 1
(Além de remover o espaço em branco, é claro.)
Então, X
é pelo menos 4
mas X >= Y + 2
.
X
e Y
são inteiros no intervalo [0,5].
Eu tentei encontrar alguma fórmula bit a bit, mas falhei.
code-golf
number
tips
c++
code-golf
popularity-contest
obfuscation
code-golf
c
code-golf
board-game
hexagonal-grid
code-golf
game
grid
code-golf
number
permutations
popularity-contest
math
graphical-output
number-theory
king-of-the-hill
code-challenge
compression
code-challenge
fastest-code
code-golf
math
ascii-art
animation
code-golf
popularity-contest
generation
counting
fastest-code
fastest-code
popularity-contest
image-processing
king-of-the-hill
code-golf
conversion
binary-tree
code-golf
math
number
rational-numbers
division
code-golf
restricted-source
hashing
atomic-code-golf
logic-gates
code-golf
function
code-challenge
puzzle-solver
ai-player
test-battery
popularity-contest
music
compression
code-golf
number
stack
atomic-code-golf
logic-gates
ascii-art
popularity-contest
code-golf
date
grid
code-challenge
game
code-golf
parsing
code-golf
math
geometry
sequence
popularity-contest
code-trolling
code-golf
string
restricted-source
code-golf
quine
king-of-the-hill
code-golf
math
code-golf
simulation
code-golf
ascii-art
code-challenge
sorting
optimization
Cristy
fonte
fonte
x*x-y*y>9
. É a mesma quantidade de caracteres, mas você pode encontrar um atalho / alternativa a essa abordagem. Apenas outra maneira de ver isso.3<x>y+1
y+3<2^x
, mas a precedência do operador do C é diferente. Eu estou apostando há uma solução de 7-char, só tem que modificar meu script para lidar com C precedência do operador em vezRespostas:
Depois de forçar brutalmente todas as combinações úteis de símbolos com menos de 9 caracteres, descobri que não há solução menor do que
x>3&x-y>1
.Por diversão, aqui estão algumas soluções descoladas de 9 personagens que o bruto encontrou:
O forçamento bruto foi feito em Python, construindo árvores de sintaxe de cima para baixo, nas quais nenhum filho pode ter um operador com precedência menor que seu pai, de acordo com as regras de C. Para reduzir as possibilidades, permiti apenas literais de um dígito e nenhum operador binário pode ter dois filhos constantes. Eu não conseguia pensar em nenhuma solução que tivesse um literal de dois dígitos ou que construa uma constante usando um operador binário. Cada expressão foi avaliada para [0, 5] e, se corresponder, será impressa.
fonte
x*x-y*y>9
. Talvez você deva tentar constantes com vários dígitos também? (também entre parênteses)xy
e 2 devem ser parênteses, deixando apenas 4 caracteres de lógica. Vou tentar executar o forute bruto com constantes de 2 dígitos, mas realmente não acho que isso dará um resultado.(a#b)$c
é o formato. Um dosabc
dois deve serx
ey
, deixando três locais possíveis para[0-9xy]
e apenas um delesxy
. Apenas operadores interessantes são+-*/&|^<>
, portanto, 9 possibilidades. Assim, as possibilidades no total é menos do que 3 * 12 * 2 * 9 * 9 <5832.Em resposta aos (impressionantes) campos de golfe por
orlp
:A correção deve vir primeiro
int16_t
- para que haja a suposição. Provavelmente, as trocas de bits precisariam de +16 por ints de 32 bits (que estão praticamente em todos os lugares hoje em dia). Isso os torna um personagem maior ...A única maneira "correta" de escrevê-lo, é a IMO
(x>3) && (x > y+1)
, que pode ter atéx>3&x>y+1
9 caracteres.(Você realmente precisa levar em consideração a possibilidade de tipos não assinados (maiores), especialmente porque a assinatura não assinada é "contagiosa" nas expressões C ++. Suponho que "consertar" que, com os
static_cast<>
s apropriados, acabaria com o objetivo ...)ATUALIZAR
Com os seguintes testes, consegui descobrir quais expressões realmente funcionam de maneira confiável:
Live On Coliru
Saída em coliru, aqui para referência:
Sumário
Como esse é o "custo" de repetir os elementos do código-fonte, você pode usar uma tabela de pesquisa. Você pode "ocultar" a tabela de pesquisa, para que seja
ou
Claro que você pode ser pedante e obtuso e renomear o LUT
Então, minha "versão" é ... 7 caracteres . (Ou faça se uma função e
L(x,y)
é ainda mais curta).Ou, mais importante: correto, testável e sustentável.
fonte