Escolhendo idiomas para o golfe [fechado]


28

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.


Para alguns problemas, é o sistema de tipos. Por exemplo, se você precisar lidar com números inteiros maiores que 64 bits, deseje linguagens incorporadas (por exemplo, Golfscript, Haskell) em vez de linguagens que as tornem caras (por exemplo, Java).
Peter Taylor

Eu criei este wiki de acordo com nossa política sobre perguntas do tipo "Dicas".
dmckee

99 garrafas é útil se você precisar de um começo de linguagem com uma letra específica ...
Jesse Millikan

Elogios a ace, trimsty, algoritmshark e hosch250 por ajudar a tornar esse encadeamento um recurso melhor. Por favor, mantenha as inscrições chegando! Foi uma decisão difícil entre o algoritmos e o hosch250, que se esforçaram bastante , mas no final, Herr Shark concorda com a liderança.
Jonathan Van Matre 25/03

Escolha o idioma que desejar. É também uma competição dentro dos idiomas. Soluções mais exclusivas e interessantes em mais idiomas são boas.
Mego 24/02

Respostas:


-1

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.


2
Como um usuário principalmente python, no Py você paga pela facilidade de uso na contagem de caracteres, embora existam alguns truques realmente hacky que podem salvar os caracteres. Haskel e Lisp, embora divertidos, tendem a correr ainda mais que o Python.
arrdem

Esta provavelmente não deve ser a resposta aceita. A descrição sobre idiomas de alto e baixo nível não tem nada a ver com a contagem de caracteres.
Samy Bencherif

Sim, é realmente justo manter uma resposta de 2011 para uma pergunta editada em 23 de fevereiro de 2017. Talvez devêssemos parar de alterar as perguntas depois que elas forem respondidas?
ewanm89

10

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.

  • Problemas de matemática
  • Resolvendo quebra-cabeças numéricos
  • Executando métodos numéricos
  • Problemas complicados da matriz 2D

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).

  • Problema ao lidar com números primos

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.

  • Processamento de String
  • Processamento de matriz

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.

  • Problemas que requerem solução de E / S, console ou arquivo
  • Problemas que exigem que você escreva sua solução como uma definição de função

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.

  • Problemas que requerem análise
  • Geometria computacional

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;)


Excelente contribuição! Obrigado por ser o primeiro a entrar na piscina.
Jonathan Van Matre

4

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 .


Não sei nada sobre Perl, mas concordo.
Ckjbgames

2

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 deputs

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 X

Problemas 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ém

Problemas 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 Qcó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#


2

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 a diff()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 importinstruções longas . Por exemplo, mathe sysjá 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.)


Boa informação! Obrigado por contribuir.
Jonathan Van Matre

1

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:

A entrada requer a criação de um Scannerobjeto. É difícil inserir um único caractere. Requer especificação de quais tipos você está inserindo.
A análise é bastante simples por causa do forloop. O forloop aprimorado é excelente para isso.
Java suporta métodos, mas a declaração do método é bastante longa.
Java é excelente em matemática, bem como em todas as outras linguagens de alto nível.
É difícil usar Java quando o problema envolve a modificação de cadeias. Você não pode fazer modificações em uma sequência existente.
As matrizes de Java são simples de usar.
Java é bom em recursão.
Java inclui gráficos integrados. Eles são muito fáceis de usar.

C ++

C ++ é uma linguagem muito forte, mas é um pouco demorada ao tentar jogar golfe com 56 caracteres Hello world!.

Entrada e saída são fáceis. Você não precisa especificar quais tipos você está inserindo - isso é feito automaticamente. No entanto, você deve incluir a biblioteca iostream.
A análise é muito fácil.
A declaração de função é simples, mas consome muitos caracteres importantes. O C ++ é excelente em matemática, mas não inclui PI ou E, como o Java.
As seqüências de caracteres do C ++ são fáceis de usar e alterar, conforme necessário.
Uso vectors sempre que possível, em vez de arrays, mas ambos são fáceis de usar.
C ++ é bom em recursão.
C ++ não inclui gráficos internos.

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.

A entrada é fácil, mas tudo é inserido como strings. Você deve converter manualmente toda a entrada para quaisquer valores que desejar.
A análise e o loop são muito simples.
As declarações da função Python são bastante simples e curtas.
Python é bom em matemática.
As strings do Python são simples de usar.
Matrizes são simples de usar.
Python é bom em recursão.
Python não inclui gráficos internos.


Acho que pelo loop for aprimorado, você está falando de um loop range-for. O C ++ suporta isso desde o C ++ 11 ( en.cppreference.com/w/cpp/language/range-for ). É sintaticamente semelhante ao loop for-range Java e requer que a classe do objeto iterável implemente begin () e end () ou begin (T) e end (T) a serem sobrecarregados para o objeto especificado. Também é implementado para seqüências de estilo C e matrizes internas e funciona para todos os contêineres de biblioteca padrão.
foobar

@foobar Sim, eu estava falando sobre isso. Obrigado pela informação, desejo desde que peguei o Java.
Hosch250

O Java agora tem uma solução de 61 bytes, mas seu argumento ainda permanece.
MilkyWay90
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.