Isso foi divertido! No entanto, com apenas três dígitos, a diversão acabou cedo demais. Esse desafio é semelhante, mas continuaremos com a diversão.
O desafio
Imprima o maior número possível de dígitos da Proporção áurea .. A Proporção áurea é definida como o número que satisfaz φ = (φ + 1) / φ e os 100 primeiros dígitos são dados por:
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375 ...
Esse desafio não é sobre a computação! Trata-se de imprimir o maior número possível de dígitos sem usar nenhum método para fazer isso duas vezes. Portanto, encontre o maior número possível de maneiras criativas de obter seus dígitos!
Restrições
Por si só, imprimir os dígitos de φ seria um pouco simples demais, então aqui estão as regras:
- Você precisa construir o número na ordem da esquerda para a direita , imprimindo-a peça por peça ou construindo uma string da esquerda para a direita e imprimindo-a no final - você pode até gerar uma matriz de caracteres de dígito e, em seguida, imprima, desde que faça em ordem. Nas regras a seguir, "print" e "output" podem se referir a qualquer um desses processos (por exemplo, se você está construindo uma string, e a string contém o
1.6
que conta como1.6
já foi impresso). - Para o seu código, você recebe um orçamento de 15 caracteres por dígito . O período não conta para esse orçamento, mas deve ser impresso também. Observe que a restrição é apenas no tamanho total do código: você pode usar mais de 15 caracteres para qualquer dígito, desde que não use mais, em média. De fato, você pode criar uma "dívida" em caracteres e "pagar" mais tarde. Por exemplo, para imprimir
1.618
você tem 60 caracteres. - As inclusões / importações da biblioteca padrão não contam para o tamanho do código. Mas você não pode fornecer esses aliases abreviados de graça!
- Você não deve usar o dígito que está gerando no momento nem o que já imprimiu. Por exemplo,
1
pode não aparecer em nenhum lugar no seu código-fonte, porque é o primeiro dígito. O código que gera o8
no1.618
pode usar qualquer um ou todos os dígitos[0234579]
, mas nenhum[168]
. Para esse propósito, todos os literais equivalentes a um único dígito são tratados como esse dígito . Portanto, se o seu idioma puder representar9
como'\t'
você não está autorizado a usá-lo em qualquer lugar, onde você não poderá usar um9
. - Você não deve produzir vários dígitos ao mesmo tempo. Deve ser possível dividir claramente seu código em partes que geram um dígito por vez.
Você não deve se referir a qualquer built-in função, operador / string matemática / boolean / bit-wise, variável ou constante que você usou no código que gerou um dígito antes. Exceções são funções de conversão de número inteiro para string, concatenação de strings e impressão, que você pode precisar para cada dígito. Observe que não importa com que nome você se refere a nenhum built-in: apenas porque você alias um built-in
PI
para ambosp
eq
não significa que você pode usarp
umaq
vez. Da mesma forma, você está autorizado a usar um nome duas vezes se refere a dois diferentes built-ins, como cordaslength
e variedadelength
.Se a sua linguagem de programação não tiver funções, use seu melhor julgamento sobre qual seria o equivalente - por exemplo, para scripts bash, a chamada de outros programas deve seguir as regras impostas às funções
- Seu envio deve ser escrito em um único idioma. Portanto, não é necessário executar o intérprete de outro idioma para obter acesso aos recursos internos desse idioma.
Implicações
Os pontos a seguir estão todos implícitos nas regras acima, mas eu os adiciono aqui para evitar perguntas que já surgiram na sandbox:
- Você não tem permissão para substituir partes de sua saída imprimindo alguns backspaces (geralmente
'\b'
) no meio. - São proibidos os loops que geram / geram vários dígitos. (Os loops que calculam um único dígito são bons, no entanto.)
(1 + √5)/2
É proibida a utilização de uma versão ofuscada ou a divisão dos números de Fibonacci para obter mais de um dígito.- Você não pode pré-calcular os 10 dígitos e armazená-los em 10 variáveis e depois apenas se referir a eles, porque essas referências a variáveis não geram o dígito - o código que preenche a variável, portanto, isso é uma violação da regra 6.
- Na verdade, você não pode reutilizar nenhum resultado anterior (ou intermediário), porque isso significaria que dois dígitos compartilhariam código para serem gerados .
- Caso contrário, você pode usar qualquer meio (que não precise ser puramente matemático) para gerar os dígitos. (E você deveria!)
- De fato, não há necessidade de calcular nada, se você puder obter os dígitos corretos de muitos lugares diferentes usando sua biblioteca padrão.
- Você pode usar um operador várias vezes enquanto gera um único dígito; portanto,
2+2+2
é justo jogar o primeiro6
(embora seja improvável o menor). - Você pode usar qualquer literal quantas vezes quiser, porque elas não são constantes internas. Contanto que você não precise imprimir
5
, você pode quantos5
s em seu código quiser. - Você não pode codificar a saída, porque isso envolveria o uso dos dígitos que você está produzindo.
Resumindo: não use nenhum método para gerar dígitos duas vezes e não use o dígito que você está produzindo no momento ou se já foi impresso.
Se você encontrar uma brecha que permita obter uma pontuação (quase) infinita, não estrague o desafio explorando-a, mas avise-me para que eu possa ver se a brecha pode ser corrigida sem quebrar nada.
Pontuação
O programa que imprime o maior número de dígitos vence corretamente. Em caso de empate, o código mais curto quebra o empate.
Por favor, adicione uma versão comentada não destruída que identifique qual parte do seu código gera qual dígito.
PS: Se alguém ultrapassar os 100 dígitos acima, aqui estão mais alguns .
fonte
x = (x+1)/x
(oux^2 = x+1
) (oux^2-x+1
).Respostas:
PHP, 100 dígitos
Provavelmente estou flexionando um pouco as regras aqui, mas o PHP tem dezenas de constantes para escolher:
Provavelmente não é um código muito portátil, mas funciona bem no meu sistema. Aqui está o código que o gerou:
fonte
<?for(;;);
usa 9MB de memória. Agora eu sei por que ... eu gosto da restrição auto-imposta nº 7 de @ kernigh, que fecha esse tipo de brecha. Além disso, para o que vale a pena, a saída no meu sistema é o seguinte: codepad.org/wSrtJBcoPerl - 37 dígitos
392 bytes atualmente, (10,6 por dígito).
Saída:
Restrições auto-impostas
Adicionei algumas restrições adicionais para limitar o uso de recursos de idioma que trivializariam o problema. Por exemplo, a desreferência de matriz
@{...}
e o índice final da matriz$#{...}
são usados apenas uma vez. Cada matriz usada é gerado de uma maneira diferente (comparar[c,c,c,c]
,[b..j]
,split('',$~)
,map(glob,"{,,,}{,}")
). Além disso, nenhum símbolo ou palavra de barra é usado mais de uma vez, embora isso seja explicitamente permitido na descrição do desafio. Eu acho que é uma boa idéia para perl (ou qualquer linguagem com variáveis especiais int-only (existem outras?)), Porque limita o número de conversões implícitas implícitas.Peças
fonte
Python 2.7, 19 dígitos, 231 caracteres relevantes
fonte
Ruby 2.1 para 54 dígitos, 808 caracteres
Este programa trabalha com
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-openbsd]
. Sistemas diferentes do OpenBSD 5.5 podem ter valores diferentes para alguns dígitos.Interpretações
As restrições desse desafio, especialmente a restrição 6, não são precisas para Ruby. Então eu adiciono minhas próprias interpretações:
$<.fileno
, e os dois pontos duplos obtêm constantes, como emIO::LOCK_NB
. O nome do método ou constante faz parte da operação. Como()
.
::
não são operadores, não aplico a restrição 6 a eles. Eu posso reutilizá-los para gerar mais dígitos.Array#count
eEnumerable#count
não são a mesma função para a restrição 6. Os dois métodos agem da mesma forma, masArray#count
substituemEnumerable#count
por uma implementação diferente. Se eu usoArray#count
para gerar um dígito, posso usarEnumerable#count
para gerar outro dígito.Mutex.new
,Random.new
,Time.new
e assim por diante se referem ao mesmo método,Class#new
. Eu usoSignalException.new
para gerar um dígito. Por causa da restrição 6, nunca mais poderei usá-loClass#new
.Float
eIO
são constantes! Eu usoIO::LOCK_NB
para gerar um dígito. Por causa da restrição 6, nunca mais poderei usá-loIO
. Essa interpretação liga apenas Ruby, e não outras linguagens onde os nomes dos pacotes não são constantes.[]
{}
//
''
. Eu sempre posso usar esses literais para gerar mais dígitos.File::APPEND
eIPSocket::LOCK_UN
existem dois nomes para o mesmo número 8. A restrição 6 diz: "não importa com o nome que você se refere a qualquer built-in". ComoFile::APPEND
eIPSocket::LOCK_UN
diferem apenas pelo nome, elas devem ser a mesma constante, portanto, não posso usá-las por dois dígitos.$SAFE
é uma variável global interna, não uma função, operador, constante nem literal.$SAFE
tem o valor 0. Com a brecha, posso reutilizar$SAFE
para gerar todos os dígitos 0 no programa. Fecho a brecha interpretando a restrição 6 para também restringir variáveis globais.Comentários
A primeira linha é
#!ruby -rdate -rdigest -ropenssl -rprime -rset -rsocket
. Rubi analisa esta linha e cargas seis partes de sua biblioteca padrão, como que porrequire 'date'
,require 'digest'
e assim por diante. Não conto esses 56 caracteres, porque a restrição 3 isenta "a biblioteca padrão importa / inclui".O restante do programa chama
print
com uma longa lista de argumentos para convertê-los em seqüências de caracteres e imprimi-los em ordem. Os argumentos são os seguintes:1
from2/2
: division Fixnum # /.
from?.
: cadeia de caracteres únicos literal6
de9-3
: subtração Fixnum # -1
de3&5
: bit a bit e Fixnum # &3
novamente.8
from2*4
: multiplication Fixnum # *0
from2^2
: bitwise exclusive-ou Fixnum # ^3
de7%4
: módulo Fixnum #%3
de55>>4
: shift direito Fixnum # >>9
de5+4
: adição Fixnum # +8
from2<<2
: left shift Fixnum # <<8
from-~7
: negação do complemento Fixnum # - @ Fixnum # ~7
from5|2
: bit a bit ou Fixnum # |4
from2**2
: exponentiation Fixnum # **9
de(2r+2+5).to_i
: adição racional Rational # + Rational # to_i2r
são novos no Ruby 2.1.2r+2
chama o Rational # + e retorna outro racional;2r+2+5
chama o Rational # + novamente.2/1
e flutua como2.0
. Para corrigir isso, eu converter para número inteiro: to_i rodadas para zero, ceil rodadas para cima, piso arredonda para baixo.8
from(2.2+5).ceil
: adição de flutuador Float # + Float # ceil()
e pontuar.
novamente.9
from(55r/5-2).floor
: divisão e subtração racional Rational # / Rational # - Rational # floor4
from(2.2*2).to_i
: multiplicação de flutuador Float # * Float # to_i8
from(2r*2*2).ceil
: multiplicação racional Rational # * Rational # ceil4
from(2.2**2).floor
: exponenciação racional Rational # **8
from2.to_bn<<2
: shift à esquerda com grande número do OpenSSL Fixnum # to_bn OpenSSL :: BN # <<2
from__LINE__
: constante mágica para o número da linha atual0
from$<.to_i
: descritor de arquivo da entrada padrão IO # to_i4
deIO::LOCK_NB
: sinalizador para bloqueio de arquivo sem bloqueioIO
. Pela interpretação 7, não posso mais usar nenhuma constante com o valor de 4.5
fromErrno::EIO::Errno
: número para erro de entrada / saída8
fromFile::APPEND
: flag para anexar a um arquivoIO
, masFile
herda constantes deIO
, entãoFile::APPEND
é uma maneira diferente de obterIO::APPEND
.6
from'aaaaaa'.size
: comprimento da string String # size8
from?a.encoding.name.sub(/\D+/,'')
: parte do nome da codificação String # encoding Encoding # name String # sub3
from%w[a a a].size
: length of array Tamanho da matriz #4
from%w[a b c d].to_set.size
: número de elementos no conjunto Array # to_set Set # size3
from%w[a a a].count
: count todos os elementos Array # count6
fromSocket::AF_NS
: number para a família de endereços NS5
deDate.jd(Date::ITALY).wday
: número do dia da semana para sexta-feira 15 de outubro de 1582, quando a Itália mudou para o calendário gregoriano Data :: jd Data # wday6
from*Digest::MD5.digest(?j).scan(/\d/)
: primeiro dígito ASCII no resumo binário MD5 de "j" Digest :: MD5 :: digest String # scan*
passa os elementos da matriz como argumentos paraprint
. Essa matriz é ["6"].3
fromSet[?a,?b,?c].count
: count todos os elementos Set :: [] Enumerable # count8
fromSignalException.new('FPE').signo
: número de SIGFPE Class # new SignalException # signo1
fromFloat::ROUNDS
: modo de arredondamento, aqui 1 para arredondar para o mais próximo1
frombegin
(nova linha)exit false
(nova linha)rescue Object
(nova linha)$!.status
(nova linha)end
: status de saída por falhaSystemExit.new(false).status
, mas pela interpretação 3, não posso mais chamar Classe # novo . Em vez disso, levanto e resgato um SystemExit.7
fromProcess::RLIMIT_NPROC
: número para limite de recursos para número de processos para um usuário7
from:aaaaaaa.size
: comprimento do símbolo Symbol # size2
fromPrime.first
: primeiro número primo Enumerável # primeiro0
from?/.next
: próxima string depois de "?" String # next3
from{a:p,b:p,c:p}.size
: comprimento do hash Hash # size String # p0
fromSTDIN.lineno
: número da linha atual para entrada padrão IO # lineno$<
. Eu usoSTDIN
. A diferença é que$<
é uma variável global eSTDIN
é uma constante. Um programa pode definir$<
uma entrada diferente, masSTDIN
é sempre o valor original de$<
.3
from?a.crypt('at')[/\d/]
: primeiro dígito ASCII na senha criptografada String # crypt String # []0
from{a: :a}.find_index([:a,:a])
: índice da primeira chave: a, valor: a em hash Enumerable # find_index9
from/b/=~'aaaaaaaaab'
: index onde a string corresponde a / b / Regexp # = ~1
from[?a,?b].index(?b)
: índice do primeiro "b" na matriz Array # index7
from:aaaaaaab=~/b/
: index onde o símbolo corresponde a / b / Symbol # = ~9
from?\t.ord
: valor ASCII da guia "\ t" String # ord8
from'aaaaaaaab'=~/b/
: index onde a string corresponde a / b / String # = ~0
fromopen(?/).pos
: posição no arquivo após abrir o diretório raiz "/" como um arquivo Kernel # open IO # pos5
from'aaaaab'.index(?b)
: índice do primeiro "b" na string String # index7
from?\a.bytes{|b|break b}
: valor ASCII do alerta "\ a" String # bytes6
from'aaaaaaa'.rindex(?a)
: índice do último "a" na string String # rindex2
from%w[a a].map.size
: tamanho do enumerador que mapeia da matriz Array # map Enumerator # sizefonte
new
realmente chamam sempre os mesmos imlpementation ou é substituído em subclasses? [ctd.]Java, 21 dígitos, 276 caracteres
fonte
7-4
e-4+7
isso é inteligente! :)7
não é uma constante, mas um literalRuby, 74 caracteres, 10 dígitos
É apenas um começo; Eu tenho que ir, então melhorarei mais tarde.
Tenho 76 caracteres guardados para mais tarde, quando ficar mais difícil!
fonte
Ruby, 17 dígitos, 168 bytes
Ungolfed:
Ainda não fui forçado a fazer algo particularmente inteligente, posso voltar e adicionar dígitos.
fonte
succ
enext
são aliases.$.
duas vezes. Embora, tenha que amar$....
: DGolfscript , 17 dígitos
Uma tentativa direta. O Golfscript pode ter muitos embutidos não alfanuméricos de uma letra, mas não possui muitos embutidos como um todo!
fonte
5,)\; # range, right uncons, flip, and pop
.Bash, 5 dígitos em 65 caracteres
Vou atualizar isso em breve! Por enquanto, ele apenas imprime
1.6180
e não contém dígitos.Explicação
Os seguintes métodos são usados para gerar os dígitos:
1: status de saída de
false
6: comprimento da corda
1:
nl
abuso8:
kill
números de sinal0: valor numérico de uma expressão vazia
fonte
Mathematica
98 dígitos, em868378 caracteres.Saída:
fonte
#
por um dígito permitido e soltando um dos traços.Julia - 23 dígitos em 345 caracteres (15 por dígito exatamente)
Saída: 1.6180339887498948482045
Interpretei caracteres e seqüências de caracteres como utilizáveis, desde que não reutilizasse um caractere ou sequência específica (caracteres em uma sequência poderiam ser reutilizados, desde que a sequência não fosse); no entanto, não me permiti usar o valor int de um personagem diretamente. Há um caractere não ASCII (©).
De uma maneira mais legível (não código real):
fonte
C ++ 12,4 caracteres por linha, era de 14 caracteres por linha para cada dígito
Corrigido meu erro de reutilizar operadores.
Não tem certeza se o uso de caracteres como este conta como literais ou não? Se esse código for aceitável, ele poderá ser continuado para sempre e a dívida será devolvida.
fonte
-
operador. Além disso, eu gosto de como você contou o comentário para o comprimento da linha. : D1
para produzir um0
(que não é permitido, porque1
apareceu anteriormente na proporção áurea). Além disso, você precisa contar o#define S
(não o outro), pois não é um include, mas apenas define um apelido abreviado.