トランプはスターマンを止めるためにあなたの助けが必要です!


33

星から来たが地球にやってきた!幸いなことに、米国大統領のドナルドトランプは、無限の側面で死ぬ。このダイを使用して、彼は、Podunkの市長であるあなたが侵入者を止めるために誰を送るべきかを決定するために使用しなければならない数字を思い起こすことができます!しかし、注意してください、あなたはあなたのカエルの背中に限られた量のバイトしか送ることができません!

ユーザー入力(正の整数)が与えられると、番号が含まれるカテゴリに応じて文字列を返す必要があります。

  • 数値がフィボナッチ数の場合、Nessを出力する必要があります。
  • 番号がある場合はルーカスの数は、出力する必要がありルーカス
  • 数値がルーカス数フィボナッチ数の両方である場合、Travisを出力する必要があります。
  • 数がある場合もない AA ルーカス番号フィボナッチ数は、出力する必要がありピッピ

テストケースは次のとおりです。

1 =>トラビス
2 =>トラビス
3 =>トラビス
4 =>ルーカス
5 =>ネス
6 =>ピッピ
7 =>ルーカス
8 =>ネス
610 =>ネス
722 =>ピッピ
843 =>ルーカス

ルール

  • これはで、バイト単位の最短回答が勝ちです。
  • プログラムは、完全なプログラムまたは(n匿名)関数である場合があります。

ボーナス

カエルがトランプ大統領にデータをより速く届けるのを助けるために使用できるいくつかのボーナスがあります:

  • 以下のための-15バイト:入力番号がある場合は2016、あなたを出力しなければならないTrump、彼は彼の大統領職のピークであるとして。

29
記録のために、私はそれらのスターマンの一人ではありません。
エレンディアスターマン


いくつかの定義は、とフィボナッチ数列を始めるかのような@DavidCarraherただ、0, 1他の人がして起動している間は1, 1、私は、これはあなたが使用して定義に依存信じています。それはルーカス数字で始まる見ることも珍しくありません2, 1例えばOEISは、両方のバージョン(持って、12)が、2で始まる1は、定義フェーズがでてしまったです。
Sp3000

2
投票は隠されることになっていますが、私はまだ政治が嫌いであり、この質問に対する投票に影響を与えていると私は言います。質問者は質問から政治を削除することを心に留めますか、それとも私が見逃したかもしれないしゃれを説明してくれますか?政治的な参照は仕様に組み込まれますが、タイトルからは削除できます。
ジョンドヴォルザーク

3
@JanDvorak:それは非常に冗談だと思います。たとえば、...大統領用語は4年であることを、そしてトランプは、2016年に彼の大統領のピークである場合には次の選挙は、11月2016年であることを考える
El'endiaスターマン

回答:


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

最初の2つの文字(&Q)ためになりPyth解析するバグのために必要なQ後に."失敗します。修正が適用されました。バグ修正後のインタープリターが許可されている場合、-2バイト。


読めない文字列圧縮なし:

Pyth、63-15 = 48バイト

トランプなしの49バイト

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

テストスイート

簡単です。シーケンスを生成し、複製してメンバーシップを確認するだけです。

シーケンスが始まるによって生成された[1, 2][2, 1]し、その後フィボナッチルールを適用します。


9

ジュリア、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->...ます。

ゴルフをしていない:

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

グレンOのおかげで問題を修正し、7バイト節約しました!


7

Mathematica 143156-15 (ボーナス)= 141バイト

LegionMammal978のおかげで2バイトが節約されました。

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<01>0respecively。
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)]

重要なのは、フィボナッチ数とルーカス数の2つの純粋な算術チェックです。

  • n5*n*n+4または 5*n*n-4完全に正方形の場合、フィボナッチ数
  • n5*n*n+20または 5*n*n-20、完全な正方形である場合、ルーカス数

このサイトには証明スケッチがあります。

したがって、出力は次の値に依存します。 5*n*n+iするためにiの中で{4,-4,20,-20}。この関数は、対応する値整数の平方根を持たないかどうかをチェックすることによりf、の値をテストします。の負の根をとるエラーを回避するためだけにあります。iabsn=1, i=-20

この関数fは、nテストする数値の値をSTDINから取得します。Pythonは、関数呼び出しごとに1回ではなく、これを1回だけ評価します。

数値がフィボナッチではないかどうかはf(4)*f(-4)、暗黙のブール値から数値への変換を使用して評価され、ルーカスではない場合と同様に、対応する文字列が取得されます。末尾のスペースが許可されている場合、文字列のインターリーブは短くなります。


プルーフスケッチはデッドリンクです。
-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/=

フィボナッチ数とルーカス数を生成し、両方の出現をカウントし、バイナリに変換し、適切な文字列を選択する単純なアプローチ。

オンラインでお試しください


3

真剣に、69バイト

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

この挑戦の前に、真剣にビルトインf(フィボナッチ数のインデックス、フィボナッチ数でない場合は-1)がありました...リストのインデックスまたは「リストにある」ではありませんでした!(それはその後として追加されましたí。)

その結果、入力がフィボナッチ数である場合、これは私が見つけることに費やすものです:

,                              f0≤

これは、ルーカス番号のリストを生成するために費やしたものです。

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

そして、入力がルーカス数のリストにある場合、これは私が見つけることに費やすものです:

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

これは、Pythonの%表記を使用して次のような形式にされた文字列です :610:=され、関数に変換され、配列にマッピングされて合計されます。(ルーカス番号は一意であるため、合計は常に0または1です。)

最後の文字列の書式設定について@Megoに感謝します。


3

Perl、133 (146-15 =)131 (144-15 =)129(136-15 =)121バイト

-nフラグ用に+1バイト。

$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。それは素晴らしい質問です!実際、1バイトを保存できます。

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

    より1バイト短い

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

    コードを変更してコードを変更し、変数名の変更によりバイトが節約されなくなったため、これはもはや適用されません。変数名が再び意味を持つように、元に戻しました。

  • $_-2?$f+$l*2:3少しおもしろいです。2私のプログラムは、フィボナッチ数とルーカス数「更新」した、ルーカス数であるかどうかをプログラムがチェックするため、基本的にルーカス数の特別なケースが必要でした。そう2ではない-ルーカス数と考えられました。$_-2?foo:barはより短い文字です$_==2?bar:foo2016テストにも同じものが使用されます。

    また、特別なケーシングを必要としないようにプログラムを再構築できたため、これも当てはまりません2。しかし、私はまだ1バイト長いの$_-2016?stuff:Trump代わりに使用します$_==2016?Trump:stuff

  • そういえば、このリストラをどうやってやったのか不思議に思うかもしれません。プログラムに必要な反復の9倍の反復を行わせただけで、2バイト(*9)しかかかりませんが、ゴルフを減らすために他の場所で仮定することができます。

  • 変数のデフォルトはゼロであるため、

    $f+=$_==$a

    より短い

    $f=1if$_==$a
  • Perlはベアワードをサポートしているため、文字列(\ o /)を引用符で囲む必要はありません。


2バイト短くないですか?
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴプログラム自体は132バイトであり、-nフラグを付けて呼び出す必要があるため追加しました(回答に記載されています)。
ドアノブ

ああなるほど。-nフラグは何をしますか?
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴ while(<>) { ... }プログラムの周りのループを想定しています。Perlのドキュメントを参照してください。
ドアノブ

1
@DomHastings彼はそうではありませんでしたが、私は彼にperlを試すよう説得しました。
spaghetto

2

ジュリア、101100バイト

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

ゴルフをしていない:

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[]が廃止されるのは残念です。数バイト節約できます。
アレックス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");}

使用法とゴルフ。明日、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これはボーナスのためではなく、ただincludeステートメントだと思います。
フェーズ

私が知っている@phase、私はプログラム全体ではなく機能だけを投稿するとき、バイトサイズを2つの部分(コード+インクルード)に分割しています。
ゼレゲス

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

フィボナッチとルーカスで同じ機能。これは、最初の2つの値を初期化する再帰関数です。


1

Java、151バイト

トランプはこの重要な決定を外注しないので、メソッドを公開する必要はなく、別の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);}

テストメインの呼び出しを含むゴルフなし

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

}

これまでのところ、2016年のテストを行い、コードで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)n番目のフィボナッチ数とL(n)n番目のルーカス数に名前を付けましょう。
abある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がフィボナッチ数である、の最初のビットoが設定されますがルーカス数である1
場合n、の2番目のビットoが設定されます1
o、出力先の名前を決定するために使用されるであろうが

編集

  • forループの条件をゴルフすることで8バイトを節約しました。2回目の反復から始めて、 a<b<ca<a+c=L(n)そう、( b<=n || a+c<=n ) => a<n。私は実際に必要でしたa<=n正しく処理するがありましたn=1
  • ceilingcatのおかげで4バイト節約されました!(ミスも修正しました。私のコードは「2 => Ness」を出力していました)
  • 6バイト保存:
    • 2再びceilingcatに感謝
    • 4変数を除去することcに等しく、F(n+1)我々は既に計算することができるので、無駄であった、F(n+1)ab

提案する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

ゴルフをしていない:

# 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は、シード(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 + 45*n^2 - 4が完全な正方形である。もしanyそれらの、それはフィボナッチ数です。

ルーカス数の式は、4ではなく+/- 20を使用することを除いて、非常に似ています。

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

このソリューションでは、マトリックスを使用してこれら2つのケースを1つに組み合わせました。

M = [-20 -4
      20  4]

上記と同じ式を適用しますがany、最初の次元のみを考慮することにより、最初の要素がのtrue場合、それはルーカス数であり、2番目の要素がの場合、trueフィボナッチ数である2要素の論理配列を取得します。

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

次に、初期のセル配列へのインデックスを計算するために、このブール値の要素ごとの乗算[2^0, 2^1]またはを単純に実行することにより、これをバイナリシーケンスとして扱い[1,2]ます。そして、要素を合計します。明らかに、MATLABの1ベースのインデックス作成のため、1を追加する必要があります。

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

私は使用する必要がありsubsrefsubstruct最終的な結果を得るために、初期セルアレイへのインデックス。


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

05AB1E39 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.