Classificação do sono é um algoritmo de classificação inteira que eu encontrei na Internet. Ele abre um fluxo de saída e, para cada número de entrada em paralelo, atrasa o número segundos e gera esse número. Devido aos atrasos, o número mais alto será emitido por último. Estimo que tenha O (n + m), onde n é o número de elementos e m é o número mais alto.
Aqui está o código original no Bash
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
Aqui está o pseudocódigo
sleepsort(xs)
output = []
fork
for parallel x in xs:
sleep for x seconds
append x to output
wait until length(output) == length(xs)
return output
Sua tarefa é implementar o Sleep Sort como uma função na linguagem de programação de sua escolha. Você pode negligenciar qualquer fator de simultaneidade, como condições de corrida, e nunca bloquear nenhum recurso compartilhado. O código mais curto vence. A definição da função conta para o comprimento do código.
A lista de entrada é limitada apenas a números inteiros não negativos, e o comprimento da lista de entrada deve ser razoavelmente longo (teste pelo menos 10 números) para que as condições da corrida nunca aconteçam. e assumindo que as condições da corrida nunca acontecem.
Respostas:
Uma espécie de tentativa Perl esfarrapada ,
5955523832 caracteres :map{fork||exit print sleep$_}@a
Barebones: 25 Personagens:
... se você não se importa com os resultados da classificação como saída da matriz:
map{fork||die sleep$_}@a
Com todas as guarnições:
(para máxima conformidade com os desafios, 44 caracteres)
sub t{map{fork||exit print sleep$_}@_;wait}
Se você deixar o perl esperar por você, 39 caracteres:
sub t{map{fork||exit print sleep$_}@_}
E, novamente, se você não se importa
die()
, 32 caracteres ...sub t{map{fork||die sleep$_}@_}
Observe que no Perl 6, ou quando o recurso 'say' é declarado, é possível substituir a
print
função porsay
, salvando um caractere em cada instância. Obviamente, comodie
ambos finalizam o processo bifurcado e gravam a saída, ela permanece a solução mais curta.fonte
perl-E
para habilitar 5.010 recursos comosay
(fork&&die sleep$_)for@a
funciona também #C , 127 caracteres, uma solução bastante óbvia:
(Compilado
gcc -std=c99 -fopenmp sort.c
e ignorando todos os avisos.)fonte
for(;c>=0;--c){int x=atoi(v[c]);
. Não tenho certeza se isso é permitido.Ruby 1.9, 32 caracteres
Como uma função:
Se pudermos usar apenas uma variável predefinida, ela reduzirá para 25 caracteres:
fonte
Thread.new{p sleep i}
para imprimir a saída.JavaScript , 65 caracteres (dependendo se você usa
console.log
ou outra coisa para gerar o resultado)Isso pressupõe que
a
seja uma matriz de números inteiros não negativos e quemap()
exista no protótipo da matriz (JavaScript 1.6+).fonte
1e3
.alert
é a saída de bloqueio do JavaScript,prompt
é a entrada de bloqueio do JavaScript econfirm
é a entrada binária de bloqueio do JavaScript. Se o JS fosse gravado na linha de comando, essas seriam as chamadas que você usaria.APL (
1513)O que faz:
fonte
⎕DL
função que está em suspensão.Quatro tentativas em Erlang:
Saída para o console, tiveram a liberdade de fazer isso cada um,
9ms * Number
pois isso é suficiente para fazê-lo funcionar (testado em uma placa incorporada Atom = lenta):Precisa de 60 caracteres
A saída para o console é total não-Erlangish, por isso enviamos uma mensagem para processar
P
:Necessita 55 caracteres
O envio após um tempo também pode ser feito de maneira diferente (isso funciona mesmo com
1ms * Number
):Necessita 41 caracteres
Na verdade, isso é um pouco injusto, pois a função incorporada
send_after
é tardia e precisa doerlang:
prefixo do namespace , se considerarmos esse namespace importado (feito no nível do módulo):Necessita 34 caracteres
fonte
C # - 137 caracteres
Aqui está uma resposta em C # (atualizada com graus de paralelismo, como comentado)
fonte
WithDegreeOfParallelism
para que isso funcione, analogamente aonum_threads
código C do OpenMP.void m(int[] l){foreach(var i in l){var t=new Thread(()=>{Thread.Sleep(int.Parse(s));Console.Write(s);});t.Start();}}}
Python - 81
93148150153Ajustando o código do @ BiggAl, já que esse é o jogo que estamos jogando ....
... ou 97
175com início de thread atrasadoRecebe entrada via linha de comando, ala
Como em muitos python golfs, chega um momento em que o código é compacto o suficiente para que as variáveis de aliasing para encurtar nomes nem salvem caracteres.
Este aqui é descolado, porque alias sys e threading AMBOS como t, então sys.argv se torna t.argv. Menor que a importação de foo * e uma economia líquida de caracteres! No entanto, suponho que Guido não ficaria satisfeito ...
Nota para aprender sozinho c e parar de jogar golfe em python.VACA SANTA É MAIS CURTA DO QUE A SOLUÇÃO C!fonte
daemon
não precisa ser configurado, a menos que você esteja iniciando isso como um daemon e é mais curto usar argumentos posicionais, esp. se você aliasNone
paraN
j
parece acabar comoFalse
- um efeito colateral de tentar fazer muito em uma linha?as t,s
e, em seguida, mudar de usars
parasys
print
função em vez desys.stdout.write
?Por diversão, aqui está uma versão do ColdFusion (8+) ;-) Ele possui 109 caracteres, sem contar as linhas e o recuo da linha que adicionei para legibilidade aqui.
Isso pressupõe que
<cfoutput>
está em vigor. Alguns caracteres podem ser salvos escrevendo tudo em uma linha.fonte
Java (também conhecido como nunca vence no codegolf):
234211187 caracteresungolfed:
fonte
throws Throwable
e se livrar dacatch
cláusula.Long.parseLong
porLong.valueOf
.public
efinal
pode ser removido;class M{public static void main
pode serinterface M{static void main
(Java 8+);Long.parseLong(a)
pode sernew Long(a)
(resultando em 165 bytes )Javascript - 52 caracteres
fonte
Scala -
4240 caracteres (caso especial)Se você tiver um conjunto de encadeamentos, pelo menos, o tamanho do número de elementos da lista:
Scala - 72 caracteres (geral)
fonte
{}
quando fica em uma linha.{}
com uma declaração , mas ainda precisa agrupar as coisas separadas por;
, uma linha ou não. E você pode escrever instruções de várias linhas sem,{}
em alguns casos (if / else por exemplo).()
uma vez. é uma questão de gosto lá, eu acho. (Eu realmente não entendo por que eles()
são suportados quando os{}
substituem. talvez para não alienar os usuários java instantaneamente). Scala é legal, mas definir blocos de código por indentação é claramente superior. (e assim, a guerra religiosa segue;))()
para instruções únicas. Tente entrar(1 to 9).map(i => {val j = i+1; i*j})
no REPL e veja o que acontece se você o usar(1 to 9).map(i => (val j = i+1; i*j))
.Haskell - 143 caracteres
Provavelmente, isso poderia ser reduzido com a entrada de stdin, se isso fosse uma opção, mas é tarde e, de qualquer forma, ainda são 104 caracteres para a função em si.
fonte
Befunge-98,
3831 bytesSei que esse é um desafio antigo, mas recentemente descobri as linguagens sleepsort e 2D, tive uma idéia de como combiná-las e procurei um lugar para publicá-las, então aqui estamos.
O IP principal lê um número (
&
), depois atinge ot
que o clona: continua-se na mesma linha e alterna ciclos, lendo novos números e gerando novos filhos até chegar ao EOF que termina a sequência. Todos os processos filho ficar preso em um circuito fechado (ov
e^
da terceira coluna) até que termine a principal IP lendo a entrada e executa a seqüência de comandos'<21p
, o que coloca o personagem<
na posição (1,2), substituindo o^
e libertando todos os processos filhos, que iniciam o ciclo simultaneamente, reduzindo em 1 o número a cada iteração. Como a velocidade de execução de diferentes IPs é sincronizada no befunge, eles terminam (e imprimem seu valor) em ordem, classificando a lista de entrada.fonte
Um pouco tarde para a festa:
Maple -
9183 caracteresEm 91:
Em 83:
(Isso precisa do Maple versão 15 e espera que a lista seja classificada em L)
fonte
C,
7069 caracteresNão espera que os processos filhos retornem, caso contrário, funciona.
fonte
PHP 57 bytes
pcntl_fork () está disponível apenas no linux.
fonte
Bash (38):
Editar: ponto flutuante de stdin, separados por espaços ou novas linhas.
fonte
Haskell, 90
Espero que isso atenda a todos os requisitos.
fonte
11, 11 caracteres / 22 bytes
Try it here (Firefox only).
שĤ⇀ôa
, isso parece legal.fonte
Apenas alguns ajustes da versão de @rmckenzie:
Início de thread atrasado do Python em
155152114108107:Python sem demora no
130128969593:Gerenciado mais algumas otimizações, usando em
Timer
vez deThread
, que tem uma chamada mais concisa e removeu a necessidade de importartime
. O método de início de encadeamento atrasado se beneficia da compreensão da lista, pois elimina a necessidade de inicializar a lista separadamente no início, embora seja dois caracteres mais ("["+"]"+" "-":"
) que o loop for, portanto é inútil sem início atrasado e você deve ter cuidado ao usar uma lista em vez de um gerador, ou você não está criando os encadeamentos do timer até percorrer o gerador.Alguém mais tem alguma otimização?
O truque com
as
ajuda, mas no 2.7.1 você só pode importar um módulo para um pseudônimo, e depois de algumas brincadeiras sobre você não pode nemimport mod1,mod2 as a,b
precisar, você precisaimport mod1 as a, mod2 as b
. Ele ainda salva alguns caracteres, mas não é exatamente a cura - tudo o que eu pensava que era ... E, na verdade, é melhor deixar o sistema como sistema. A segmentação por aliasing ainda ajuda ...fonte
Clojure, 54
(defn s[n](doseq[i n](future(Thread/sleep i)(prn i))))
fonte
defn
(seus colchetes + lista de argumentos: de 54 a 43 chrs) ou use emfn
vez dedefn
=> len- = 2, então eu diria no clj its 43: DFerrugem - 150 bytes
E é por isso que você não codifica golfe no Rust, é mais detalhado que Java;). Depende da caixa externa
crossbeam
, seria ainda pior sem ela.Programa de teste completo:
fonte
Tipo de porta chata de C #, apenas para começar a usar o idioma novamente:
F # - 90 caracteres
fonte
JavaScript, 74
ou 71/65 caracteres com fora do padrão:
fonte
function(a){a.map(function(v){setTimeout(console.log,v,v)})}
pode ter funcionado em pelo menos um navegador por 60 bytes. Claro que hoje em dia você escreveriaa=>a.map(v=>setTimeout(console.log,v,v))
.Tcl 8.6, 41 caracteres
Você tem que matá-lo com
^C
fonte
VB.NET 100 bytes
Como o VB.Net exige que as lambdas de linha única contenham apenas uma instrução, esse código precisa ter várias linhas:
Ungolfed:
No entanto, não tenho certeza se você conta as instruções de importação na contagem de bytes, porque se você não as contar, eu poderia escrever o seguinte:
VB.NET 71 bytes
Ungolfed:
fonte
Groovy, 47 bytes
Assume que os números são fornecidos na linha de comando ...
fonte
Mathematica, 34 ou 36 bytes
Basta anexar a lista a ser classificada no final deste código e avaliar. Se precisar ser uma definição de função válida, serão necessários dois bytes extras:
fonte
C ++ 11, 229 bytes
Ungolfed e uso:
fonte