Quartas-feiras Prime
Sua tarefa é contar o número de quartas-feiras que caem em um dia nobre do mês em um determinado ano. Por exemplo, 7-13-16
é uma quarta-feira nobre. Para obter consistência, use o calendário gregoriano para todas as datas.
Entrada
A entrada para o seu programa / função será de um ano (por exemplo 2016
) e é flexível. O ano será um número inteiro entre 1912 e 2233, inclusive.
Saída
A saída também é flexível e deve ser o número de quartas-feiras principais (por exemplo 18
).
Pontuação
Este é o código-golfe, pelo que o código mais curto em bytes vence!
Casos de teste
entrada -> saída
--------------------
1912 -> 19
1914 -> 16
1984 -> 17
1996 -> 19
2063 -> 19
2150 -> 16
2199 - > 18
2233 -> 18
Python 2,
95936867 bytesObrigado a @Josay por jogar fora um byte!
Teste em Ideone .
fonte
0x10ea2c8dbb06c5619
vez de19501370182350951961
.big_constant//5**long_expression
mas como você veio com essa constante e essa expressão? É loucura: DBrain-Flak ,
6588,2310,2308, 2290 bytesPara começar, não escrevi quase 100% deste programa, o que provavelmente é evidenciado pelo enorme tamanho do programa. A maior parte desse código foi escrita pelo meu próprio algoritmo de golfe Brain-Flak . Junto com um script python adicional que escrevi para avisá-lo na direção certa.
Experimente online!
Embora este programa seja bastante longo para o código de golfe, ele é decentemente curto para o Brain-Flak. Atualmente, o recorde mundial da divisão inteira é superior a 1000 bytes.
Explicação
O algoritmo é bastante simples. Como há um número limitado de anos disponíveis (321), ele simplesmente coloca as respostas na ordem inversa sob a entrada e usa um algoritmo de pesquisa para encontrar a resposta correta. Embora codificar todas as 321 possibilidades possa parecer bastante ineficiente com uma tarefa tão complexa como esta e uma linguagem tão esotérica quanto o cérebro, pode muito bem ser a melhor solução. (Eu pretendo descobrir na próxima semana).
Como a maioria dos 321 números tem cerca de 18 em média e diferem muito pouco de ano para ano, em vez de empurrar todos os números individualmente, eu empurro o primeiro ano (2233) normalmente e, em seguida, apenas duplico e altero um pouco o valor para cada ano depois de. Dessa forma, em vez de pagar para enviar ~ 18 por todos os 321 anos, pago apenas para enviar ~ 2 por ano.
Depois que todas as respostas foram enviadas, subtrai 1912 da entrada
({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])
(isso pode ser subótimo, reescrevi o otimizador para ignorar certos valores que eu acreditava não serem ideais, pois os números codificados são um processo superexponencial e sua execução até a conclusão pode ter alguns dias).Em seguida, subtrai um do primeiro elemento e exibe o segundo elemento até o resultado chegar a zero
{({}[()]<{}>)}
,.Aparece o zero
{}
e todos os elementos abaixo do elemento superior({}<{{}}>)
.fonte
n
em
quais têm comprimentosk
el
, presumon+m
que teriam comprimentosk+l
? Que taln*m
?n*m
seriak+4m-4
oul+4n-4
. Isso ocorre porque a multiplicação é codificada. Primeiro pressionamos osn
m-1
tempos. Para fazer isso, precisamos dek
símbolos para expressarn
e2m-2
símbolos para expressar os empurrões (cada empurrão é de 2 símbolos). Então nós popm-1
vezes, custando-nos um adicional2m-2
(pops custam 2 símbolos também). Isso totalizak+4m-4
. também podemos multiplicarm*n
(propriedade comutativa) para obterl+4n-4
. O resultado será o mais curto dos dois.+1
custa 2,*2
custa 4,*3
custa 8,*4
custa 12, o que é mais caro do que*2*2
, portanto, não vale a pena (em números abaixo de 1000, encontrei apenas 10 que não usavam*2
: 1, 2, 3 , 4, 5, 9, 15, 27, 45, 135). Para 1912, o melhor que eu podia fazer era((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*2
com um comprimento de 52.Bash + utilitários comuns, 39
Toma o ano de entrada como um parâmetro de linha de comando. Normalmente envia mensagens como esta para STDERR - acho que isso é legal conforme esta meta-resposta :
Se você desejar suprimir explicitamente a saída STDERR, poderá fazer isso para uma pontuação de 43 :
fonte
gd_GB.utf8
onde todos os nomes de dia abreviamDi
.Oitava, 86 bytes
Isso não é rápido, de forma alguma. Mas esse não é realmente o objetivo de um código de golfe, é?
A oitava pode rastrear datas por "número da data" - número de dias decorridos em que 1º de janeiro de 0 é o dia 1. Por essa medida, 3 de janeiro de 1912 (a primeira quarta-feira do nosso conjunto) é o dia 698.346. Comece por aí e percorra todos os 7 dias (todas as quartas-feiras) até o final de 2233 e adicione 1 se o ano for o ano de destino E o dia do mês for nobre.
fonte
Python 2.7,
166,165, 150 bytesCertamente há espaço para melhorias aqui. Eu sou bastante novo no golfe em python. Isso usa o
datetime
módulo. Ele percorre todos os dias do ano, adicionando um a um acumulador se ele se encaixa no critério. Em seguida, imprime o resultado. A maior parte do trabalho pesado está no módulo, portanto o código pode ser bem pequeno.Um byte economizado graças ao Morgan Thrapp e 15 bytes salvos pelo Pietu1998 .
fonte
n%x==0
paran%x<1
.-1
não é necessário, poisrange
o índice final é exclusivo. Além disso, você pode converterfilter
para um gerador.[0for x in range(2,n)if n%x<1]
any(...)
ou emall(...)
vez denot filter(...)
.all
você pode economizar um monte.c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
J, 44 bytes
Acabei de descobrir que J tem construído para manipulação de datas.
Uso
Comandos extras são usados para formatar várias entradas / saídas.
Explicação
fonte
PowerShell v3 +,
9995 bytesAbordagem da força bruta -
Pega entrada
$y
, faz um loop de1
para12
, armazena o mês temporariamente em e$m
, em seguida, faz um loop em todos os primos de2
para31
. Para cada um deles, construímos umGet-Date
dia específico e, em seguida, selecionamos apenas aqueles comDayOfWeek
-eq
ual para3
(ou seja, quarta-feira). Encapsula que tudo em um parens para formular uma matriz e leva a.Count
mesma.Alternativamente, abordagem matemática -
PowerShell v3 +, 105 bytes
Acabará sendo apenas um fio de cabelo mais longo do que a abordagem da força bruta, mas eu o incluo aqui, pois pode ser benéfico para os outros.
Mais uma vez assume a entrada
$y
como o ano. Desta vez, estamos realizando estritamente operações matemáticas com base no primeiro dia do ano. Primeiro calculamos o dia da semana e os armazenamos$a
para uso posterior. Isso indexa a primeira matriz, o que nos dá o número normalmente correto. Temos que acrescentar a isso um segundo índice, com base no potencial ano bissexto, seja domingo, terça, quarta ou quinta-feira, e com base no que é o ano.Isso é baseado na seguinte observação. A primeira coluna é o dia da semana em 1º de janeiro e a segunda é a saída usual. A menos que o ano seja um dos números do meio, é o número em parênteses. A coluna final descreve como a indexação% 5 funciona.
Nota: Ambos assumem que
en-us
é a configuração atual do PowerShell para informações de cultura / data. A formatação e oDayOfWeek
número da data podem precisar ser ajustados de acordo com outras variantes de cultura.fonte
Ruby, 83 + 15 (
-rdate -rprime
sinalizadores) = 98 bytesExperimente online! (Os módulos importados são incorporados porque idk, se eu puder usar sinalizadores em repl.it)
fonte
JavaScript ES6,
187182181179 bytes179 Trocado em um loop for pelo loop while
181 Compactou o ternário
182 Combinaram os dois loops
187
fonte
Lote, 248 bytes
Explicação:
d
é o dia da semana, com0
Segunda-feira, que é convenientemente 1º de janeiro de 1912.l
é um sinalizador para saber se o ano é um ano bissexto,1
para 1912. Passamos de 1913 para o ano de entrada, atualizando o dia de semana e recalculando a bandeira do ano bissexto à medida que avançamos. Finalmente, usamos a bandeira do ano bissexto e o dia da semana para indexar o que é efetivamente uma declaração de grande chave para determinarn
o número de quartas-feiras principais. Definirn
para 20 e diminuí-lo com queda é mais barato do que usar a lógica de controle de fluxo, mas o resultado é que, se o dia 1º de janeiro de um ano sem salto for quinta-feira ou domingo, haverá 16 quartas-feiras principais e assim por diante nos outros casos .fonte
JavaScript ES6
206203199197195183182179Não é o mais curto, mas o melhor que posso fazer por enquanto ... Sugestões de golfe são bem-vindas ...
Alterar:
3>=x?3-x:10-x
para6-(x+10)%7
, salvando: 3 Alterações nos locais da declaração;x=w.getDay();z=D(w,6-(x+10)%7)
az=D(w,6-(w.getDay()+10)%7)
, salvando: 4Z=0
defor
loop para declaração de Data e empurrouz=D(w,6-(x+10)%7)
parafor
loop para arrumar, economizando: 2w=new Date(a,Z=0,1)
declaração deslocada emfor
loop, mesclando com aw
declaração existente , salvando: 2+!!
para~~
reduzir e ainda converterp(d=1)
deNaN
para0
, permitindo que a função Prime Test ainda funcione, economizando: 1W
,for
loop redefinido - retornando a partir de 31 de dezembro, escrevendo oDate
objeto como uma variável separada e depois reescrevendo ofor
loop naeval
chamada; salvando 3.@PandaCoder, estou alcançando você, companheiro!
fonte
R,
149147 bytesTeste em Ideone .
fonte
Groovy, 126
O Groovy não tem validação de número primo, teve que criar isso também.
fonte