Sua tarefa - se você a aceitar - é escrever um programa que ajude a entender minha proposta no meta , calculando o vencedor de uma competição invertida com código de golfe . Obviamente, as respostas a essa pergunta serão tratadas como propostas, para que seu programa (se correto) possa calcular se sua resposta se tornará a resposta aceita.
Regras
- O programa lê um arquivo com várias linhas do seguinte formato (veja o exemplo abaixo): TAB [Language] [TAB] [NumberOfCharacters] TAB [LinkToAnswer]
- O nome do arquivo é passado como argumento para o seu programa ou o arquivo é redirecionado para a entrada padrão do seu programa. A escolha é sua, por favor mencione o método ao dar a resposta
- É esperado que o formato de entrada esteja correto. Não há necessidade de tratamento de erros.
- O número de caracteres é positivo. Seu programa deve lidar com comprimentos de até 65535. 64k deve ser suficiente para todos :-)
- O programa gera as linhas na saída padrão que atendem à idéia da meta proposta, ou seja,
- o código mais curto de uma linguagem de programação específica vence (fase de redução)
- o código mais longo de todas as linguagens de programação vence (fase de classificação)
- em caso de empate, todas as respostas com o mesmo comprimento devem ser impressas
- A ordem da saída não é importante
- Embora o código mais longo ganhe, esse não é o código do boliche . Seu código deve ser o mais curto possível para sua linguagem de programação.
- As respostas sobre raramente as linguagens de programação que não estão tentando reduzir o código merecem um voto negativo, porque tentam ignorar a intenção desse tipo de pergunta. Se houver apenas uma resposta para uma linguagem de programação específica, ela será considerada uma candidata vencedora, para que você possa começar a soprar seu código.
Arquivo de entrada de exemplo (separado por guias únicas, se houver um problema com a formatação):
GolfScript 34 http://short.url/answer/ags
GolfScript 42 http://short.url/answer/gsq
C# 210 http://short.url/answer/cs2
Java 208 http://short.url/answer/jav
C# 208 http://short.url/answer/poi
J 23 http://short.url/answer/jsh
Ruby 67 http://short.url/answer/rub
C# 208 http://short.url/answer/yac
GolfScript 210 http://short.url/answer/210
Saída esperada (a ordem não é importante):
C# 208 http://short.url/answer/poi
C# 208 http://short.url/answer/yac
Java 208 http://short.url/answer/jav
Atualizar
Alguns programas se baseiam no fato de que há um único máximo (como o programa de caracteres C # 210). Derivado da realidade, alguém também pode escrever um programa GolfScript com 210 caracteres. A saída permaneceria a mesma. Eu adicionei um GolfScript à entrada.
Atualização 2
Como sugerido, retirei novamente (ainda código-golfe também) e o prazo é 06/03/2014 (que parece uma data arbitrária, mas voltarei para a Alemanha depois de viajar).
Resultados finais
Decidi votar da seguinte forma:
- As respostas em que o número de caracteres não pode ser confirmado recebem um comentário para explicar a contagem.
- As respostas que podem ser facilmente reduzidas recebem um comentário, uma sugestão de edição e entram no resultado com o menor valor de contagem. (Espero ter visto isso com antecedência).
- Respostas que não são compiladas recebem um voto negativo. (Bastante uma tarefa difícil, como se vê).
- As respostas que não são jogadas no golfe recebem um voto negativo (conforme descrito nas regras já).
- As respostas que produzem o resultado esperado recebem um voto positivo. Devido a algumas respostas que não funcionam conforme o esperado, eu uso 4 arquivos de entrada diferentes e verifico o resultado esperado.
Finalmente, o vencedor é determinado fornecendo a tabela de respostas qualificadas como entrada para o meu programa de referência (além de verificar o resultado manualmente). Se minha resposta fosse a vencedora, eu a excluiria da lista. No caso de vários vencedores, eu teria que escolher apenas um. Portanto, alguns bônus podem ser ganhos:
- respostas que aceitam mais informações do que o esperado (por exemplo, fora dos intervalos definidos)
- respostas que usam uma idéia inteligente de torná-lo curto
Tirei um instantâneo das respostas em 6 de março de 2014, 19:45 UTC + 1. A análise está em andamento. Verificar todas as respostas é mais difícil do que o esperado ...
fonte
Respostas:
Java - 556
O programa lerá em STDIN.
ArrayIndexOutOfBoundsException
quando uma linha em branco for encontrada ouNoSuchElementException
se a entrada terminar sem seguir uma nova linha). Cada linha lida é adicionada aoTreeMap m
, que poderia ter sido definida comoTreeMap<String, TreeMap<Long, TreeMap<String,String[]>>>
(da esquerda para a direita: idioma, tamanho do código, URL, entrada).TreeSet<Long, TreeSet<String, String[]>> n
(da esquerda para a direita: tamanho do código, URL, entrada) é construído onde o conteúdo de todos os idiomasfirstEntry()
é agregado.lastEntry()
do agregadoTreeMap
contém nosso resultado - precisamos apenas imprimi-lo.Experimente em ideone.com (as duas últimas linhas de entrada alteradas para mostrar que todas as linhas são lidas)
fonte
Perl, 195 bytes
A entrada é esperada em STDIN, o resultado é gravado em STDOUT:
Versão ungolfed
fonte
GolfScript 210 http://short.url/answer/210
linha à entrada e ver se a saída permanece a mesma. Na verdade, acho que o seu não é afetado, porque você está usando [0] para o máximo, mas não tenho o Perl disponível no momento para tentar.%l
/%language
contém os idiomas e seus valores mínimos. A estrutura de dados%a
/%array
contém apenas os pares de idioma / URL, cujo valor é o mínimo para esse idioma. Em seguida, os valores mínimos são classificados em ordem decrescente e o primeiro é usado como máximo global e como condição de filtro para%a
/%array
.Python
378377372Entrada no stdin:
E é isso que eu tinha antes de começar a compactá-lo, em 551 caracteres:
fonte
C # - 628
Aqui está uma alternativa mais longa que usa
DataTable
:Originalmente, pensei que poderia ter conseguido uma leve redução de código usando max / min com
DataTable
, mas os tipos necessários para criar oDataTable
(linhas / colunas / exibição) adicionam muito comprimento, infelizmente. Eu sou novo em codificar golfe, então talvez alguém possa reduzi-lo ainda mais. Ainda é um desafio divertido.fonte
dg -
286281260251218 bytesExemplo:
Versão não destruída :
Q: O que diabos é dg?
R: Uma linguagem de programação que é compilada no bytecode do CPython, assim como o Scala é compilado nas JVMs. Isso significa essencialmente que o dg é uma sintaxe alternativa para o Python 3. Ele permite que você use todas as bibliotecas existentes também.
Mais informações aqui (mesmo um tutorial!): Https://pyos.github.io/dg
fonte
cat langs.dg | wc -c
eu recebo 218!Rebol - 314
sem golfe
Exemplo de uso:
fonte
C # - 515
Espera um nome de arquivo como argumento
Primeiro, eu projetei meu programa C # para ser direto, porque queria ter um tipo de programa de referência. Mas então eu decidi também entrar em uma competição e jogar golfe. Esta é uma das versões anteriores do código + alguns comentários:
fonte
C # -
460359Depois de perceber o quão volumoso meu
DataTable
era solução, criei o seguinte exemplo usando o Linq. Ele usa a mesma metodologia da minha solução anterior.Golfe
Ungolfed
Eu ainda sou bastante novo no Linq, então tenho quase certeza de que essas expressões podem ser reduzidas ainda mais.
Na sua pergunta, não está claro se existe uma única solução de comprimento máximo. Para minhas respostas, usei a suposição de que existe um único ponto máximo (por exemplo, se também houver um máximo de 210 no GolfScript, ele poderá falhar com base no registro máximo único retornado). A solução da Heiko teria o mesmo problema. Para corrigir isso, teríamos de adicionar outra etapa que continha uma lista de máximos vinculados para verificar os mínimos para cada idioma.
fonte
namespace System{using Linq;using IO;class p{static void Main(string[]i){var l=(from f in File.ReadAllLines(i[0])let s=f.Split('\t') select new Tuple<string, int, string>(s[0],Convert.ToInt16(s[1]),f)).ToList();foreach(var f in l.Where(a=>a.Item2==l.Where(b=>b.Item1==l.Single(c=>c.Item2==l.Max(d=>d.Item2)).Item1).Min(e=>e.Item2)))Console.WriteLine(f.Item3);}}}
Golfscript 100 ...
,C# 1 ...
,C# 200 ...
. Isso provavelmente precisa de algum retrabalhoC ++ - 535
Somente produzirá as respostas empatadas para a posição mais longa depois de selecionar apenas as respostas mais curtas de cada idioma como possíveis vencedores.
Golfe (não tão ilegível quanto alguns idiomas):
fonte