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)

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).





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.


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


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!


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

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.


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

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

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.


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)


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.