Inspirado pela má sorte de digitar um número de dígitos sem usar uma matriz , mas achei que ele produzia um código de golfe melhor do que a questão SO.
Dado um número inteiro positivo, classifique os dígitos nesse número inteiro.
Menor pontuação ganha!
- Comece com 0 pontos.
- Adicione um ponto por caractere.
- Adicione 20 pontos para cada matriz que você usa.
- Adicione 10 pontos para cada seqüência de caracteres múltiplos no seu código. (Exceto a entrada inicial, desde que seja convertida em um número inteiro sem nenhuma outra operação feita.)
- Adicione 32 pontos se o número máximo de dígitos que seu programa puder manipular for limitado pelo programa (em oposição à máquina).
- Subtraia 10 pontos se o seu código puder alterar a direção da classificação dada outro argumento (o que você quiser, mas por exemplo 0 para classificação decrescente e 1 para ascendente).
Cada idioma é diferente, mas a idéia é evitar qualquer tipo de invasão de dígitos iteráveis.
Exemplo:
Entrada : 52146729
Saída : 97654221 ou 12245679
Notas:
- Use qualquer recurso interno de classificação que sua linguagem de programação ofereça, mas se esse recurso envolver seqüências de caracteres ou matrizes, tome a penalidade!
- Você pode escrever a solução como uma função que pega um número inteiro diretamente ou como um programa que pega um argumento do argv, um arquivo ou fluxo e o converte em um número inteiro. Contanto que você o converta em um número inteiro imediatamente e descarte a entrada char * original sem executar nenhuma operação adicional, nenhuma penalidade será aplicada.
- As penalidades se aplicam não apenas aos literais de cadeia de caracteres no texto do programa, mas a qualquer parte do recurso do programa que indiscutivelmente insira ou produza uma cadeia ou iterável. Por exemplo, o JavaScript
String.prototype.split
tem pelo menos uma string como input (this
) e uma Matriz como saída, então +30 para usá-lo. - Eu tentei fazer essas regras guiarem o princípio do design do algoritmo, não a E / S inicial / final (daí a nota 2). Eu não acho que a penalidade deva ser aplicada
int(input())
mesmo queinput
a assinatura diga que retorna uma string, desde que essa expressão seja o ponto de entrada inicial do programa. Da mesma forma, se a saída final do programa éprint(x)
ex
deve ser uma sequência, a penalidade não se aplica à operação de conversão de sequência da última vala. Tudo o que foi dito, eu nunca disse explicitamente que esse tinha que ser um programa ou de onde a E / S tinha que vir ou ir. Uma função que recebeint
e retorna umint
serviria e não sofreria com essas ambiguidades.
code-challenge
sorting
kojiro
fonte
fonte
" "
como uma cadeia de caracteres múltiplos ? Um único caractere não seria considerado como "multi" ...Respostas:
GolfScript,
114(4 + 10 (sequência) - 10 (opção inversa))
Entrada em STDIN.
O formato de entrada é este:
1
ordenar normalmente,-1
reverter. 4 caracteres - 10 para a opção inversa = pontuação de -6.A entrada é tecnicamente uma string, então não tenho certeza se isso conta com +10. Estou interpretando a regra como "uma string declarada no seu programa" (já que diz "no seu código").
Resposta antiga (pontuação 11):
fonte
~
converte imediatamente em número inteiro. Mas então é convertido novamente em uma string com`
. A conversão em uma string conta? Porque às vezes a string pode não ter vários caracteres (entrada de 1 dígito)chr
), tudo bem.Haskell 106
exemplo:
Uma resposta que não se esquiva da pergunta.
Uma explicação foi solicitada, aqui é não destruída. É um tipo de bolha muito ineficiente.
Respostas mais curtas existem em Haskell, equivalente a algumas das outras postadas, por exemplo:
... pontuação 52 + 20 = 72, ou isso, pontuação 45 + 20 = 65:
... mas o espírito da pergunta - sem matrizes, strings ou caracteres - é mais interessante.
fonte
Integer.MAX_VALUE
-it leva umint
. O meu, e alguns dos outros, aceitam qualquer tamanho de entrada - o tipo de entrada des
éInteger
equivalenteBigDecimal
em java. Não foi o que eu entendi a pergunta, pensei que estava penalizando respostas que 'ordenam' apenas números de um dígito.Montagem C + x86, 636
Eu sei que isso não vai ganhar, mas parecia tão antinatural e distorcido que eu tive que compartilhar. Sem matrizes ou strings (contanto que você não conte os argumentos de entrada). O número de dígitos é limitado pelo intervalo de 32 bits.
Então, aqui está uma pequena explicação sobre o que eu fiz:
Pensei em fazer isso sem usar matrizes ou seqüências de caracteres e, em seguida, a recursão veio à mente, mas é claro, com a recursão, não seria capaz de trocar valores de outras chamadas recursivas ... e foi quando percebi que havia um caminho. Vinculando meu programa C com uma função assembly, eu poderia pular a pilha e retornar um ponteiro para o ponteiro base da chamada desejada, é isso que a função "recursionStackAt" faz. É claro que recursionStackAt é uma função muito feia, seu resultado não depende apenas do estado da entrada ou do programa, mas do próprio chamador. Observe que foi isso que me fez mudar os índices de 0 para 1 com base.
Sem mais delongas, aqui está o código:
E, claro, o código de montagem x86 (AT&T sintax, btw) para a função recursionStackAt:
Alguns exemplos na saída: (1 significa aumentar e 0 diminuir)
Aqui está a versão ofuscada (que é ilegível, mas funciona bem):
http://pastebin.com/XkYt9DLy (código C) http://pastebin.com/h0S0dfeU (código x86)
Portanto, se o LibreOffice não está mentindo, meu código ofuscado consiste em 646 caracteres (sem espaços, devo contá-los?) E com todas as outras condições atendidas, recebo um -10 para a opção crescente / decrescente.
Ah, e para compilar isso, você deve fazer (em sistemas similares ao Unix)
Observe que o sinalizador -m32 é apenas se você estiver em uma máquina de 64 bits. Você também precisa das bibliotecas de 32 bits para compilá-lo.
fonte
Bash (eco) (0 + 7 + 0 + 0 + 32-10) = 29
Sorta:
Uso:
Use "-e" para ordenar ao contrário:
EDIT: alterado "cat" para "eco", para que realmente funcionasse. EDIT 2: Adicionado "$ *" e colocado no script "sorta"
fonte
-e
poderia ser usado como argumento para a saída reversa.Python3
Meu script apresenta:
Sem matrizes
Sem strings
A complexidade é O (n): usei countingsort (modificado por mim para não usar matrizes, mas números primos para contar ocorrências)
Sem limitações de tamanho
Personagens:
260234fonte
P
pode ser escritolambda l:((((29-6*l%2,19-2*l%2)[l<9],13-2*l%2)[l<7],2*l-1)[l<5],2)[l==1]
, eliminando alguns caracteres. Eu posso ter estragado um pouco, mas a idéia é usar uma versão aninhada do ternário Python da velha escola (antes do Python ter um ternário)(false_result, true_result)[boolean]
.Bash + coreutils, 14 (24 caracteres - 10 para reverso)
Eu acho que isso pode estar distorcendo um pouco as regras, mas aqui vai, é sexta-feira ...
Presumo que o uso de bibliotecas padrão seja permitido. Minha interpretação da biblioteca padrão para
bash
écoreutils
:Entrada de stdin. Em uso:
fonte
bash
a idéia de números inteiros (declare -i). Editado.tr
não gosta da sua sintaxe, o que custaria um caractere nesses sistemas.) De qualquer forma, eu diria que essas ainda são todas as operações de string no coração.declare -i
não torna um nome um número inteiro, apenas faz com que o shell use um contexto aritmético no RHS das expressões de atribuição.C - 64 caracteres, 64 pontos
Você pode se perguntar como eu faço isso funcionar sem nenhum cabeçalho. Simples, compile com:
Sem golfe:
Também decidi incluir a classificação dos personagens, apenas porque eu podia.
Execuções de teste:
fonte
main(int a,char**b){b++;qsort(*b,strlen(*b),1,strcmp);puts(*b);}
qual é mais curto.c(*a
, minha versão do gcc insistia que precisávamos fazer issoc(char*a
.função c (arco little-endian),
131108 caracteresNenhum desafio de classificação está completo sem uma resposta do tipo dorminhoco . Este levará 10 segundos para retornar, mas funciona, e acho que está dentro das especificações. Essa função usa um único parâmetro int e retorna um int com os dígitos decimais classificados:
novas linhas e recuo adicionados para facilitar a leitura
Ligue da seguinte maneira:
fonte
?:
vez deif-else
.fork()?c++:(sleep(d),exit(d));
(,)
.Java: 262 pontos
Sim, sim, eu sei, é impossível, mas ainda assim ..
Análise (marcação):
StringBuffer
(usei porque é mais curto queStringBuilder
) (pontuação = 262 + 10 = 272)Uso:
Quando você tenta compilar o
G.java
arquivo no prompt de comando, ele gera muitos problemas (erros). Então, a solução?Então, essa classe deve ser chamada por um
main()
método de qualquer outra classe (ou mesmo da própria classe). Estou colocando em outra classe, por isso não estou adicionando à minha contagem de caracteres. Compile a outra classe de maneira semelhante (sem usarcmd
). Agora omain()
método na outra classe deve ser algo como:Excluindo espaços desnecessários, comentários e quebras de linha, são outros 93 caracteres. Não estou adicionando ao meu personagem, porque isso é apenas para demonstração através do console.
Resultado:
ZERO, ou seja,
0
é considerado. Supondo que a classe externa sejaHelper.java
e tenha sido compilada com êxito, alguns exemplos no console são:Quando alterado para
0
ie descendente ...NOTAS:
G.java
. Essa é a classe principal .Integer.MAX_VALUE
porque esse é o tamanho máximo que qualquer matriz pode conter (em Java).fonte
TeX / Látex (332)
Se o código real estiver em um pacote
s
, o arquivo principal do LaTeX parecerá fácil e agradável. O número é dado apenas como matemática. Se o número for negativo, a ordem de classificação será revertida. O código do pacotes
também pode ser usado com TeX simples, exemplo mais abaixo.O pacote
s
(uma linha, as extremidades da linha não são necessárias):Resultado:
Pontuação: sem esperança
Usando TeX comum com
etex
oupdftex
, o arquivo pode ser reduzido para:<contents of s.sty>\rm\shipout\hbox{$<number>$}\bye
Bytes: 318 bytes (
s.sty
) + 24 bytes para o restante sem o númeroMatrizes não são usadas: 0
Não vejo cadeias de caracteres múltiplos: 0
O número não é limitado pelo algoritmo. O maior número TeX é 2 31 - 1 = 2147483647. O exemplo usa um número de 66 dígitos, muito maior: 0
Se um sinal de menos é dado, a ordem de classificação é revertida para decrescente: -10
0 + 318 + 24 + 0 + 0 - 10 = 332
Algoritmo:
Os dígitos são transformados em caracteres ativos no modo matemático. Cada dígito lembra e coleta cada uso em uma macro. Após o modo matemático, as macros são exibidas com os dígitos em ordem crescente.
A mudança de direção é feita pelo texto da direita para a esquerda, um recurso e-TeX.
Versão degolfada do código em
s.sty
Reprodução
Existem alguns compiladores LaTeX online, uma lista pode ser encontrada aqui . Tentei o primeiro item da lista, servlet LaTeX em sciencesoft.at . Ele pode ser usado sem assinatura e também pode criar URLs permanentes: origem e resultado como imagem .
fonte
C - 65
O observador astuto notará que esse algoritmo de classificação é executado em O (n) tempo no número de dígitos em
n
.O observador pragmático observará que esse algoritmo de classificação é executado no tempo proporcional ao intervalo de números inteiros assinados na plataforma, que muda o estado global que deve ser reinicializado entre as execuções e que muitos outros sacrifícios foram feitos em favor da brevidade.
A versão não-gasta não é exatamente equivalente, mas transmite melhor o algoritmo real envolvido.
Aqui está um equipamento de teste para a função:
fonte
Haskell - 96
96 caracteres, sem matrizes, sem strings, sem limite de número inteiro, não podem reverter
Exemplos:
Este é um tipo de inserção, realizado diretamente nos próprios números inteiros. Isso é semelhante à outra entrada de Haskell, que é do tipo bolha, apesar de eu jurar que estava trabalhando nela antes de ver essa.
Breve guia:
d
divide um número em unidades e dezenas, ou seja:d 135
é o par(13,5)
a%x
é ordenada inserção de dígitoa
no númerox
a&x
classificax
inserindo o dígito das unidadesa
e recorrendo no resultado e no restantes x
classifica x iniciando a&
recursão em 0 ex
O truque é que o segundo argumento de
%
e&
não éx
diretamente, masx
divMod'd usandod
fonte
Python3.3 61 pontos
Este programa recebe a entrada como uma string, que conta como uma string porque não é alterada para um número inteiro imediatamente. +10
A sequência é classificada em uma matriz +10
Essa matriz é unida em uma sequência +10
Nota: O
''
usado para unir o conteúdo da matriz não é uma cadeia de caracteres múltiplos, portanto +10 não é adicionado à pontuação.O programa consiste em 31 caracteres. +31
31 + 10 + 10 + 10 = 61 pontos
fonte
print(int(''.join(sorted(input()))))
, mas a conversão para número inteiro apenas adicionou pontos e não fez o código seguir as regras mais de perto. Eu realmente não permaneci fiel ao desafio que suponho. Mas ele afirma que a entrada pode ser uma sequência de caracteres e a saída pode ser uma sequência de caracteres (para instruções de impressão) e não diz nada sobre isso:]]J, 10 caracteres (+ 1 corda) pontuação = 20
Uso:
Funciona para todos os números de 32 bits.
Explicação:
/:~
classificar&.
em":
formato. Minha versão anterior também usava uma matriz, mas eles são caros, portanto agora eu preciso usar apenas uma string e classificar os caracteres em ordem alfabética.":
converte o número que é inserido em uma sequência e/:~
classifica os dígitos em ordem crescente. Como a classificação é feita no formato 'sob', quando a classificação é concluída, a sequência é convertida novamente em um número. Adicionar a capacidade de reverter provavelmente custaria mais do que economiza, então não me incomodei.Pode-se argumentar que, como J, como APL e K, é uma linguagem baseada em array, a entrada única é um array de 1 item, mas optei por não adotar uma visão tão dura ao calcular minha pontuação.
O limite de 32 bits é imposto por J, e não pelo meu programa. Qualquer valor mais alto e J muda os números para notação científica. Não está claro se a penalidade de 32 pontos se aplica neste caso, mas mesmo que as duas penalidades anteriores se apliquem (acho que não deveriam), a pontuação sobe para 72 e ainda bate confortavelmente na grande maioria das outras. respostas.
fonte
Python 2.7: 174
Ele funciona criando um dicionário mapeando todos os 10 dígitos para 0. Em seguida, itera sobre o comprimento do número (
log10(i)
), extrai cada dígito ((i / (10 ** c)) % 10
) e incrementa o contador desse dígito no dicionário. Por fim, ele cria uma sequência feita repetindo todos os 10 dígitos e para cada dígito produzindo uma instância do dígito como uma sequência.Eu poderia alterar a última linha para a
print"".join(d[n]*str(n)for n in xrange(10))
qual seriam 16 caracteres a menos, mas usaria cadeias de caracteres múltiplos.fonte
i=int(input())
pode seri=input()
tãoinput()
automaticamente avalia o número.C (até C90)
ou C ++,7866 pontosA função que classifica um número inteiro é chamada
s
.Pontuação:
int
) (+0)Versão antiga (78 pontos, funciona também com C ++ e versões C mais modernas)
fonte
C # - 179
Sem golfe
Teste
Normal:
Invertida:
Pontos: (espero ter entendido o sistema de pontos corretamente - sinta-se à vontade para corrigir)
C # com LINQPAD - 123
Teste
Normal:
Invertida:
Pontos:
fonte
Java 1469
Uma solução livre de string e array em Java. 1437 caracteres + 32 porque leva apenas Long.MAX_VALUE como entrada. Ao usar o Double, eu poderia ir para mais de 300 dígitos, mas isso seria muito tedioso para implementar. Qualquer coisa maior que isso precisaria do BigInteger e do AFAIK que usam matrizes internamente. Se você usar menos de 19 dígitos para a entrada, a saída terá zeros à esquerda. A entrada negativa fornecerá todos os zeros e qualquer coisa que não seja um número causará uma exceção.
Para o tipo que eu usei o mais fácil que eu consegui pensar, é bastante ineficiente. (deve ser O (n * n))
Sei que isso realmente não se compara às soluções em outras linguagens, mas acho que pelo menos é o mais curto possível em Java. (se alguém souber como reduzir ainda mais esse problema, fique à vontade para editar / comentar)
fonte
AWK - 101
O arquivo 'x':
A corrida:
A única matriz usada é o ARGV e isso não ajuda na classificação, apenas o acesso aos parâmetros da linha de comando e esses valores estão em variáveis que não são da matriz, onde são realmente necessários para os cálculos. Eu acho que isso não conta contra essa solução. O cálculo a seguir não leva em consideração o array ARGV:
111 (caracteres) - 10 (pode fazer o inverso)
fonte
Não vejo nada sobre a classificação de funções na pergunta, então ... (removerei a resposta se ela dobrar ou quebrar as regras, avise-me)
JavaScript
5696JavaScript
69109 (reversível)Pode jogar um pouco de golfe usando as funções de seta do EcmaScript 6 :
ES6
5090ES6
63103 (reversível) (73-10)fonte
prompt
retorna uma string (que você não converte imediatamente em um número inteiro): +10;split
retorna uma matriz: +20;sort
faz uma classificação no local (por isso ainda é a mesma matriz);join
retorna uma nova string, +10. Total: 96.Caracteres SED 67 (pontuação 67 ou 107)
Isso usa uma classificação de bolha por questões de concisão. A pontuação seria 107 se cada padrão de expressão regular e substituição contar como uma string (ou seja, 67 + (10 * 4))
Número de dígitos manipulados limitados pela memória (e provavelmente paciência)
fonte
Função lambda Python (reversível), 69
n
(entrada) e''.join(...)
(+20)sorted(...)
(+20)d
(-10)Função lambda Python (não reversível), 67
EDIT: Entrada deve ser uma seqüência de caracteres. Estou considerando a penalidade de usar essa string diretamente.
fonte
raw_input([prompt]) -> string
, assimsorted(raw_input())
como +10. Além dissosorted -> new sorted list
, então +20. Então,S.join -> string
então +10 novamente. A notação de fatia também implica seqüências de caracteres, então +10 (qualquer outra coisa que suporte a notação de fatia seria provavelmente +20). Então eu calculo 73 e 108, respectivamente.print
é em vez dereturn
ing?lambda
aqui.)print
é mais curto e não requer invólucros. Eu não sabia que você permitiria funções lambda. Tipo de cara quando eu li isso. Está correto agora?''.join(sorted(str(n)))
? .could dizer-me por que isso não será considerado como uma resposta estou meio novoLisp comum - 126
A versão não-golfe (estilisticamente, bem como lexicamente, mas funcionalmente idêntica):
Os dígitos de um número negativo são tratados como tendo valor negativo, e os dígitos são classificados com o menor número de significantes primeiro (isto é, little-endian). Exemplos:
Existem 136 caracteres na versão em golf, incluindo espaço em branco. Ele não usa seqüências de caracteres nem matrizes e lida com números inteiros de precisão arbitrária, incluindo números negativos. A classificação é parametrizada em um predicado binário que define uma ordem total dos números inteiros
[-9, 9]
, incluindo, mas não se limitando a,<
e>
:Isso dá uma pontuação de 126.
fonte
JavaScript 416/185
Sem matrizes, sem strings, sem restrições arbitrárias de comprimento ...
Mas classificar para cima / para baixo teria usado mais de 10 caracteres ^^ Mas achei a ideia de contar dígitos e imprimi-los interessantes - talvez alguém possa usar essa idéia no GolfScript e ganhar o prêmio ;-)
O mesmo código mais curto, usando eval: (mas isso provavelmente seria considerado usando strings ...)
fonte
C (222)
Pontos:
-10 (classifica ao contrário se o número (argv [1]) for negativo)
= 222 pontos
Sinalizadores necessários para se livrar dos 1000 avisos do compilador:
gcc -Wno-implicit-function-declaration -Wno-return-type -Wno-implicit-int -Wno-char-subscripts -o count2 counta2.c
Legível "Melhor":
Um pouco não-destruído:
fonte
"%""i"
vez de"%i"
? Eles são compilados da mesma maneira, então você está desperdiçando dois caracteres.Existe uma razão para eu não ver esta solução já?
Rubi
Não tenho certeza de como pontuar isso. A divisão geraria uma matriz, mas além disso não tenho certeza .. 38 caracteres + 2x20 para matrizes? Ou deve incluir todas as matrizes que esse tipo pode criar internamente?
fonte
VBScript - 76 (96?)
66 caracteres + 10 para o uso de string
n
(não sei se o uso da
replace
função estring
função que retorna n quantidade de caractere x é contado como uma sequência extra).Ele conta a quantidade de um determinado dígito comparando o comprimento da string original com a mesma string com o dígito substituído. Em seguida, anexa essa quantidade de dígitos a n.
fonte
Sleepsort em Python 3 (168)
Com absolutamente nenhuma lista ou loop, apenas geradores.
provavelmente poderia ser melhorado.
fonte
Raquete 97
97 pontos (87 +20 para duas strings, -10 para classificação, sem matrizes)
Isso usa listas de caracteres, então você precisa atribuir a ele uma função de comparação de caracteres, como
char<?
ouchar>?
. Eu sinto que isso também passa despercebido, já que não há muito o que fazer, além de adicionar espaços e aumentar nomes de variáveis. Minha versão antiga é talvez mais honrosa :)Versão antiga sem strings:
110 pontos (120 bytes (utf-8) - 10 para permitir alterar a ordem de classificação. Ele não usa seqüências de caracteres nem matrizes)
Ungolfed:
Eu testei com o 100.000º número de fibonacci:
E o mesmo em ordem oposta:
fonte