ทรัมป์ต้องการให้คุณช่วยหยุด Starman!


33

มนุษย์จากดาวได้มาเพื่อโลก! โชคดีที่ประธานาธิบดีโดนัลด์ทรัมป์เป็นประธานาธิบดีของสหรัฐฯ เมื่อใช้ตายนี้เขาสามารถคิดเลขที่คุณนายกเทศมนตรีPodunkต้องใช้เพื่อตัดสินว่าใครควรถูกส่งไปหยุดยั้งผู้บุกรุก! แต่ระวังคุณสามารถส่งจำนวน จำกัด ไบต์ที่ด้านหลังของกบของคุณ!

กำหนดอินพุตของผู้ใช้ (ซึ่งจะเป็นจำนวนเต็มบวก) คุณจะต้องส่งคืนสตริงขึ้นอยู่กับหมวดหมู่หมายเลขใด

  • ถ้าตัวเลขเป็นจำนวนฟีโบนักชีคุณต้องเอาท์พุทเนสส์
  • ถ้าตัวเลขเป็นจำนวนลูคัสคุณต้องเอาท์พุทลูคัส
  • ถ้าจำนวนทั้งจำนวนลูคัสและหมายเลข Fibonacciคุณต้องเอาท์พุทเทรวิส
  • ถ้าตัวเลขเป็นค่า AA ลูคัสจำนวนหรือมิได้จำนวน Fibonacciคุณต้องเอาท์พุทPippi

ตัวอย่าง

ต่อไปนี้เป็นกรณีทดสอบมากมาย:

1 => เทรวิส
2 => เทรวิส
3 => เทรวิส
4 => ลูคัส
5 => Ness
6 => Pippi
7 => ลูคัส
8 => Ness
610 => Ness
722 => Pippi
843 => ลูคัส

กฎระเบียบ

  • นี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
  • โปรแกรมของคุณอาจเป็นโปรแกรมเต็มหรือฟังก์ชั่น (ไม่ระบุชื่อ)

โบนัส

มีโบนัสสองสามอย่างที่คุณสามารถใช้เพื่อช่วยให้กบของคุณรับข้อมูลไปยังประธานาธิบดีทรัมป์ได้เร็วขึ้น:

  • สำหรับ-15ไบต์:ถ้าหมายเลขอินพุทคือ2016คุณต้องเอาท์พุทTrumpเนื่องจากเขาอยู่ที่ตำแหน่งสูงสุดของตำแหน่งประธานาธิบดี

29
สำหรับบันทึกที่ผมไม่ได้เป็นหนึ่งในผู้ Starmen
El'endia Starman


@DavidCarraher เช่นเดียวกับที่คำจำกัดความเริ่มซีรีส์ Fibonacci 0, 1ในขณะที่คนอื่นเริ่มต้นด้วย1, 1ฉันเชื่อว่าสิ่งนี้ขึ้นอยู่กับคำจำกัดความที่คุณใช้ ไม่ใช่เรื่องแปลกที่จะเห็นว่าตัวเลข Lucas เริ่มต้นด้วย2, 1เช่น OEIS มีทั้งสองเวอร์ชัน ( 1 , 2 ) แต่สิ่งที่เริ่มต้นด้วย 2 คือระยะนิยามที่หายไป
Sp3000

2
โหวตควรจะถูกซ่อนไว้ แต่ฉันยังจะบอกว่าผมไม่ชอบการเมืองและว่ามันได้รับผลกระทบการออกเสียงลงคะแนนของฉันกับคำถามนี้ ผู้ถามจะเอาการเมืองออกจากคำถามหรืออย่างน้อยก็จะอธิบายให้ฉันทราบว่าฉันอาจจะพลาดปุนได้ไหม? การอ้างอิงทางการเมืองถูกนำไปใช้เป็นข้อมูลจำเพาะเพื่อความดี แต่ก็ยังสามารถลบออกได้จากชื่อเรื่อง
John Dvorak

3
@JanDvorak: ฉันคิดว่ามันเป็นลิ้นในแก้ม ตัวอย่างเช่นพิจารณาว่าข้อกำหนดของประธานาธิบดีคือ 4 ปีและการเลือกตั้งครั้งต่อไปคือเดือนพฤศจิกายน 2559 หากทรัมป์อยู่ที่ตำแหน่งสูงสุดของประธานาธิบดีในปี 2559 ...
El'endia Starman

คำตอบ:


4

Pyth, 59 - 15 = 44 ไบต์

หรือ 42 ไบต์หลังจากแก้ไขข้อผิดพลาด

&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

อักขระสองตัวแรก ( &Q) เป็นสิ่งที่จำเป็นเนื่องจากข้อผิดพลาดในการแยกวิเคราะห์ Pyth ที่ทำQหลังจาก."ล้มเหลว แก้ไขได้ถูกนำไปใช้ หากอนุญาตให้ใช้ตัวแปล post-bugfix, -2 ไบต์


ไม่มีการบีบอัดสตริงที่อ่านไม่ได้:

Pyth, 63 - 15 = 48 ไบต์

49 ไบต์โดยไม่มีทรัมป์

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

ชุดทดสอบ

ตรงไปตรงมาสวยเพียงสร้างลำดับที่ซ้ำกันและตรวจสอบการเป็นสมาชิก

ลำดับที่ถูกสร้างขึ้นโดยเริ่มต้นด้วย[1, 2]และ[2, 1]แล้วการใช้กฎฟีโบนักชี


9

Julia, 146 142 121 120 ไบต์

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]

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่ส่งคืนบูลีน f=n->...เรียกว่าให้มันชื่อเช่น

Ungolfed:

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

แก้ไขปัญหาและบันทึก 7 ไบต์ด้วย Glen O!


7

Mathematica 143 156 - 15 (โบนัส) = 141 ไบต์

บันทึก 2 ไบต์ด้วย 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]

1
FalseและTrueสามารถถูกแทนที่ด้วย1<0และตอบ1>0สนอง
LegionMammal978


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

กุญแจสำคัญคือการตรวจสอบแบบเลขคณิตสองประการสำหรับหมายเลขฟีโบนักชีและลูคัส:

  • nเป็นจำนวนฟีโบนักชีแน่นอนว่า5*n*n+4หรือ 5*n*n-4เป็นสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ
  • nเป็นจำนวนที่ลูคัสว่าถ้า5*n*n+20หรือ 5*n*n-20เป็นตารางที่สมบูรณ์

เว็บไซต์นี้มีภาพวาดหลักฐาน

ดังนั้นการส่งออกขึ้นอยู่กับค่าของ5*n*n+iสำหรับในi {4,-4,20,-20}ฟังก์ชั่นfการทดสอบค่าiโดยการตรวจสอบถ้าค่าที่สอดคล้องกันไม่ได้มีจำนวนทั้งหมดตารางรากจะมีเพียงเพื่อหลีกเลี่ยงข้อผิดพลาดของการใช้รากของเชิงลบสำหรับabsn=1, i=-20

ฟังก์ชันfใช้ค่าของตัวเลขnเพื่อทดสอบจาก STDIN Python ประเมินค่านี้เพียงครั้งเดียวไม่ใช่หนึ่งครั้งต่อการเรียกใช้ฟังก์ชัน

ไม่ว่าจะเป็นตัวเลขที่ไม่ได้เป็นฟีโบนักชีจะถูกประเมินว่าf(4)*f(-4)ใช้บูลีนแบบปริยายในการแปลงตัวเลขและในทำนองเดียวกันไม่ใช่ลูคัสและมีการใช้สตริงที่เกี่ยวข้อง หากอนุญาตให้เว้นวรรคต่อท้ายสตริง interleaving จะสั้นลง


ภาพร่างหลักฐานเป็นการเชื่อมโยงที่ตายแล้ว
SQB

@SQB หน้านี้ดูเหมือนจะล้มลงฉันไม่สามารถหามันได้อีก
xnor

4

Python 2, 117 ไบต์

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

สำหรับรายการสตริง"Pippi Lucas Ness Travis".split()มีความยาวเท่ากัน


3

CJam, 58 55 54 ไบต์

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

วิธีNaïveในการสร้างตัวเลข Fibonacci และ Lucas จากนั้นนับจำนวนที่เกิดขึ้นในทั้งสองแปลงเป็นไบนารี่และเลือกสตริงที่เหมาะสม

ลองมันออนไลน์


3

อย่างจริงจัง 69 ไบต์

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

ก่อนที่จะมีความท้าทายนี้อย่างจริงจังมี builtin f(ดัชนีในหมายเลขฟีโบนักชี -1 ถ้าไม่ใช่หมายเลขฟีโบนักชี) ... แต่ไม่ใช่ดัชนีในรายการหรือ "อยู่ในรายการ"! (นับตั้งแต่มีการเพิ่มเป็นí)

ดังนั้นนี่คือสิ่งที่ฉันใช้ค้นหาว่าอินพุตเป็นหมายเลขฟีโบนักชี:

,                              f0≤

นี่คือสิ่งที่ฉันใช้สร้างรายการหมายเลข Lucas:

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

และนี่คือสิ่งที่ฉันใช้ค้นหาว่าอินพุตอยู่ในรายการหมายเลข Lucas หรือไม่:

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

นั่นคือสตริงที่มีการจัดรูปแบบโดยใช้เครื่องหมาย% Python เป็นอะไรเช่น:610:=นั้นและถูกแปลงเป็นฟังก์ชันซึ่งจะถูกแมปผ่านอาร์เรย์และสรุป (หมายเลข Lucas ไม่ซ้ำกันดังนั้นผลรวมจะเป็น 0 หรือ 1 เสมอ)

ขอบคุณ @Mego สำหรับบิตสุดท้ายที่มีการจัดรูปแบบสตริง


3

Perl, 133 (146-15 =) 131 (144-15 =) 129 (136-15 =) 121 ไบต์

+1 ไบต์สำหรับ-nแฟล็ก

$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

ด้วยการขึ้นบรรทัดใหม่หลังเครื่องหมายอัฒภาคเพื่อความสะดวกในการอ่าน:

$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

การสาธิต:

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

เคล็ดลับ:

  • คุณอาจจะสงสัยว่าทำไมตัวแปรของฉันจะถูกตั้งชื่อ$a, $b, และ$% $dนั่นเป็นคำถามที่ยอดเยี่ยม! ในความเป็นจริงมันช่วยให้ฉันบันทึกไบต์

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

    สั้นกว่าหนึ่งไบต์

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

    สิ่งนี้ใช้ไม่ได้อีกต่อไปเพราะฉันเล่นกอล์ฟรหัสของฉันโดยจัดเรียงสิ่งต่าง ๆ ทำให้ชื่อตัวแปรเปลี่ยนเป็นไม่บันทึกไบต์อีกต่อไป ฉันเปลี่ยนมันกลับเพื่อให้ชื่อตัวแปรเหมาะสมอีกครั้ง

  • $_-2?$f+$l*2:3เป็นที่น่าสนใจอย่างอ่อนโยน โดยทั่วไปฉันต้องเป็นกรณีพิเศษ2สำหรับหมายเลข Lucas เพราะโปรแกรมของฉันตรวจสอบว่าตัวเลขเป็นหมายเลข Lucas หลังจาก "อัปเดต" หมายเลข Fibonacci และ Lucas หรือไม่ ดังนั้นจึง2ถือว่าเป็นหมายเลขที่ไม่ใช่ลูคัส เป็นถ่านที่สั้นกว่า$_-2?foo:bar $_==2?bar:fooสิ่งเดียวกันใช้สำหรับการ2016ทดสอบ

    2นอกจากนี้ยังเป็นไม่จริงเพราะผมสามารถที่จะปรับโครงสร้างโปรแกรมที่จะไม่จำเป็นต้องพิเศษปลอก แต่ฉันยังคงใช้$_-2016?stuff:Trumpแทน$_==2016?Trump:stuffซึ่งเป็นอีกหนึ่งไบต์

  • เมื่อพูดถึงเรื่องนี้คุณอาจสงสัยว่าฉันทำโครงสร้างนี้ได้อย่างไร ฉันเพิ่งทำโปรแกรมทำซ้ำมากกว่าที่จำเป็น 9 เท่าซึ่งมีราคาเพียง 2 ไบต์ ( *9) แต่อนุญาตให้ฉันตั้งสมมติฐานที่อื่นที่ช่วยเรื่องกอล์ฟลง

  • เนื่องจากตัวแปรเริ่มต้นเป็นศูนย์

    $f+=$_==$a

    สั้นกว่า

    $f=1if$_==$a
  • Perl สนับสนุน barewords ดังนั้นฉันไม่จำเป็นต้องอ้างอิงสตริงของฉัน (\ o /)


มันสั้นลงสองไบต์หรือไม่
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴตัวโปรแกรมเองคือ 132 ไบต์และฉันเพิ่มหนึ่งอันเพราะมันต้องถูกเรียกพร้อมกับ-nแฟล็ก (ดังที่ระบุไว้ในคำตอบ)
Doorknob

อ้อเข้าใจแล้ว. อะไร-nธงทำอย่างไร
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴมันจะwhile(<>) { ... }วนรอบโปรแกรมของคุณ ดู: เอกสาร Perl
Doorknob

1
@DomHastings เขาไม่ได้ แต่ฉัน <s> กลับใจ </s> โน้มน้าวให้เขาลอง Perl
ปาเก็ตตี้

2

จูเลีย101 100 ไบต์

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

Ungolfed:

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

ทางออกที่ยอดเยี่ยม! วิธีการเมทริกซ์และการติดตามคืออัจฉริยะ มันแย่เกินไปที่{}ไวยากรณ์ทางเลือกสำหรับAny[]จะถูกคัดค้าน ที่จะบันทึกสองสามไบต์
Alex A.

2

คู่, 93 ไบต์

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

วิธีนี้คล้ายกับคำตอบ MATLAB ของฉันโดยมีข้อยกเว้นที่ Octave อนุญาตให้คุณสร้างดัชนีโดยตรงในอาร์เรย์สด:

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

2

MATL (ไม่ใช่การแข่งขัน), 57 55 54 (67-15) = 52 ไบต์

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

ลองออนไลน์!

คำอธิบาย

อีกครั้งตรรกะคล้ายกับคำตอบอื่น ๆ ของฉันที่นี่และที่นี่

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

1

C ++ 11, 176 + 15 (#include) = 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");}

Ungolfed กับการใช้งาน ฉันสามารถเพิ่มคำอธิบายได้หากได้รับการร้องขอในวันพรุ่งนี้ gtg เข้านอนตอนนี้!

#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);
    }
}

1
@sysreq ฉันไม่คิดว่ามันเป็นโบนัส แต่รวมถึงคำสั่ง
เฟส

@ เฟสฉันรู้ว่าฉันกำลังแบ่งขนาดไบต์เป็นสองส่วน (รหัส + รวม) เมื่อฉันโพสต์ฟังก์ชั่นเพียงแค่ไม่ใช่โปรแกรมทั้งหมด
Zereges

1

Javascript (ES6), 108 ไบต์

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

ฟังก์ชั่นเดียวกันสำหรับ Fibonnacci และ Lucas มันเป็นฟังก์ชันแบบเรียกซ้ำที่ใช้สองค่าแรกเป็น init


1

Java, 151 ไบต์

คุณสามารถยืนยันว่าทรัมป์จะไม่ outsource การตัดสินใจที่สำคัญนี้ดังนั้นเราจึงไม่จำเป็นต้องเปิดเผยวิธีการให้เป็นสาธารณะและประหยัดอีก 7 ไบต์

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);}

Ungolfed รวมถึงการร้องขอการทดสอบหลัก

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);           
    }

}

ฉันไม่พบวิธีที่จะทดสอบสำหรับปี 2559 และส่งคืน "ทรัมป์" ในโค้ดที่น้อยกว่า 15 ไบต์ในโค้ด


ชอบที่บรรทัดแรกของคำอธิบายของคุณ!
สกอตต์

1

C (gcc) ,  128   120   116  110 ไบต์

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";}

ลองออนไลน์!

คำอธิบาย

ลองตั้งชื่อF(n)หมายเลข Fibonacci L(n)ที่ n และหมายเลข Lucas ที่ n
a, bมีF(n-1), F(n)ตามลำดับ
จากนั้นเราสามารถคำนวณL(n) == F(n-1)+F(n+1) == 2*F(n-1) + F(n) == 2*a+b
ฟังก์ชันนี้จะคำนวณตัวเลขฟีโบนักชีและลูคัสอย่างต่อเนื่องnและตรวจสอบว่าnเป็นหมายเลขใด
ถ้าnเป็นหมายเลขฟีโบนักชีบิตที่ 1 oจะตั้งเป็น1
หากnเป็นหมายเลขลูคัสบิตที่ 2 oจะถูกตั้งเป็น1
oจากนั้นจะถูกใช้เพื่อกำหนดชื่อที่จะส่งออก

แก้ไข

  • ที่บันทึกไว้ 8 ไบต์โดยการเล่นกอล์ฟสภาพของสำหรับวง: เริ่มต้นที่ซ้ำสองเรามีa<b<cและเพื่อให้a<a+c=L(n) ( b<=n || a+c<=n ) => a<nฉันต้องการa<=nจัดการอย่างถูกต้องn=1
  • บันทึก 4 ไบต์ด้วยการติดเพดานแบบแมว! (แก้ไขข้อผิดพลาดรหัสของฉันกำลังแสดงผล "2 => Ness")
  • บันทึก 6 ไบต์:
    • 2 ต้องขอบคุณ catcat อีกครั้ง
    • 4 โดยการลบตัวแปรcเท่ากับF(n+1)ซึ่งไม่มีประโยชน์เนื่องจากเราสามารถคำนวณF(n+1)ด้วยaและb

แนะนำb+=aแทนb=a+b
ceilingcat

0

Perl 5.10, 119 - 15 (โบนัส) = 104 ไบต์

$_=<>;$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

Ungolfed:

# 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

วิธีนี้ใช้ประโยชน์จากความจริงที่ว่า

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

เป็นตัวเลขลูคัสที่ยิ่งใหญ่ที่สุดที่ต่ำกว่าหรือเท่ากับ F (n)


0

Groovy, 149 ไบต์

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)])}

รหัสทดสอบ:

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

gเป็นการปิดที่สร้างรายการหมายเลขตาม seed ( s) และค่าสูงสุด ( m) (g(i,[1,1]).contains(i)?1:0)+(g(i,[2,1]).contains(i)?2:0)ค้นหาดัชนีที่จะใช้ตามจำนวนลูคัสหรือฟีโบนักชี


0

MATLAB, 122 119 ไบต์

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

คำอธิบายสั้น ๆ

{'Pippi', 'Lucas', 'Ness', 'Travis'}ครั้งแรกที่เราสร้างอาร์เรย์เซลล์ที่มีค่าในการพิมพ์: จากนั้นเมื่อต้องการทราบว่าจะแสดงค่าใดเราจะตรวจสอบว่าnเป็นหมายเลขฟีโบนักชีหรือลูคัส

สำหรับ Fibonnaci เราใช้สูตรต่อไปนี้:

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

การตรวจสอบนี้เพื่อดูว่าอย่างใดอย่างหนึ่ง5*n^2 + 4หรือ5*n^2 - 4เป็นตารางที่สมบูรณ์แบบ ถ้าanyเป็นเช่นนั้นก็เป็นตัวเลขฟีโบนักชี

สูตรสำหรับหมายเลข Lucas นั้นคล้ายกันมากกับข้อยกเว้นที่เราใช้ +/- 20 แทน 4:

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

ในโซลูชันนี้ฉันรวมสองกรณีนี้เป็นหนึ่งโดยใช้เมทริกซ์:

M = [-20 -4
      20  4]

โดยการใช้สมการเดียวกันกับที่กล่าวมาข้างต้น แต่บังคับanyให้พิจารณาเฉพาะมิติแรกฉันจะได้รับตรรกะสององค์ประกอบซึ่งถ้าองค์ประกอบแรกเป็นtrueแล้วมันคือหมายเลข Lucas และถ้าองค์ประกอบที่สองคือtrueมันเป็นหมายเลขฟีโบนักชี .

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

จากนั้นเพื่อคำนวณดัชนีในอาร์เรย์เซลล์เริ่มต้นของฉันฉันถือว่าสิ่งนี้เป็นลำดับไบนารีโดยทำการคูณองค์ประกอบที่ชาญฉลาดของบูลีนนี้ด้วย [2^0, 2^1][1,2]หรือเพียงแค่ และรวมองค์ประกอบ เห็นได้ชัดว่าฉันต้องเพิ่ม 1 เนื่องจากการจัดทำดัชนีแบบฐานเดียวของ MATLAB

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

จากนั้นฉันต้องใช้subsrefและsubstructทำดัชนีในอาร์เรย์เซลล์เริ่มต้นเพื่อให้ได้ผลลัพธ์สุดท้าย


0

JavaScript (ES6), 97 ไบต์

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

a==1ตรวจสอบเป็นสิ่งจำเป็นอย่างอื่นผมไม่ทราบว่า 1 เป็นจำนวนลูคัส



0

05AB1E , 39 37 (52 - 15 โบนัส) ไบต์

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

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.