O tenaz calendário tailandês

13

No calendário tailandês, o ano de 2017 corresponde a 2560. O calendário tailandês está sempre 543 anos à frente do calendário gregoriano.

Os codificadores observadores observarão que 2560 é igual a 2^9 * 5, ou seja, possui 10 fatores primos. Isso não acontecerá novamente por mais 896 anos! Chamamos um ano de tenaz se tiver exatamente dez fatores principais.

Escreva um programa que produza um valor verdadeiro se o ano atual usando o calendário tailandês, com base no relógio do sistema, for tenaz e, caso contrário, um valor falsey.

Casos de teste:

  • Se o programa for executado durante 2017, true
  • Se o programa for executado durante qualquer um dos anos de 2018 a 2912, false
  • Se o programa for executado durante 2913, true(2913 + 543 = 2^7 * 3^3)
Matt
fonte
Se estiver usando um idioma ou executando em um ambiente sem um relógio do sistema, é aceitável considerar o tempo atual como entrada?
Tutleman

Respostas:

6

Bash + coreutils, 35 bytes

factor $[`date +%Y`+543]|awk NF==11

A saída é uma sequência não vazia (verdade) ou uma sequência vazia (falsy).

Experimente online!

Versão alternativa: 37 bytes.

date -d 543year +%Y|factor|awk NF==11

Não como golfe, mas eu gosto deste.

Experimente online!

Como funciona

A $[data de expansão aritmética +% Y é +543]executada date +%Ypara obter o ano atual (completo) e adiciona 543 ao ano.

O fator toma a soma como argumento e imprime a fatoração primária: primeiro o número a ser fatorado, depois uma lista de fatores primários individuais.

Finalmente, o awk filtra a entrada, imprimindo apenas linhas com exatamente 11 campos (o número mais 10 fatores primos).

Dennis
fonte
5

05AB1E , 10 bytes

žg543+ÒgTQ

Experimente online! ou como um conjunto de testes

Explicação

      Òg     # the number of primefactors with duplicates of
žg           # the current year
  543+       # plus 543
        TQ   # equals 10
Emigna
fonte
4

CJam , 13 bytes

et0=543+mf,A=

Experimente online!

Explicação

et0=  e# Get current year.
543+  e# Add 543.
mf    e# Get prime factors with multiplicity.
,     e# Get length.
A=    e# Equals 10?
Martin Ender
fonte
4

Mathematica, 37 31 bytes

5 bytes salvos devido ao lanlock4 .

PrimeOmega[#&@@Date[]+543]==10&

Função anônima. Não aceita e retorna Trueou Falsecomo saída.

LegionMammal978
fonte
Nowestá implícito. Você pode usar DateValue@"Year".
Martin Ender
Você precisa &do final? Além disso, Date[][[1]]é um par de bytes menor que DateValue@"Year"(se você não se importa que Dateé obsoleto).
Não uma árvore
1
Você pode salvar um byte #&@@Date[]no lugar de Date[][[1]]. Além disso, acho que o "ambiente Mathematica + REPL" é uma linguagem de programação válida aqui, para a qual você não precisa finalizar &.
Greg Martin
@GregMartin Oh bem, eu nunca fui um grande fã disso #
LegionMammal978
3

Pitão, 11 bytes

qlP+543.d3T

Intérprete online disponível aqui.

Explicação

       .d3   get current year
   +543      add 543
  P          get prime factors of result
 l           count number of prime factors
q         T  check if equal to 10 (result is implicitly printed)
Mike Bufardeci
fonte
2

Japonês , 18 14 13 bytes

543+Ki¹k l ¥A

Economizou 4 bytes graças ao ETHproductions. Guardado 1 byte graças a obarakon.

Experimente online!

Tom
fonte
Boa resposta! Você pode salvar um byte se mudar as coisas: A¥º543+Ki¹k lou543+Ki¹k l ¥A
Oliver
@obarakon Thanks! Por que é ¹usado, não )faria a mesma coisa?
Tom
Sim, você pode usar ).
Oliver
2

Python 2 , 92 89 bytes

-3 bytes graças a Jonathan Allan

import time
y=time.gmtime()[0]+543
c=i=1
exec"i+=1\nwhile 1>y%i:y/=i;c-=1\n"*y
print-9==c

Experimente online!
Iterar até o ano, extraindo (e couting) os principais fatores.
A linha exec é equivalente a:

for i in range(2,y):
 while not(y%i):
  y=y/i
  c=c-1
Cajado
fonte
Um byte 3 salvar: c=i=1; c-=1; print-9==c.
Jonathan Allan
1

Oitava , 31 bytes

nnz(factor(clock()(1)+543))==10

Experimente online!

Dois truques usados ​​aqui:

  • clock()(1) indexar diretamente na saída de clock ( clock(1)não funciona)
  • nnzem vez de numel, como todas as entradas são garantidas como diferentes de zero.

Versão alternativa, mesma contagem de bytes

nnz(factor(max(clock)+543))==10

Esta versão só pode ser usada por anos que excedam 30, mas obviamente desconsiderando viagens no tempo, inclui todos os anos em que o programa pode ser executado. Também funciona em Matlab.

Luis Mendo
fonte
1

PHP, 111 68 66

$a=date(Y)+543;for($i=2;$i<$a;)$b+=$a%$i?!++$i:!!$a/=$i;echo$b==9;

conta diretamente o número de fatores primos.

$a=date(Y)+543;             // current year
for($i=2;$i<$a;)            // while $i lower than the year
$b+=$a%$i?!++$i:!!$a/=$i;   // if $i divides $a: $a/=$i and ++$b | if not: ++$i
echo$b==9;                  // output if it has 10 prime factors

Ideia antiga: 111 90

for($i=1;++$i<1e3;)for($j=1;++$j<1e3;)${$i*$j}=($$i?:1)+($$j?:1);echo${date('Y')+543}==10;

Isso não usa um fator de fatoração interno embutido, mas basicamente uma peneira primária de contagem para obter o número de fatores primos de um número <10000. Isso é mapeado para o ano de 4 dígitos fornecido pelo PHP usando date('Y'):

for($i=1;++$i<1e3;)          // for each number smaller sqrt(1e4)
for($j=1;++$j<1e3;)          // do sqrt(1e4) times
${$i*$j}=($$i?:1)+($$j?:1);  // n_factors[i*j] = n_factors[i] + n_factors[j]
echo${date('Y')+543}==10;          // output 1 if the current year has 10 prime factors or nothing if it doesn't
Christoph
fonte
1
-2 bytes: Ynão precisa de aspas -nr.
Titus
1
Na sua velha idéia: por que inicializar? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)salva 13 bytes. $j=++$i<1e4salva um. E sem aspas para Ymais duas.
Titus
0

MATL , 14 bytes

1&Z'543+Yfn10=

Experimente online!

1&Z'   % Current year
543+   % Add 543
Yf     % Prime factor decomposition
n      % Number of elements
10=    % Equal to 10? Implicitly display
Luis Mendo
fonte
0

Lote, 123 bytes

@set/ay=%date:~-4%+543,n=d=2
:l
@set/ar=y%%d,d+=1
@if %r%==0 set/ay/=d-=1,n+=1
@if %y% gtr 1 goto l
@if %n%==12 echo 1

Você pode falsificar o script substituindo manualmente a datevariável antes de executá-lo.

Neil
fonte
0

J , 18 bytes

Organismo do programa:

10=#q:543+{.6!:0''

Experimente online!

10= é dez igual a

# a contagem de

q: os principais fatores de

543+ esse número foi adicionado a

{. o chefe (primeiro item, isto é, o ano) da

6!:0'' a data (como YMD hms)

Adão
fonte
0

JavaScript (ES6), 79 75 bytes

f=(y=+Date().slice(11,15)+543,d=2,n=10)=>y>1?y%d?f(y,d+1,n):f(y/d,d,n-1):!n

Porta da minha resposta em lote. Passe no ano civil tailandês se desejar realizar um teste específico. Editar: salvou 4 bytes graças a @dandavis.

Neil
fonte
como sobrenew Date().getYear()+2443
Matt
@ Matt Ugh, não é isso que a MDN diz que faz ... mas está obsoleta, então não tenho certeza se devo usá-la de qualquer maneira.
Neil
passando 2017 == false? shortners: +Date().slice(11,15)+543e em y?vez dey>1
dandavis 27/03
@dandavis y?é inútil, ynunca é zero.
Neil