Quais são algumas dicas para escolher o idioma certo para o golfe? Quais fatores afetam o idioma a ser escolhido?
Aqui estão alguns exemplos de tipos de problemas:
- Problemas que requerem solução de E / S , console ou arquivo
- Problemas que requerem análise
- Problemas que exigem que você escreva sua solução como uma definição de função
- Problemas de matemática
- Problema ao lidar com números primos
- Resolvendo quebra-cabeças numéricos
- Executando métodos numéricos
- Processamento de String
- Processamento de matriz
- Problemas complicados da matriz 2D
- Geometria computacional
- Recursão
- Gráficos 2D
- Gráficos 3D
- Áudio
- Rede / web
- Processamento paralelo
Não basta dizer coisas como "Use GolfScript | J" porque você gosta delas.
Respostas:
Depende do que for necessário, o C / C ++ é rápido, mas você mesmo deve codificar mais do trabalho. Python e Ruby são mais lentos, mas são muito mais fáceis de codificar com métodos internos que reduzem muito trabalho e manipulam automaticamente valores infinitamente grandes (se houver uma RAM). O uso de uma linguagem funcional como Haskell é excelente para uso funcional puramente matemático, se pudermos enquadrar o problema dessa maneira.
fonte
Colocando meus dois centavos nas linguagens de programação de array , J e APL em particular.
K / Kona, Q e Nial também se enquadram nessa categoria, mas geralmente têm os mesmos benefícios e críticas. Use discrição. Usarei exemplos J abaixo, principalmente porque estes são ASCII e, portanto, fáceis de digitar - lembre-se de que os caracteres APL contam como bytes únicos; portanto, não deixe que esse seja seu problema com o idioma como opção para jogar golfe.
Essas duas são linguagens muito boas de matemática e manipulação de dados, porque lançam matrizes em torno de um nível alto e muitas repetições são feitas implicitamente , dizendo, por exemplo, adicione dez a cada um de 3, 4 e 5 (
10 + 3 4 5
) ou some cada linha de uma matriz (+/"1 arr
- o loop está no"1
).Com problemas com números primos em particular, J possui primitivas rápidas e curtas, assim como alguns dialetos da APL. (Edit: Estou pensando no Nars2000, que é parte do dialeto e parte da implementação completamente diferente. A APL não tem um builtin para números primos.) N-ésimo primo (
p:
), não. de números primos até (_1&p:
), fatoração (q:
), GCD e LCM (+.
e*.
) e assim por diante, há muito por aí. No entanto, na prática, a pergunta geralmente especifica que você precisa preparar suas próprias implementações principais, para que elas não sejam muito usadas. Ainda existem maneiras elegantes e sofisticadas de obter o material principal de que você precisa, isso se torna um pouco menos fácil de copiar e colar.O processamento de matrizes e strings é meio complicado: se é algo em que o APL / J é bom ou tem um idioma primitivo ou comum, é quase trivial; se é algo que é muito seqüencial e não muito paralelo, você vai se divertir muito. Qualquer coisa entre elas está no ar, embora geralmente elas respondam favoravelmente.
IO é estranho. APL tem uma expressão de entrada de um único caractere, mas com J você tem que gastar pelo menos 8 a ler em um número:
".1!:1]1
. A saída é um pouco menos detalhada, mas na prática você ainda está perdendo 6 ou 7 caracteres. J, em particular, realmente gosta muito se você pode receber a entrada como argumentos para uma função, em vez de ter que mexer com o próprio IO.Na prática, com J e APL, geralmente a solução é escrita como uma função que você chama no console. Com o APL, você pode basicamente colocar nomes de variáveis para seus argumentos e agrupar a expressão com a qual estava trabalhando entre chaves e chamá-la por dia.
Mas com J, há um pouco de sobrecarga para definir funções explicitamente
3 :'...'
- e você precisa escapar de todas as strings internas - então o que geralmente é feito é algo chamado programação tácita: você programa no nível da função, combinando primitivas de uma maneira não muito diferente do de Haskell. Isso pode ser uma bênção e uma maldição, porque você não precisa gastar tantos caracteres se referindo aos seus argumentos, mas é fácil se afogar entre parênteses e acabar perdendo dezenas de caracteres tentando invadir sua solução curta e inteligente para algo que funciona.Não tenho experiência em resolver esses problemas em particular, mas vou dizer o seguinte: no final, as linguagens de programação de array são muito boas em canalizar e transformar muitos dados da mesma maneira. Se você pode transformar o problema em um exercício de ordenação de números, pode torná-lo um problema de APL / J, sem suor.
Dito isto, nem tudo é um problema APL / J. Ao contrário do Golfscript, APL e J por acaso eram bons para jogar golfe, juntamente com seus outros benefícios;)
fonte
Por que Perl ainda não foi elogiado? É uma excelente linguagem de golfe, para quase todos, especialmente para coisas relacionadas a cordas (regex).
Burlesco é bom para programas relacionados a números, enquanto Ruby é ótimo para manipulação de texto mais simples.
Na verdade, há uma lista de idiomas e pontuações de golfe por aqui .
fonte
Eu gosto de usar linguagens de programação obscuras para (tentar) fazer o trabalho.
Aqui estão meus favoritos para os detalhes que você listou:
Problemas que requerem solução de E / S, console ou arquivo
Idiomas como o TI-Basic funcionam bem, mas prefiro Ruby por causa de
puts
Problemas que requerem análise
O GolfScript definitivamente o ajudará aqui
Problemas que exigem que você escreva sua solução como uma definição de função
TI-84 Tabela - permite funções como,
Y=
por exemplo,Y=|X|
retorna o valor absoluto de XProblemas de matemática
TI-Basic - feito para uma calculadora, por isso inclui matemática;)
Problema ao lidar com números primos
Nada especial; O Mathematica é provavelmente a ferramenta certa para o trabalho
Resolvendo quebra-cabeças numéricos
TI-Basic, uma vez que percorre automaticamente as matrizes
Executando métodos numéricos
TI-Basic ou Mathematica
Processamento de String
Python - possui ótimas funções de string.
Não importa o quão bom você ache que o TI-Basic seja, não o use para strings ...
Processamento de matriz
TI-Basic - circula automaticamente através de matrizes ; por exemplo, incrementar todos os valores na matriz -
L1+1→L1
Ruby - também possui recursos de matriz muito poderosos e, claro
!
, ajudará a comprimir o código tambémProblemas complicados da matriz 2D
Ruby ou Python funcionam melhor aqui, pois o TI-Basic não suporta matrizes 2D
Geometria computacional
O TI-Basic possui recursos geométricos e pode ser usado para a maioria das matemáticas, até Cálculo e Álgebra Linear
BÔNUS
Looping
Ou Arduino ou Quomplex . O Arduino possui um built-in
void loop(){}
e o Quomplex possui os loops infinitos contidos entre colchetes ([]
)Desenho / GUI
O Game Maker Language possuirecursos de desenho muito poderosos, e o TI-Basic também é uma ferramenta geralmente útil devido ao suporte para desenhar no gráfico.
Quines
O HQ9 + ou o Quomplex, porque o HQ9 + deve gerar o
Q
código-fonte do programa e o Quomplex imprimirá automaticamente o código-fonte, a menos que*
(saída) seja especificada ou que não produza saída, definida com#
fonte
Se você está resolvendo um problema de matemática e não possui o Mathematica, tente o Sage . Ele é baseado em Python, portanto, se você já conhece o Python, não precisa de muito tempo para aprender sua sintaxe.
Exemplos:
Também é útil para plotagem de gráficos e solução de equações (por exemplo, você pode usar a
solve()
função no Sage ou, se isso for proibido pelas regras, permite uma fácil implementação do processo de Newton Raphson, pois possui adiff()
função que pode executar diferenciação simbólica) .Além disso, se você é um programador Python2, o uso do Sage pode permitir que você trapaceie pulando as
import
instruções longas . Por exemplo,math
esys
já são importados por padrão. (Observe que isso pode não funcionar se o seu programa Python2 depender da divisão de números inteiros.)fonte
Conheço três linguagens - Java, C ++ e Python 3. Não conheço nenhuma delas em alto nível, mas essa é minha experiência com elas.
Java:
Eu nunca usaria o Java para jogar novamente. Leva mais de 80 caracteres apenas para escrever
Hello World!
. No entanto, tem seus pontos fortes:C ++
C ++ é uma linguagem muito forte, mas é um pouco demorada ao tentar jogar golfe com 56 caracteres
Hello world!
.Python 3
Python 3 é semelhante ao C ++ e Java. É muito mais curto, pois não é fortemente tipado - em outras palavras, apenas adivinha quais são as variáveis.
fonte