Trump membutuhkan bantuan Anda untuk menghentikan Starman!

33

Seorang pria dari bintang-bintang telah datang ke Bumi! Beruntung presiden Amerika Serikat, Donald Trump, mengalami kematian tak terhingga. Menggunakan dadu ini, ia dapat menyulap nomor yang Anda , walikota Podunk , harus gunakan untuk menentukan siapa yang harus dikirim untuk menghentikan penyerang! Tapi hati-hati, Anda hanya dapat mengirim byte dalam jumlah terbatas di belakang katak Anda !

Diberikan input pengguna (yang akan menjadi bilangan bulat positif), Anda harus mengembalikan string tergantung pada kategori apa nomor itu berada.

  • Jika angka tersebut adalah angka Fibonacci , Anda harus menampilkan Ness .
  • Jika nomor tersebut adalah nomor Lucas , Anda harus menampilkan Lucas .
  • Jika nomor tersebut adalah baik sebuah nomor Lucas dan nomor Fibonacci , Anda harus keluaran Travis .
  • Jika nomor itu tidak aa jumlah Lucas maupun nomor Fibonacci , Anda harus keluaran Pippi .

Contohnya

Berikut adalah beberapa kasus uji:

1 => Travis
2 => Travis
3 => Travis
4 => Lucas
5 => Ness
6 => Pippi
7 => Lucas
8 => Ness
610 => Ness
722 => Pippi
843 => Lucas

Aturan

  • Ini adalah , jawaban terpendek dalam byte menang.
  • Program Anda mungkin merupakan program lengkap atau fungsi (n anonim).

Bonus

Ada beberapa bonus yang dapat Anda gunakan untuk membantu katak Anda mendapatkan data ke Presiden Trump lebih cepat:

  • Untuk -15byte: Jika nomor inputnya adalah 2016, Anda harus mengeluarkan Trump, karena dia berada di puncak kepresidenannya.
tahap
sumber
29
Sebagai catatan, saya bukan salah satu dari mereka Starmen.
El'endia Starman
@ Davidvidarrarr Seperti halnya beberapa definisi memulai deret Fibonacci dengan yang 0, 1lain 1, 1, saya percaya ini tergantung pada definisi yang Anda gunakan. Bukanlah hal yang tidak biasa untuk melihat angka-angka Lucas dimulai dengan 2, 1, misalnya OEIS memiliki kedua versi ( 1 , 2 ), tetapi yang dimulai dengan 2 adalah fase definisi.
Sp3000
2
Suara seharusnya disembunyikan, tetapi saya masih akan mengatakan saya benar-benar tidak suka politik dan itu telah mempengaruhi suara saya pada pertanyaan ini. Akankah si penanya menyingkirkan politik dari pertanyaan atau setidaknya menjelaskan kepada saya setiap kata yang mungkin saya lewatkan? Referensi politik dimasukkan ke dalam spesifikasi untuk selamanya, tetapi masih dapat dihapus dari judul.
John Dvorak
3
@JanDvorak: Saya pikir ini sangat menjengkelkan. Sebagai contoh, pertimbangkan bahwa masa jabatan presiden adalah 4 tahun, dan bahwa pemilihan berikutnya adalah pada bulan November 2016. Jika Trump berada di puncak kepresidenannya pada tahun 2016 ...
El'endia Starman

Jawaban:

4

Pyth, 59 - 15 = 44 byte

atau 42 byte setelah bug diperbaiki

&Qr@c."av�a�(s��kW���"\b?q2016Q4/hMst*2.uL,eNsNQ_BS2Q4

Hexdump:

0000000: 2651 7240 632e 2261 7601 c061 15dc 2873  &Qr@c."av..a..(s
0000010: fde0 6b57 8bd0 a1ed ed0f 225c 623f 7132  ..kW......"\b?q2
0000020: 3031 3651 342f 684d 7374 2a32 2e75 4c2c  016Q4/hMst*2.uL,
0000030: 654e 734e 515f 4253 3251 34              eNsNQ_BS2Q4

Dua karakter pertama ( &Q) diperlukan karena bug penguraian Pyth yang membuat Qsetelah ."gagal. Perbaikan telah diterapkan. Jika penerjemah post-bugfix diizinkan, -2 byte.


Tanpa kompresi string yang tidak dapat dibaca:

Pyth, 63 - 15 = 48 byte

49 byte tanpa Trump

@c"Pippi Ness Lucas Travis Trump")?nQ2016/hMst*2.uL,eNsNQ_BS2Q4

Test Suite

Cukup mudah, hanya menghasilkan urutan, duplikat dan periksa keanggotaan.

Urutan dihasilkan dengan mulai dengan [1, 2]dan [2, 1], dan kemudian menerapkan aturan fibonacci.

isaacg
sumber
9

Julia, 146 142 121 120 byte

n->split("Pippi Lucas Ness Travis")[2any(isinteger,sqrt([5n^2+4,5n^2-4]))+(n∈[2;[(g=golden)^i+(-g)^-i for i=1:n]])+1]

Ini menciptakan fungsi tanpa nama yang mengembalikan boolean. Untuk menyebutnya, berikan nama, mis f=n->....

Tidak Disatukan:

function trump(n::Integer)
    # Determine if n is a Fibonacci number by checking whether
    # 5n^2 ± 4 is a perfect square
    F = any(isinteger, sqrt([5n^2 + 4, 5n^2 - 4]))

    # Determine if n is a Lucas number by generating Lucas
    # numbers and testing for membership
    # golden is a built-in constant containing the golden ratio
    L = n  [2; [golden^i + (-golden)^-i for i = 1:n]]

    # Select the appropriate Earthbound charater using array
    # indexing on a string split into an array on spaces
    return split("Pippi Lucas Ness Travis")[2F+L+1]
end

Memperbaiki masalah dan menyimpan 7 byte berkat Glen O!

Alex A.
sumber
7

Mathematica 143 156 - 15 (bonus) = 141 byte

Dengan 2 byte yang disimpan berkat LegionMammal978.

t_~g~l_:=(r=1<0;n=1;While[(z=l@n)<=t,If[z==t,r=1>0];n++];r);a=g[k=Input[],LucasL];
b=k~g~Fibonacci;Which[k==2016,Trump,a&&b,Travis,a,Lucas,b,Ness,2<3,Pippi]
DavidC
sumber
1
Falsedan Truedapat diganti dengan 1<0dan dengan 1>0hormat.
LegionMammal978
7

Mathematica, 92 87 byte

Terinspirasi oleh jawaban Sp3000 .

Travis[Ness,Lucas,Pippi][[{2,1}.Product[Abs@Sign[{Fibonacci@n,LucasL@n}-#],{n,0,2#}]]]&
alephalpha
sumber
5

Python 2, 107

f=lambda i,n=input():abs(5*n*n+i)**.5%1>0
print["Travis","Lucas","Ness","Pippi"][f(4)*f(-4)+2*f(20)*f(-20)]

Kuncinya adalah dua pemeriksaan aritmatika murni untuk angka Fibonacci dan Lucas:

  • nadalah angka Fibonacci tepat jika 5*n*n+4atau 5*n*n-4adalah kuadrat sempurna
  • nadalah angka Lucas persis jika 5*n*n+20atau 5*n*n-20adalah kuadrat sempurna

Situs ini memiliki sketsa bukti .

Jadi, output tergantung pada nilai-nilai 5*n*n+iuntuk idalam {4,-4,20,-20}. Fungsi fmenguji nilai i, dengan memeriksa apakah nilai yang sesuai tidak memiliki akar kuadrat bilangan bulat. absAda hanya untuk menghindari kesalahan mengambil akar negatif untuk n=1, i=-20.

Fungsi ini fmengambil nilai angka nuntuk diuji dari STDIN. Python hanya mengevaluasi ini sekali, bukan sekali per panggilan fungsi.

Apakah angka tersebut bukan Fibonacci dievaluasi sebagai f(4)*f(-4)menggunakan boolean implisit untuk konversi nomor dan juga untuk tidak Lucas, dan string yang sesuai diambil. Jika spasi tambahan diizinkan, interleaving string akan lebih pendek.

Tidak
sumber
Sketsa bukti adalah tautan mati.
SQB
@SQB Halamannya sepertinya sudah turun, saya tidak bisa menemukannya lagi.
xnor
4

Python 2, 117 byte

F=[1]
L=[2,1]
n=input()
exec 2*n*"F,L=L+[sum(L[-2:])],F;"
print["Pippi","Lucas","Ness","Travis"][(n in F)*2+(n in L)]

Untuk daftar string, "Pippi Lucas Ness Travis".split()panjangnya sama.

Sp3000
sumber
3

CJam, 58 55 54 byte

ri5Zbe!f{1${_-2>:++}*&!}2b"Travis Ness Lucas Pippi"S/=

Pendekatan naif menghasilkan angka Fibonacci dan Lucas kemudian menghitung kejadian di keduanya, mengonversi menjadi biner, dan memilih string yang sesuai.

Cobalah online .

Sp3000
sumber
3

Serius, 69 byte

,;;r`;F@2+F+`M2@q@#"%d="%£MΣ@f0≤2*+["Pippi","Lucas","Ness","Travis"]E

Sebelum tantangan ini, Serius memiliki builtin f(indeks dalam angka Fibonacci, -1 jika bukan angka Fibonacci) ... tetapi bukan indeks dalam daftar atau "ada dalam daftar"! (Sejak itu ditambahkan sebagai í.)

Akibatnya, inilah yang saya habiskan untuk mencari apakah inputnya adalah angka Fibonacci:

,                              f0≤

Inilah yang saya habiskan menghasilkan daftar nomor Lucas:

  ;r`;F@2+F+`M2@q

Dan inilah yang saya habiskan untuk menemukan jika inputnya ada di daftar nomor Lucas:

 ;                @#":%d:="%£MΣ

Itu adalah string yang diformat menggunakan notasi Python menjadi sesuatu seperti :610:=, dan dikonversi ke fungsi, yang kemudian dipetakan di atas array dan dijumlahkan. (Angka-angka Lucas unik, sehingga jumlahnya selalu 0 atau 1.)

Terima kasih kepada @Mego untuk bit terakhir dengan pemformatan string.

lirtosiast
sumber
3

Perl, 133 (146-15 =) 131 (144-15 =) 129 (136-15 =) 121 byte

+1 byte untuk -nbendera.

$a=$d=1;$b=$c=2;$f+=$_==$a,$l+=$_==$c,($a,$b,$c,$d)=($b,$a+$b,$d,$c+$d)while$a<$_*9;say$_-2016?(Pippi,Ness,Lucas,Travis)[$f+$l*2]:Trump

Dengan baris baru setelah titik koma, untuk keterbacaan:

$a=$d=1;$b=$c=2;
$f+=$_==$a,$l+=$_==$c,($a,$b,$c,$d)=($b,$a+$b,$d,$c+$d)while$a<$_*9;
say$_-2016?(Pippi,Ness,Lucas,Travis)[$f+$l*2]:Trump

Demo:

llama@llama:...code/perl/ppcg64476trump$ for x in 1 2 3 4 5 6 7 8 610 722 843 2016; do echo -n "$x => "; echo $x | perl -n trump.pl; done
1 => Travis
2 => Travis
3 => Travis
4 => Lucas
5 => Ness
6 => Pippi
7 => Lucas
8 => Ness
610 => Ness
722 => Pippi
843 => Lucas
2016 => Trump

Trik:

  • Anda mungkin bertanya-tanya mengapa variabel saya diberi nama $a, $b, $%, dan $d. Itu pertanyaan yang sangat bagus! Bahkan, ini memungkinkan saya untuk menghemat satu byte.

    (stuff) ... ,$l+=$_==$%while$a<$_

    lebih pendek satu byte dari

    (stuff) ... ,$l+=$_==$c while $a<$_

    Ini tidak lagi berlaku karena saya memasukkan kode saya dengan mengatur ulang hal-hal, menyebabkan perubahan nama variabel menjadi tidak lagi menyimpan byte. Saya mengubahnya kembali sehingga nama variabel masuk akal lagi.

  • $_-2?$f+$l*2:3agak menarik. Pada dasarnya, saya harus menggunakan case khusus 2untuk nomor Lucas karena program saya memeriksa apakah suatu angka adalah nomor Lucas setelah "memperbarui" nomor Fibonacci dan Lucas. Jadi 2dianggap sebagai nomor bukan-Lucas. $_-2?foo:baradalah char lebih pendek dari $_==2?bar:foo. Hal yang sama digunakan untuk 2016ujian.

    Ini juga tidak lagi benar karena saya dapat merestrukturisasi program untuk tidak memerlukan casing khusus 2. Tapi saya masih menggunakan $_-2016?stuff:Trumpsebagai gantinya $_==2016?Trump:stuff, yang satu byte lebih lama.

  • Omong-omong, Anda mungkin bertanya-tanya bagaimana saya melakukan restrukturisasi ini. Saya baru saja membuat program melakukan iterasi 9 kali lebih banyak dari yang diperlukan, yang hanya memakan biaya 2 byte ( *9) tetapi memungkinkan saya untuk membuat asumsi di tempat lain yang membantu menurunkan barang golf.

  • Karena variabel default ke nol,

    $f+=$_==$a

    lebih pendek dari

    $f=1if$_==$a
  • Perl mendukung barewords, jadi saya tidak perlu mengutip string saya (\ o /).

Gagang pintu
sumber
Bukankah dua byte lebih pendek?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Program itu sendiri adalah 132 byte, dan saya menambahkan satu karena perlu dipanggil dengan -nflag (seperti disebutkan dalam jawaban).
Gagang Pintu
Oh begitu. Apa yang dilakukan -nbendera?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ini mengasumsikan while(<>) { ... }loop di sekitar program Anda. Lihat: Perl docs .
Gagang Pintu
1
@HomHastings Dia tidak, tapi saya <s> dikonversi </s> meyakinkannya untuk mencoba perl.
spaghetto
2

Julia, 101 100 byte

n->split("Pippi Lucas Ness Travis")[[2;1]⋅(sum(i->[i[];trace(i)].==n,Any[[1 1;1 0]].^(0:n)).>0)+1]

Tidak Disatukan:

function f(n)
  k=Any[[1 1;1 0]].^(0:n) # Produces characteristic matrices of Fibonacci
                          # numbers from 0 to n
  F=sum(i->i[]==n,k)      # Check if n is a Fibonacci number by checking
                          # the first value in each matrix for n
  L=sum(i->trace(i)==n,k) # Check if n is a Lucas number by checking
                          # the trace of each matrix for n
  I=[2;1]⋅[F;L]+1         # Calculate 2F+L+1, which is the index for the next step
  S=split("Pippi Lucas Ness Travis") # Creates array with four strings
                          # saves a byte compared with directly creating array
  return S[I]
      # This uses the above calculations to determine which of the four to return
end
Glen O
sumber
Solusi yang luar biasa! Matriks dan pendekatan penelusuran adalah jenius. Sayang sekali {}sintaks alternatifnya Any[]sudah usang; itu akan menghemat beberapa byte.
Alex A.
2

Oktaf, 93 byte

@(n){'Pippi','Lucas','Ness','Travis'}{(1:2)*any(~rem(real(sqrt(5*n^2+[-20,-4;20,4])),1)).'+1}

Pendekatan ini mirip dengan jawaban MATLAB saya dengan pengecualian bahwa Oktaf memungkinkan Anda untuk mengindeks langsung ke array baru:

{'a', 'b', 'c'}{2}    %// b
Suever
sumber
2

MATL (Non-Kompetisi), 57 55 54 (67-15) = 52 byte

20Kht_vi2^5*+X^Xj1\~a2:*sG2016=-'Lucas Ness Travis Trump Pippi'Ybw)

Cobalah secara Online!

Penjelasan

Sekali lagi, logika yang mirip dengan jawaban saya yang lain di sini dan di sini .

20      % Number literal
K       % Retrieve the number 4 from the K clipboard (the default value)
h       % Horizontal concatenation to produce [20 4]
t       % Duplicate elements
_v      % Negate and vertically append elements (yields [20, 4; -20 -4])
i2^     % Explicitly grab the input and square it
5*      % Multiply by 5
+       % Add this to the matrix ([20, 4; -20 -4])
X^      % Take the square root
Xj      % Ensure that the result is a real number
1\      % Get the decimal component
~       % Create a logical arrays where we have TRUE when no remainder
a       % For each column determine if any element is TRUE
2:      % Create the array 1:2
*       % Perform element-wise multiplication with boolean
s       % Sum the result to yield an index
G       % Explicitly grab the input (again)
2016=   % Check to see if it is 2016 (yields TRUE (1) if equal)
-       % Then subtract the boolean from the index. Since 2016 is NOT a
        % Fibonacci or Lucas number, the original index is 0. Subtracting
        % this boolean, will make this index now -1. For all other non-2016
        % numbers this will have no effect on the index.
'Lucas Ness Travis Trump Pippi' % Create the possible strings values 
        % Note: the 0 index wraps around to the end hence Pippi being at the end.
        % The next to last entry ('Trump') is ONLY accessible via a -1 index as
        % discussed above
Yb      % Split at the spaces to create a cell array
w       % Flip the top two stack elements
)       % Retrieve the desired value from the cell array
Suever
sumber
1

C ++ 11, 176 + 15 (#sertakan) = 191

#include<mutex>
[](int n){std::function<int(int,int)>c=[&](int f,int s){return f-s>n?0:s-n?c(s,f+s):1;};int l=c(2,1),f=c(1,1);l&f?puts("Travis"):l?puts("Lucas"):f?puts("Ness"):puts("Pippi");}

Tidak digabungkan dengan penggunaan. Saya bisa menambahkan penjelasan jika diminta besok, gtg tidur sekarang!

#include <functional>
#include <cstdio>
int main()
{
    auto r = [](int n)
    {
        std::function<int(int, int)> c = [&](int f, int s)
        {
            return f - s > n ? 0 : f - n ? c(s, f + s) : 1;
        };
        int l = c(2, 1), f = c(1, 1);
        l & f ? puts("Travis") : l ? puts("Lucas") : f ? puts("Ness") : puts("Pippi");
    };

    for (int i : { 1, 2, 3, 4, 5, 6, 7, 8, 610, 722, 843 })
    {
        printf("%i - ", i); r(i);
    }
}
Zereges
sumber
1
@sysreq Saya tidak berpikir itu untuk bonus, hanya pernyataan sertakan.
fase
@phase Saya tahu, saya membagi ukuran byte menjadi dua bagian (kode + termasuk), ketika saya melakukan posting fungsi saja dan tidak seluruh program.
Zereges
1

Javascript (ES6), 108 byte

x=>(f=(a,x,y)=>a==y||a==x?1:a<y?0:f(a,y,x+y),b=f(x,0,1),c=f(x,2,1),b&&c?'Travis':b?'Ness':c?'Lucas':'Pippi')

Fungsi yang sama untuk Fibonnacci dan Lucas. Ini adalah fungsi rekursif yang mengambil dua nilai pertama sebagai init.

Naouak
sumber
1

Java, 151 byte

Anda dapat berargumen bahwa Trump tidak akan pernah melakukan outsourcing keputusan penting ini, jadi kami tidak perlu mempublikasikan metode ini, menghemat 7 byte lagi.

public String t(int n){return"Pippi,Lucas,Ness,Travis".split(",")[2*f(n,1,1)+f(n,2,1)];}int f(int a,int x,int y){return a==x||a==y?1:a<y?0:f(a,y,x+y);}

Tidak diikutkan termasuk permohonan ujian utama

public class Trump {

    //Test Invokation
    public static void main(String[] args) {
        int[] n = {1, 2, 3, 4, 5, 6, 7, 8, 610, 722, 843, 2016 };
        for(int i = 0; i < n.length; ++i) {
            System.out.println(""+ n[i] + " => " + new Trump().t(n[i]));
        }
    }


    public String t(int n) {        
        return "Pippi,Lucas,Ness,Travis".split(",")[2*f(n,1,1)+f(n,2,1)];               
    }
    int f(int a,int x,int y) {             
        return a==x||a==y?1:a<y?0:f(a,y,x+y);           
    }

}

Sejauh ini saya tidak menemukan cara untuk menguji 2016 dan mengembalikan "Trump" dalam kode yang kurang dari 15 byte dalam kode.

janschweizer
sumber
Sukai baris pertama penjelasan Anda!
Scott
1

C (gcc) ,  128   120   116  110 byte

a;b;o;f(n){for(o=b=0,a=1;a<=n;b=a+b,a=b-a)o|=(b==n)+2*(2*a+b==n);n=o?o-1?o-2?"Travis":"Lucas":"Ness":"Pippi";}

Cobalah online!

Penjelasan

Mari kita nama F(n)-n jumlah Fibonacci, dan L(n)n th-nomor Lucas.
a, bYang F(n-1), F(n)masing-masing.
Kemudian kita dapat menghitung L(n) == F(n-1)+F(n+1) == 2*F(n-1) + F(n) == 2*a+b
Fungsi ini secara berturut-turut akan menghitung angka Fibonacci dan Lucas, hingga n, dan memeriksa apakah nada di antara mereka.
Jika nadalah angka Fibonacci, bit pertama dari oakan diatur ke 1
Jika nadalah angka Lucas, bit ke-2 oakan diatur untuk 1
okemudian akan digunakan untuk menentukan nama yang akan diproduksi

Edit

  • Disimpan 8 byte dengan mem-mainkan kondisi for-loop: mulai dari iterasi kedua, kita punya a<b<cdan a<a+c=L(n), jadi ( b<=n || a+c<=n ) => a<n. Saya sebenarnya perlu a<=nmenanganinya dengan benarn=1
  • Disimpan 4 byte berkat ceilingcat! (juga memperbaiki kesalahan, kode saya menghasilkan "2 => Ness")
  • Disimpan 6 byte:
    • 2 berkat ceilingcat lagi
    • 4 dengan menghapus variabel c, sama dengan F(n+1), yang tidak berguna karena kita sudah bisa menghitung F(n+1)dengan adanb
Annyo
sumber
Sarankan b+=aalih-alihb=a+b
ceilingcat
0

Perl 5.10, 119 - 15 (bonus) = 104 byte

$_=<>;$j=1;($i,$j)=($j,$i+$j)while$_>$i;say$_-2016?(Pippi,Lucas,Ness,Travis)[($_==$i)*2|$_==3*$j-4*$i|$_-1>>1==0]:Trump

Tidak Disatukan:

# Read line from stdin
$_ = <>;

# Find first Fibonacci number greater than or equal to input.
# Store this number in $i and the next Fibonacci number in $j.
$j = 1;
($i, $j) = ($j, $i + $j) while $_ > $i;

say $_ - 2016
  ? (Pippi,Lucas,Ness,Travis)[
      ($_ == $i) * 2 |          # Bitwise OR with 2 if Fibonacci number
      $_ == 3 * $j - 4 * $i |   # Bitwise OR with 1 if Lucas number >= 3
      $_ - 1 >> 1 == 0          # Bitwise OR with 1 if Lucas number <= 2
    ]
  : Trump

Ini mengeksploitasi fakta itu

L(n-2) = 3 * F(n+1) - 4 * F(n)

adalah angka Lucas terbesar yang lebih rendah atau sama dengan F (n).

nwellnhof
sumber
0

Groovy, 149 byte

f={i->g={m,s->while(s[-2]<=m)s<<s[-2]+s[-1];s}
println(["Pippi","Ness","Lucas","Travis"][(g(i,[1,1]).contains(i)?1:0)+(g(i,[2,1]).contains(i)?2:0)])}

Kode uji:

[1,2,3,4,5,6,7,8,610,722,843].each {
    print "$it => "
    f(it)
}

gadalah penutupan yang menghasilkan daftar angka berdasarkan pada seed ( s) dan nilai maks ( m). (g(i,[1,1]).contains(i)?1:0)+(g(i,[2,1]).contains(i)?2:0)menemukan indeks yang akan digunakan berdasarkan nomor yang sedang lucas atau fibonacci.

J Atkin
sumber
0

MATLAB, 122 119 byte

@(n)subsref({'Pippi','Lucas','Ness','Travis'},substruct('{}',{(1:2)*any(~rem(real(sqrt(5*n^2+[-20,-4;20,4])),1)).'+1}))

Penjelasan singkat

Kami pertama kali membuat array sel yang berisi nilai-nilai untuk mencetak: {'Pippi', 'Lucas', 'Ness', 'Travis'}. Kemudian untuk mengetahui nilai mana yang akan ditampilkan, kami memeriksa untuk melihat apakah itu nadalah angka Fibonacci atau Lucas.

Untuk Fibonnaci, kami menggunakan rumus berikut:

any(~rem(sqrt(5*n^2 + [-4 4]), 1))

Ini memeriksa untuk melihat apakah salah 5*n^2 + 4atau 5*n^2 - 4persegi yang sempurna. Jika anyada, maka itu adalah angka Fibonacci.

Rumus untuk nomor Lucas sangat mirip dengan pengecualian yang kami gunakan +/- 20 bukannya 4:

any(~rem(sqrt(5*n^2 + [-20 20]), 1))

Dalam solusi ini saya menggabungkan dua kasus ini menjadi satu dengan menggunakan matriks:

M = [-20 -4
      20  4]

Dengan menerapkan persamaan yang sama dengan yang di atas, tetapi memaksa anyuntuk mempertimbangkan hanya dimensi pertama, saya mendapatkan array logis dua elemen di mana jika elemen pertama adalah true, maka itu adalah nomor Lucas dan jika elemen kedua adalah true, itu adalah nomor fibonacci .

any(~rem(sqrt(5*n^2 + [-20 -4;20 4]), 1))

Kemudian untuk menghitung indeks ke dalam array sel awal saya, saya memperlakukan ini sebagai urutan biner dengan melakukan perkalian elemen-bijaksana boolean ini dengan [2^0, 2^1]atau hanya [1,2]. Dan jumlah elemen. Jelas saya harus menambahkan 1 karena pengindeksan berbasis satu MATLAB.

index = (1:2) * any(~rem(real(sqrt(5*n^2+[-20,-4;20,4])),1)).' + 1;

Lalu saya harus menggunakan subsrefdan substructmengindeks ke dalam array sel awal untuk mendapatkan hasil akhir.

Suever
sumber
0

JavaScript (ES6), 97 byte

x=>[['Pippi','Lucas'],['Ness','Travis'],f=(a,x,y=1)=>a>x?f(a,y,x+y):a==x||a==1][+f(x,0)][+f(x,2)]

The a==1cek diperlukan kalau tidak saya tidak melihat bahwa 1 adalah angka Lucas.

Neil
sumber
0

Jelly , 47 byte - 15 = 32 (tidak bersaing ...?)

+2ḶÆḞ⁸eð+ị“©ḤʠhMṂƁÞḄṭAƓ»Ḳ¤µ2+С-⁸eḤ
“¡Ỵ¦»Ç⁼?⁽¥Ð

Cobalah online!

Erik the Outgolfer
sumber
0

05AB1E , 39 37 (52 - 15 bonus) byte

2016Qi.•ªb‚•ë>ÅG¹å_¹ÅF¹åi.•F_ïk|»9•ë.•?®B'5n•}2äsè}™

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

2016Qi                # If the input equals 2016:
      .•ªb‚•          #  Push "trump" to the stack
ë                     # Else:
 >ÅG                  #  List of Lucas numbers up to and including the input+1
    ¹å                #  Check if the input is in this list (1 if truthy; 0 if falsey)
      _               #  Invert the boolean (0→1 and 1→0)
 ¹ÅF                  #  List of Fibonacci numbers up to and including the input
    ¹åi               #  If the input is in this list:
       .•F_ïk|»9•     #   Push string "travisnessi" to the stack
    ë                 #  Else:
     .•?®B'5n•        #   Push string "pippilucas" to the stack
    }                 #  Close the inner if-else
     2ä               #  Split the string into two parts
                      #   i.e. "travisnessi" → ["travis","nessi"]
                      #   i.e. "pippilucas" → ["pippi","lucas"]
       sè             #  Index the Lucas result into the list of two strings
}                     # Close the outer if-else
 ™                    # And output the top of the stack in title-case
Kevin Cruijssen
sumber