iOS 11計算機を実装する


43

iOS 11には、1 + 2 + 3の結果が24になるバグがあります。これはアニメーションの速度に関連していますが、とにかく:

タスクは作成すること1 + 2 + 3 == 24です。しかし、それだけ。したがって、ほとんどのシーケンスを正しく合計するが24、引数が12あり3、任意の順序で返される関数を提供する必要があります。

入力例:

1 2 => 3
3 4 => 7
1 2 3 4 5 6 7 8 9 => 45
3 2 1 => 24
2 1 3 => 24
1 1 => 2
1 2 3 => 24
40 2 => 42
1 2 2 4 => 9
1 2 3 4 1 2 3 => 16
1 => 1
1 23 => 24
0 1 2 => 3
3 2 3 => 8

コードが任意の数の引数を受け入れる限り、入力は任意の形式にすることができます。

  • 負の数のサポートは必要ありません(0を含むすべての負でない数が機能するために必要です)
  • 正しい入力とします

別の同様の質問との違い:「6を9倍すると何が得られますか?(42)」

  • この場合、関数は任意の数の引数を受け入れる必要があります。古い質問では正確に2が指定されています。
  • この場合、順序は重要ではありませんが、古い質問では順序6 9が必要であり、9 6正しく評価する必要があると指定されていました。

23
また、iOS 11はそのようには動作しません。代わりにこのようにする必要があります。(コードの説明
-user202729

3
@ user202729質問はおそらくiOS 11に触発されたものです。私はOPが完全にそれを複製するようにあなたに求めているとは思いません。
Okx

2
@Okx正確に。これは楽しみのためであり、1対1で実装するのではありません。もちろん、これはuser202729の提案に変更できますが、必要であれば、そのようなタスクで新しいチャレンジを作成できます。
-Hauleth

3
入力は整数ですか?
-xnor

9
これが美しい挑戦である理由の1つは、この数字の組み合わせが非常に特別であるという点に関連する特性のためです。これが美しい挑戦であるもう1つの理由は、機能よりもUXの優先順位を(彼らの考え)にAppleに面白がっていることです。
NH。

回答:




11

Java 8、109 106 101 90 75 74 71 66バイト

a->{int s=0,p=0;for(int i:a){s+=i;p|=1<<i;}return s<7&p==14?24:s;}

@OlivierGrégoireのおかげで-12バイト。@Nevayの
おかげで-31バイト。

説明:

ここで試してみてください。

a->{                  // Method with integer-array parameter and boolean return-type
  int s=0,            //  Sum-integer, starting at 0
      p=1;            //  Product-integer, starting at 1
  for(int i:a){       //  Loop over the input-array
    s+=i;             //   Add current item to sum
    p|=1<<i;          //   Take 1 bitwise left-shifted with `i`, and bitwise-OR it with `p`
  }                   //  End of loop
  return p==14        //  If `p` is now exactly 14 (`0b1110`)
    &s<7?             //  and the sum is 6 or lower:
     24               //   Return 24
    :                 //  Else:
     s;               //   Return the sum
}                     // End of method

(非効率)が()で、合計が6以下()の[1,2,3]場合にのみ(任意の順序で)可能な結果になるという証明:ここで試してみてください。p0b1110p==14s<7

p==14(は、0b1110入力値が32のカバーの値を法ときに限り)真と評価12及び3及び他の値(含まないp|=1<<i)(各値は1+回発生しなければなりません)。一致p==14する入力の合計は、(with )6を除くすべての入力よりも大きくなります。ネヴァイ1,2,3s=a*1+b*2+c*3+u*32a>0,b>0,c>0,u>=0


古い71バイトの答え:

a->{int s=0,p=1;for(int i:a){s+=i;p*=i;}return a.length==3&p==s?s*4:s;}

ゼロ以外の自然数が与えられた3つの任意の数について、[1,2,3]その積(1+2+3 == 1*2*3)(正の合計)に等しい合計を持つのは(任意の順序で)だけです
合計が Leo Kurlandchik&Andrzej Nowickiによる

(非効率的)唯一の[1,2,3](任意の順序で)であり、[0,0,0]負でない数と3の長さで可能な結果になることの証明:ここで試してください。
だから、s*4意志はなり6*4 = 24ため[1,2,3]、と0*4 = 0のために[0,0,0]



7

MATL、13バイト

stGp=18*Gda*+

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

他のMATL回答よりも2バイト長くなりますが、まったく異なる(そしてIMOがより興味深い)アプローチを使用しているため、投稿する価値があると考えました。

説明:

このソリューションでは、次の事実を使用します。

3つの要素を持つ配列の合計と積は、配列がの順列である場合にのみ等しくなり1,2,3ます。

これは入力を受け取り、合計を計算しs、それを複製しtます。次に、合計が積に等しいかどうかを確認しますGp=。ブール値1/0に18 を乗算18*し、ベクトルに同一でない値があるかどうかを確認しますda*(再度、ブール値any(diff(x))を乗算します。2を乗算して、最後の数値を元の合計に加算します。

ステップごとの説明:

入力が[1, 2, 3]次のとおりであると仮定します。

s                              % Implicit input, calculate the sum
                               % 6
 t                             % Duplicate the sum:
                               % 6, 6
  G                            % Grab input
                               % 6, 6, [1,2,3]
   p                           % Calculate the product
                               % 6, 6, 6
    =                          % Check if the last two elements are equal
                               % 6, 1 (true)
     18*                       % Push 18, multiply by the last number
                               % 6, 18
        G                      % Grab input
                               % 6, 18, [1,2,3]
         d                     % Calculate the difference between each element
                               % 6, 18, [1,1]
          a                    % any non zero elements?
                               % 6, 18, 1 (true)
           *                   % Multiply last two numbers
                               % 6, 18
            +                  % Add numbers. Result: 24

6

Python 2、39バイト

lambda*a:sum(a)+18*(sorted(a)==[1,2,3])

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

ソートされた入力が他のPythonの回答を1バイトだけ[1, 2, 3]上回る場合、18を追加する別の方法を使用します。


sorted(a)==[1,2,3]set(a)=={1,2,3}3バイトを節約できるようになります。
-mypetlion

1
@mypetlion残念ながら、それは次のような重複したリストに当てはまります[1, 2, 3, 3]
-FlipTack

おっと。私はちょうど3つの入力に制限されていましたが。
-mypetlion

6

Haskell、37バイト

f[a,b,c]|2^a+2^b+2^c==14=24
f l=sum l

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

パターンマッチングを使用して、例外的なケースをキャッチします。

Haskellにはソートが組み込まれていません。等式2^a+2^b+2^c==14[a,b,c][1,2,3]負でない整数間の順列によってのみ満たされます。短いものはa+b+c=a*b*cほとんど機能しますが、で満足され[0,0,0]、チェック,a>0を追加すると1バイト長くなります。


4

オクターブ、34バイト

@(x)sum(x)+isequal(sort(x),1:3)*18

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

または

@(x)(s=sum(x))+18*~(s-6|prod(x)-6)

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

または

@(x)(s=sum(x))+18*~(s-prod(x)|s-6)

これは、他の人が使用するアプローチよりも短いです@(x){24,sum(x)}{2-isequal(sort(x),1:3)}

説明:

ベクトルの合計を取り、ソートされたベクトルがに等しい場合は18を加算し1,2,3ます。これは6+18=24、ベクトルがの順列である1,2,3場合に、そうでない場合はベクトルの合計のみを返します。


4

PHP、116バイト

これは今までで初めてのゴルフチャレンジの試みであり、PHPです。ここではめったに見られないので、明らかにゴルフが苦手な言語です。

<?php
//call as var/www/html/cg_ios.php --'1 2 3 4 5'
$i=$argv[1];$a=(explode(' ',$i));echo((($b=array_sum($a))==6&&count($a)==3&&in_array(3,$a)&&!in_array(0,$a)?24:$b));

注:コメントをバイトカウントに含めませんでした。

非ゴルフ

特別なものではありません。

$i=$argv[1];             //Read the input from the command line
$a=array_filter($c=explode(' ',$i)) //Split the input string into an array, use Whitespace as delimiter
                         //also, remove all 0 from the array, since they are not important at all
echo(                    //print the result
    ($b=array_sum($a) == 6  //If The SUM of the Array is 6 ...
        &&               //... AND ...
    (count($c) == 3)     //... the array has exactly 3 values ...
        &&               //... AND ...
    in_array(3,$a)       // ... the array contains the value 3 ...
        &&               // ... AND ...  
    !in_array(0,$a)      //... the array contains no zeros
        ?
    24                   //print 24
        :
    $b));     //print the sum of the array values we saved earlier

コンソールではなくPHPFiddleでこれをテストしたい場合は、明らかに任意のものに置き換えることができ$iます。

OlivierGrégoireに感謝します。OlivierGrégoireは、[0,3,3]24個前に返された文字列の組み合わせを認識しarray_sum、関数を再度実行する代わりにを保存して返すことでいくつかの文字を保存するのにも役立ちました。


このサイトへようこそ、そして素敵な最初の投稿!
コメアリンガーをケアします。

入力値は[0, 3, 3]どうですか?また、結果をarray_sum($a)変数に保存して再利用することはできませんか?
オリビエグレゴワール

@OlivierGrégoireそれは今も修正されています、私は明らかにそのケースを見逃しました。私はおそらくより良い解決策を考えることができました、これは-私の標準であっても-本当に...面倒です。
YU NO WORK

ゴルフされたコードはargv [1]に$がありません
manassehkatz

4

R、47バイト 34バイト 36バイト

x=scan();all(sort(x)==1:3)*18+sum(x)

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

入力を合計し、入力セットが1:3の場合は18を追加します。
11バイトのゴルフをしてくれた@mltに感謝します。オーバーゴルフされたコードのエラーを特定してくれた@ Ayb4btuに感謝


3

Javascript ES6、39バイト

@Herman Lauensteinに感謝

a=>a.sort()=="1,2,3"?24:eval(a.join`+`)

f=a=>a.sort()=="1,2,3"?24:eval(a.join`+`)

console.log(f([1,2,3]));
console.log(f([1,2,3,4]));

前の答え

Javascript ES6、66バイト

a=>(n=[1,2,3],a.every(_=>n.includes(_))?24:a.reduce((x,y)=>x+y,0))

それを試してみてください

f=a=>(n=[1,2,3],a.every(_=>n.includes(_))?24:a.reduce((x,y)=>x+y,0))

console.log(f([1,2,3]));
console.log(f([1,3,2]));
console.log(f([1,2,3,4]));


58バイト:a=>(Array.sort(a).join()=="1,2,3"?24:a.reduce((x,y)=>x+y))
Okx

a.sort()=="1,2,3"動作します。
ニール

39バイト:a=>a.sort()=="1,2,3"?24:eval(a.joinBT+BT)(BTをバックティックに置き換えます)
Herman L

3

Swift、67バイト

func z(i: [Int])->Int{return i.sorted()==[1,2,3] ?24:i.reduce(0,+)}

[Int]に拡張子を付けて27バイトにすることもできますが、それは不正行為になります:(


1
サイトへようこそ!これはコードゴルフ大会です。スペースを削除するなどして、できるだけコードをゴルフしてください。また、私はスウィフトを知りませんが、私が正しい場合、これは入力を変数に保存しますが、これは許可されていません。ただし、これを関数に変えることは許可されています。
コメアリンガーアーイング

1
少し下がった:func z(i:[Int]){print(i.sorted()==[1,2,3] ?24:i.reduce(0,+))}
ミスターXcoder

1
または55バイト(-12):、{$0.sorted()==[1,2,3] ?24:$0.reduce(0,+)}as([Int])->Int匿名ルールは標準ルールで許可されています。ここでどのように働くかを見ることができます
ミスターXcoder

@ Mr.Xcoderでは、キャストを省略して、宣言しているf定数に追加できます。またはクロージャ内にタイプを入れて、あなたは取り除くas:)
Dominik Bucher

2
Swiftの場合は+1。これはiOS計算機の元のソースコードですか?
GB


2

J、17バイト

Frowny Frogのおかげで-6バイト

+/*1+3*1 2 3-:/:~

すべての数値+/を合計し、結果に(擬似コード)を掛け1 + 3*(is123 ? 1 : 0)ます。つまり、ソート済みリストが1 2 3結果に4を掛けない限り、結果を変更せずに返します。

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

元の答え

+/`(24"_)@.(1 2 3-:/:~)

ソートされた入力が以下であるかどうかを確認します1 2 3-はいの場合、定数関数24(24"_)を呼び出します。そうでない場合は、合計を返します+/

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


私は本当にJを知りませんが、1 2 3→ できi.3ますか?
ウリエル

@Urielはをi.3生成する0 1 2ので1+i.3、文字を保存せずに明確にする必要があります。
ジョナ

右、私は忘れてしまったJは0インデックス付きである
ウリエル

[:+/8"0^:(1 2 3-:/:~)
FrownyFrog

+/@,[*3*1 2 3-:/:~
FrownyFrog


2

Lua116 81バイト

ジョナサンのおかげで-7バイト

コマンドライン引数として入力を受け取ります

Z=0S={}for i=1,#arg do
j=arg[i]+0S[j]=0Z=Z+j
end
print(#S>2 and#arg<4 and 24or Z)

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

説明:

スパース配列Sを作成し、入力値に対応するインデックスにゼロを追加することにより機能します。パラメータが3, 4, 7スパース配列である場合、それらのインデックスには数字のみがあります。その配列により、我々は、オペレータとのそれの長さを取得#インデックスからカウントすることを1、この長さが正確であれば、その中に値を持っている高い屈折率までは3、それが位置の要素があったことを意味し12そして3ウィッヒは、私たちがしているものです探している。スパース配列の長さは常にパラメーターの数の間で0ありNNはパラメーターの数です。したがって、パラメータ配列とスパース配列の両方の長さがであるかどうかを確認する必要があり3ます。



あなたは(それが5分後にまだなかったので、私は、私のコメントを編集しました。; P)は何も見なかった
ケビンCruijssen

ええ、ちょうど私自身の答えで同じ欠陥を見つけました。array-length == 3 AND A == S AND S> 0を使用して修正しました。しかし#args、Luaの長さをチェックするのはバイトが多すぎると思いますか?その場合は、90バイトの答えにロールバックできます。.:(
ケビンCruijssen


@JonathanS。良いもの
フェリペナルディバティスタ

2

R55 45 54 49 57 54 48バイト

Ayb4btuのおかげで多くのバイトと誤ったソリューションを節約できました。

ジュゼッペのおかげで3 9バイト節約されました。私は、という事実を悪用する新しい方法を学び続けていF==0ます。

"if"((s=sum(x<-scan()))-prod(x)|sum(x|1)-3,s,24)

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

最後に他のR回答が勝ちました。


失敗[0,0,0]:の24代わりにを返します0
オリビエグレゴワール

仕様では、「非負」と「単一の数値」の両方を見逃したようです。つかまっている。
BLT

c(1,1,2,3)28代わりに7
-Ayb4btu

@ Ayb4btuいいね、ありがとう。
BLT

1
x=scan();s=sum(x);"if"(s-prod(x)|s-6|length(x)-3,s,24)条件をスワップし、|代わりに使用する&ので、減算できる54バイトです。
ジュゼッペ


1

網膜、21バイト

O`
^1¶2¶3$
24
.+
$*
1

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

入力は改行で区切られていますが、テストスイートでは便宜上コンマ区切りを使用しています。

説明

O`

ソート番号(辞書順、実際には、我々は唯一の入力がある場合を気に123それは違いはありませんいくつかのために)。

^1¶2¶3$
24

入力が1,2,3(何らかの順序で)場合は、24に置き換えます。

.+
$*

各数値を単項に変換します。

1

1s の数をカウントします。これにより、単項数が加算され、10進数に変換されます。


好奇心から、あなたの説明に基づいて、私は最終行が一致のすべての発生をカウントすることを理解しています(1この場合はすべてs)。Retinaは常に1つの最終行に対してこれを行いますか?または1、その間のどこかですべてのs をカウントし、その後、結果を続行して別の何かを実行することもできます(replace-actionsに再び2行を使用します)。また、別の関連する質問:Retinaのどの機能が1行だけを必要としますか?ソート(O`)はその1つであり、他の機能も同様です。しかし、他の?Retinaをもう少し理解しようとしています。:)
ケビンクルーイッセン

1
@KevinCruijssenはい、途中で(カウント)マッチステージを使用できますが、で明示的にマッチステージとしてマークする必要がありますM`。RetinaがデフォルトMReplaceの代わりにatchするのは、単一の末尾行がある場合のみです。AGMTS全てのシングルライン・ステージであり、R2行はされ、OそしてDかどうかに応じて、1行または2行である$(ソート/ deduplicate-にそれらをオンにしたオプションが使用されていることにより段階)。さらに質問がある場合は、Retinaチャットルームでお気軽にpingしてください:chat.stackexchange.com/rooms/41525/retina
Martin Ender


1

PL / SQL - 135の 123のバイト

iを任意のサイズの整数配列入力と仮定します。

if (select sum(s) = exp(sum(ln(s))) from unnest(i) s) then
    return 24;
else
    return (select sum(s) from unnest(i) s);
end if;

PPCGへようこそ!答えが判読不能になったとしても、余分なスペースをすべて削除してゴルフを試すことはできますか(コンパイルする限り)。
オリヴィエ・グレゴワール

1

C ++ 17、 56 54バイト

[](auto...i){return(-i&...)+4|(~i*...)+24?(i+...):24;}

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

作成された関数オブジェクトはコンパイル時に使用できるため、テストはプログラムを実行することなくコンパイラーによって実行されることに注意してください。

説明:

[]             // Callable object with empty closure,
(auto...i)     // deduced argument types,
{              // and deduced return type
  return       //
      (-i&...) //   If the fold over the bitwise AND of the negation of each argument
    +4|        // is unequal to -4, or
      (~i*...) //   if the product of the bitwise complements of the arguments
    +24?       // is unequal to -24, then
      (i+...): //   return the sum of the arguments, otherwise
      24;}     //   return 24.

唯一の非負証拠i...れる(-i&...)等しい-4および(~i*...)-24に等しくは置換されています1, 2, 3

私たちは、最初からということを観察-0= 0、もしあればi= 0そして(-i&...) = 0、私たちはすべてのことを結論付けてi正です。

さて、2の補数で、そのノート-iに相当し~(i - 1)、かつ~i同等です-(i + 1)。De Morganのルールを適用すると、(-i & ...)= ~((i - 1) | ...)= -(((i - 1) | ...) + 1)なので((i - 1) | ...) = 3、同様に-1 ** n * ((i + 1) * ...) = -24nは、奇数であり、((i + 1) * ...) = 24です。

24の素因数は2 ** 3 * 3、そのn<= 4場合n= 1、我々は持っているi - 1 = 3i + 1 = 24、そうn= 3書き込みiなどWLOG a <= b <= c、その後、明らかにaそうでないとして= 1 (a + 1)(b + 1)(c + 1)>また= 27 c<= 4として、それ以外の場合は、(a - 1)|(b - 1)|(c - 1)4以上にcすることはできません。5は24の係数ではないため、4以下にすることはできませんc。したがって、(a - 1)|(b - 1)|(c - 1) = 33以下にします。


1

、9バイト

?K24Σ=ḣ3O

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

説明

?K24Σ=ḣ3O
        O    Sort the input
?    =ḣ3     If it is equal to [1,2,3]:
 K24           Return 24
             Else:
    Σ          Return the sum of the input

以前のソリューション

[2,2]に間違った結果を与え、おそらく他の入力も与えますが、もっと面白かったです。

?ṁD→E§eΠΣ
     §eΠΣ    Build a two-element list with the product and sum of the input
?   E        If the two elements are equal:
             (true for any permutation of [1,2,3] and the list [0,0,0]
 ṁD            Double both elements and sum them
               (This is 4 times the sum: 24 for permutations of [1,2,3], 0 for [0,0,0])
             Else:
   →          Return the last element (the sum)

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


これにより、2,2に対して24
再帰的

@recursiveは実際には16を与えますが、あなたは正しいです。そしておそらく、これはいくつかのより長いアレイでも間違った結果をもたらします...くそー、退屈なソリューションに切り替える必要があります
レオ

0

Pushy、12バイト

gF3RFx?18;S#

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

これは、入力をソートし、それがに等しい場合[1, 2, 3]、18を追加することで機能します。次に、合計が計算されて印刷され、24が18になり、それ以外の場合は通常の回答が追加されます。

         \ Implicit: Input on stack.
g        \ Sort input ascendingly
F3RF     \ On auxiliary stack, push range(3) -> [1, 2, 3]
x?       \ If the stacks are equal:
  18     \    Append 18 to the input
;
S#       \ Print sum of input.



0

ゼリー10 9バイト

Ṣ24S⁼?3R¤

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

エリックのおかげで-1バイト

代替(Mr. Xcoderによる)、これも9バイトの場合:

3R⁼Ṣ×18+S

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

使い方

Ṣ24S⁼?3R¤ - Main link. Argument: l (list)

Ṣ         - Sort
     ?    - Ternary if statement
    ⁼     -  Condition: Is l equal to...
      3R¤ -    [1, 2, 3]
 24       -  If condition: Return 24          
   S      -  Else: Return the sum of the list

Ṣ24S⁼?3R¤9バイトでできます。
エリックアウトゴルファー

または3R⁼Ṣ×18+S、9バイトも。
ミスターXcoder


0

PowerShell、44バイト

param($a)($a-join'+'|iex)+18*!(diff(1..3)$a)

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

PythonおよびJavaScriptの回答と同様のアルゴリズム。入力をリテラル配列として受け取ります$a。次に、すぐに合計$aします。これは、の左辺演算子を形成し+ます。

右側はandのdiff(別名Compare-Object)です-これは、等しい場合は空の配列、等しくない場合は異なる項目の空でない配列のいずれかです-ブール演算で囲まれています。したがって、それらが等しい場合、空の配列(falsey値)はになります。1,2,3$a$true

次に、18に暗黙的にキャスト$true1$falseにキャストし0ます。したがって、18配列が同じ場合は右側、0そうでない場合は右側になります。24入力配列が1,2,3順列にある場合の正しい結果を提供し、そうでない場合は入力配列の合計を提供します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.