ラッキーハウス


30

ラッキーハウスとして知られるスーパーマリオ3Dワールドにはミニゲームがあります。4ブロックのスロットマシンで構成されています。

ラッキーハウス

各ブロックは5つの異なるアイコン(花、葉、ベル、チェリー、ブーメラン)のいずれかであり、プレーヤーの目標は、できるだけ多くの同一のアイコンを取得することです(ビデオを参照))。

プレイヤーにはコインが与えられ、コインはさらにライフに変換されます。あなたの仕事は、獲得した追加のライフの数を計算することです。

一致するアイコンの数に応じて、報われるコインの量は次のとおりです。

  • 一致なし-10コイン
  • 1ペア-100コイン
  • 2ペア-200コイン
  • 三種類-300コイン
  • 4種類-777コイン

100コインごとに1つの追加ライフ(1UP)を獲得します。したがって、1ペアで正確に1UP 、2 ペアで2UP 、3-of-a-kindで 3UP を獲得することが保証されます。ただし、対戦なしまたは4種類の勝ちで獲得したライフの数は、最初のコインストックによって異なります。

ソース:スーパーマリオウィキ

入力

あなたが最初のコイン株式与えられている0c<100と4つの値のリストを[v1v2v3v4]スロットマシンの最終的なアイコンを表します。

出力

余分な生活の数が勝った:、、、37または8を012378

ルール

  • アイコンは、リスト、文字列、または4つの異なるパラメーターなど、適切な形式で取得できます。
  • 各アイコンは、1桁の整数または単一の文字で表されます。。回答で使用されるアイコンのセットを指定してください。(ただし、それらがどのようにFlower、Leaf、Bellなどにマッピングされるかを説明する必要はありません。それはまったく問題ではないからです。)
  • 出力値を再マップすることはできません。
  • これは🎰code isです。

テストケース

次の例では、整数のリストを使用してアイコンを表します。[1..5]

coins  icons      output   explanation
-------------------------------------------------------------------------
  0    [1,4,2,5]    0      no matches  ->  0 +  10 =  10 coins -> nothing
 95    [3,1,2,4]    1      no matches  -> 95 +  10 = 105 coins -> 1UP
 25    [2,3,4,3]    1      one pair    -> 25 + 100 = 125 coins -> 1UP
 25    [4,5,5,4]    2      two pairs   -> 25 + 200 = 225 coins -> 2UP
  0    [2,5,2,2]    3      3-of-a-kind ->  0 + 300 = 300 coins -> 3UP
 22    [1,1,1,1]    7      4-of-a-kind -> 22 + 777 = 799 coins -> 7UP
 23    [3,3,3,3]    8      4-of-a-kind -> 23 + 777 = 800 coins -> 8UP
 99    [3,3,3,3]    8      4-of-a-kind -> 99 + 777 = 876 coins -> 8UP

コインカウントを0〜0.99のフロートとして入力できますか?私は推測しませんが、念のために尋ねます。
グリムミー

1
@Grimyいいえ、整数のみ(またはこの整数を表す文字列)。返事遅れてすみません。
アーナルド

回答:


9

x86-16アセンブリ、 56 41 39バイト

バイナリ:

00000000: b103 33ed ac8b fe51 f2ae 7503 45eb f983  ..3....Q..u.E...
00000010: fd03 7504 80c2 4d43 03dd 59e2 e592 7502  ..u...MC..Y...u.
00000020: 040a 3c64 7201 43                        ..<dr.C

組み立てられていない:

B1 03           MOV  CL, 3              ; set up loop counter for 3 digits
            DIGIT_LOOP: 
33 ED           XOR  BP, BP             ; clear digit matches counter in BP
AC              LODSB                   ; load next digit char into AL
8B FE           MOV  DI, SI             ; start searching at next char
51              PUSH CX                 ; save outer digit loop counter 
            MATCH_LOOP: 
F2/ AE          REPNZ SCASB             ; search until digit in AL is found 
75 03           JNZ  CHECK_FOUR         ; is end of search?
45              INC  BP                 ; if not, a match was found, increment count
EB F9           JMP  MATCH_LOOP         ; continue looping 
            CHECK_FOUR: 
83 FD 03        CMP  BP, 3              ; is four of a kind? 
75 04           JNE  SCORE_DIGIT        ; if not, add number of matches to 1UP's
80 C2 4D        ADD  DL, 77             ; add 77 to coin count 
43              INC  BX                 ; +1 1UP extra for four-of-a-kind
            SCORE_DIGIT:
03 DD           ADD  BX, BP             ; Add number of matches to total, set ZF if 0
59              POP  CX                 ; restore outer digit loop position
E2 E5           LOOP DIGIT_LOOP         ; keep looping
92              XCHG DX, AX             ; coin count to AX for shorter compare
75 02           JNZ  FINAL_SCORE        ; if 1UPs > 0, no consolation prize
04 0A           ADD  AL, 10             ; award 10 coins
            FINAL_SCORE:
3C 64           CMP  AL, 100            ; is coin score over 100?
72 01           JB   DONE               ; if not, no extra 1UP
43              INC  BX                 ; otherwise, increment 1UP
            DONE:

開始コインカウントを入力しDXSI「アイコン」バイトの開始点を指します('1'- '5'、または任意のバイト値)。で1UPの数を出力しBXます。

説明:

4バイトの入力が反復され、右側の残りのバイトと比較され、一致の数がカウントされます。マッチの各タイプのスコアが付与され、合計されます。4種類も3種類と1ペアであるため、各スコアタイプの値は次のように分解できます。

  • 3試合= 4 1UP + 77コイン
  • 2試合= 2 1UP
  • 1試合= 1 1UP

例:

[2, 2, 2, 2] (4種類)= 7 1UP + 77コイン

2 [2, 2, 2] = 3 matches = 4 1UP's + 77 coins
   2 [2, 2] = 2 matches = 2 1UP's
      2 [2] = 1 match   = 1 1UP

[2, 5, 2, 2] (3種類)= 3 1UP

2 [5, 2, 2] = 2 matches = 2 1UP's
   5 [2, 2] = 0 matches
      2 [2] = 1 match   = 1 1UP

[4, 5, 5, 4] (2組)= 2 1UP

4 [5, 5, 4] = 1 match   = 1 1UP
   5 [5, 4] = 1 match   = 1 1UP
      5 [4] = 0 matches

[2, 3, 4, 3] (1ペア)= 1 1UP

2 [3, 4, 3] = 0 matches
   3 [4, 3] = 1 match   = 1 1UP
      4 [3] = 0 matches

獲得した1UPの数が最後に0の場合、10個のコインが授与されます。合計コインが100を超える場合、追加の1UPが授与されます。

以下は、整数値のI / Oを処理するための追加のルーチンを含むPC DOS用のテストプログラムです。

ここに画像の説明を入力してください

DOS用LUCKY.COMをダウンロードしてテストします。


5

ゼリー 23 22 20  19 バイト

-1のおかげエリックOutgolfer(使用³の代わりにȷ2)も、二回新しいバージョンで使用
-1おかげに汚れ(加算の代わりにその後4を減算する前にいずれかを引きます)

たぶん勝てる?

ċⱮ`’SṚḌH׳«777»⁵+:³

リストと整数を生成する整数を受け入れるダイアディックリンク。

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

ċⱮ`’SṚḌH׳«777»⁵+:³ - Link: list a, integer n   e.g. [x,x,x,x], 22
 Ɱ`                 - map across a with:
ċ                   -   count occurrences in a       [4,4,4,4]
   ’                - decrement                      [3,3,3,3]
    S               - sum (call this s)              12
     Ṛ              - reverse (implicit toDigits)    [2,1]
      Ḍ             - un-decimal                     21
       H            - halve                          10.5
         ³          - 100                           100
        ×           - multiply                     1050
           777      - 777                           777
          «         - minimum                       777
               ⁵    - 10                             10
              »     - maximum                       777  (handles 0 -> 10)
                +   - add (n)                       799
                  ³ - 100                           100
                 :  - integer division                7

各タイプの手の評価の仕組み:

           Hand:    no-pair     pair        2-pair      trips       4-of-a-kind
(sorted) counts:    [1,1,1,1]   [1,1,2,2]   [2,2,2,2]   [1,3,3,3]   [4,4,4,4]
      decrement:    [0,0,0,0]   [0,0,1,1]   [1,1,1,1]   [0,2,2,2]   [3,3,3,3]
            sum:    0           2           4           6           12
       reversed:    [0]         [2]         [4]         [6]         [2,1]
     un-decimal:    0           2           4           6           21
         halved:    0           1           2           3           10.5
      times 100:    0           100         200         300         1050
    min(x, 777):    0           100         200         300         777
     max(x, 10):    10          100         200         300         777

代替案20: ĠẈị“¡ıKĖ‘S×4+E{»⁵+:³


あなたはできる置き換えるȷ2³機能は、コマンドライン引数を取らないでいるプログラムを想定しているが、私はあなたが「beatable」の意味考えるものではありませんが、。:P
エリック・ザ・アウトゴルファー

エリックに感謝します、そして、それは私がそれがbeatられると思った方法ではありません^^
ジョナサン・アラン

-1バイト(05AB1EポートのGrimyのおかげ)合計する前に最初にカウントを1減らします。最初の合計ではなく、4ずつ減少する代わりにċⱮ`’SṚḌH׳«777»⁵+:³
ケビンクルーッセン

ありがとう、@ KevinCruijssenは後で更新します(再び素晴らしい仕事です!Grimy!)
ジョナサンアラン

4

Zsh117 ... 60バイト

-13異なる微分基準を使用して、-9ケースを組み合わせて、-28caseステートメントをネストされた算術3項に変更して、-4を@JonathanAllanに感謝して、-1を3項を最適化して、-2をecho追加するときに誤って使用したためジョナサンの最適化。

stdinでコイン数を取り、入力を引数としてブロックします。引数は、数字、文字、または文字列です。./foo.zsh flower leaf flower boomerang

read c
for i;for j;((a+=i<j))
<<<$[!a?7+(c>22):a-6?6-a:c>89]

オンラインで試す: 117 104 95 67 63 62 60

67バイトの回答から得られた魔法を以下に示します。

read coins
for block                  # for each element
  (( a+=${#${@:#$block}} ))
#          ${@:#$block}      remove all elements which don't match
#       ${#            }     count the remaining elements
# (( a+=                 ))  add that number to the total
<<<$[a?(a-12?6-a/2:coins>89):7+(coins>22)]
#    a?                     :7+(coins>22)  4*0 (all elements match all elements)
#      (a-12?     :coins>89)               4*3 (all elements match exactly one)
#      (a-12?6-a/2         )               3*1 + 1*3 ->  6, 6 -  6/2 -> 3
#                                          2*2 + 2*2 ->  8, 6 -  8/2 -> 2
#                                          2*3 + 2*2 -> 10, 6 - 10/2 -> 1


3

Python 2、63バイト

lambda x,l:int([3,1,7.77,2,.1][sum(map(l.count,l))%14%5]+x/1e2)

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

「フィンガープリント」として使用するGammaFunctionと同じアイデアがありましsum(map(l.count,l))。しかし、結果に算術式を使用する代わりに、ルックアップテーブルを使用します。最初にmodチェーンを使用して値を0〜4に押しつぶします%14%5。すべてのポイント値を100で除算すると、数バイト節約されました。


Python 3で62バイト
アーナルド

または単一のmodで61バイト
アーナウド

(ああ...それは実際に無知の体現がしていることだとは気づかなかった。)
アーナルド

3

Python 3、68バイト

def f(c,a):x=sum(map(a.count,a))//2;return[c//90,x-2,7+(c>22)][x//3]

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

Zshの回答のBashポートのCポートのPythonポート。「Pythonでのゴルフのヒント」ページの助けを借りて再ゴルフしました。最後の移植、私は誓います...私はゴルフに慣れている言語を使い果たしました。この戦略が他のPythonの答えと比較してどうだったか興味がありました。繰り返しますが、おそらくこれを克服する方法がいくつかあります。

これは驚くほど良いことがわかったので、他の人がこれを移植または改善できるように、何が起こっているのかをまとめた以下の表を追加しました。

Type          Example  map(a.count,a)  sum(__)   x=__//2  x//3   array lookup
----------------------------------------------------------------------------
none         [1,2,3,4]    [1,1,1,1]        4       2       0      c//90
pair         [1,1,2,3]    [2,2,1,1]        6       3       1      x-2 -> 1
two pair     [1,3,1,3]    [2,2,2,2]        8       4       1      x-2 -> 2
3-of-a-kind  [1,3,1,1]    [3,1,3,3]       10       5       1      x-2 -> 3
4-of-a-kind  [3,3,3,3]    [4,4,4,4]       16       8       2      7+(c>22)

Python 3.8(プレリリース)、63バイト

:=セイウチを称賛!

lambda c,a:[2+c//90,x:=sum(map(a.count,a))//2,9+(c>22)][x//3]-2

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




3

PHP、153 127バイト

@ 640KBは、さらに短縮するためにいくつかの本当に巧妙な変更を加えました。

function($c,$s){for(;++$x<6;$n+=$m>3?777:($m>2?300:($m>1)*100))for($m=!$y=-1;++$y<5;$m+=$s[$y]==$x);return($c+($n?:10))/100|0;}

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


1
こんにちは@ XMark、CGCCへようこそ!素敵な投稿!私はもう少しゴルフをして、-26バイト127バイト、TIOを得ました。来てください!
640KB



2

Perl 5、46 -pFバイト

map$q+=$$_++,@F;$_=0|<>/100+($q>5?7.77:$q||.1)

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

入力の最初はスピン結果で、5つの一意のASCII文字を使用しますが、q(ただし、abcde)。入力の2行目は、現在のコイン数です。

どうやって?

-F     # CLI option splits the input into individual characters in @F
map
   $q+=   # $q holds the result of the calculation here
          # possible values are 0,1,2,3,6
   $$_    # This interprets $_ as a variable reference, thus if $_ is 'a', this variable is $a
   ++     # increment after adding it to $q
,@F;      # iterate over the elements of @F
$_=0|     # force the result to be an integer
   <>/100 # divide the current coin count by 100
   +($q>5?7.77  # if $q is over 5, then there must have been 4 of a kind
   :$q||.1)     # otherwise, use $q, unless it is 0, then use .1
-p        # CLI option implicitly outputs $_

関係するすべての数は100で除算されるため、プログラムは現在獲得しているライフ(部分的なライフを含む)の数をカウントしています。このソリューションの秘trickはにありmapます。可能なエントリがある場合はabcde、各の$a$b$c$d、および$eこの文字が以前に見られた回数のカウントを保持します。これは$q、キャラクターが見られるたびに、ランニング合計()に追加されます。種類が4つある場合(実際には177のコインボーナス)、現在の合計は増加します。


1
これがどのように機能するかの説明を含めてください。
msh210

@ msh210できる限り追加しようとしました。それについて質問してください。
Xcali

2

JavaScript(Node.js)、64バイト

c=>a=>[,7.77,a.sort()[1]-a[2]?2:3,1,.1][new Set(a).size]+c*.01|0

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

Arnauldチャレンジに対して少なくとも1つのJavaScriptの回答が必要だと思いました!

ここでの概念は、主にルックアップキーとして個別の要素の数を使用することです。

  • 1ユニーク=>種類の4
  • 2ユニーク=> 2ペアまたは3種類
  • 3ユニーク=> 1ペア
  • 4ユニーク=>一致なし

2ペアと3種類を区別するために、入力配列がソートされ、中央の2つの要素が比較されます。


2

PHP89 84バイト

foreach(count_chars($argv[2])as$a)$b+=[2=>1,3,7.77][$a];echo$argv[1]/100+($b?:.1)|0;

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

コマンドラインからの入力、次への出力STDOUT

$ php lucky.php 99 3333
8

$ php lucky.php 0 2522
3

$ php lucky.php 0 abaa
3

1

スタックス、23 バイト

¿^∩û:¶á☺ⁿ£z⌐└≤♂EM¥t(,5╓

実行してデバッグする

このプログラムは、アイコンに5つの整数の任意のセットを使用します。

手順:

  1. 各要素の出現回数を合計します。
  2. 2で割り、次にmod 7で割ります。
  3. 結果は、1..5の数値です。これを使用して、固定配列でコイン賞品を検索します。
  4. 最初のコイン数に追加します。
  5. 100で割ります。

スタックスの次のリリースのために取り組んでいる実験的なスタック状態の視覚化ツールからの出力は次のとおりです。これは、コメントにスタック状態が追加された同じコードのアンパックバージョンです。

c               input:[2, 3, 4, 3] 25 main:[2, 3, 4, 3] 
{[#m            input:[2, 3, 4, 3] 25 main:[1, 2, 1, 2] 
|+              input:[2, 3, 4, 3] 25 main:6 
h7%             input:[2, 3, 4, 3] 25 main:3 
":QctI*12A"!    input:[2, 3, 4, 3] 25 main:[300, 777, 10, 100, 200] 3 
@               input:[2, 3, 4, 3] 25 main:100 
a+              main:125 [2, 3, 4, 3] 
AJ/             main:1 [2, 3, 4, 3] 

これを実行する


1

Retina 0.8.2、72バイト

O`\D
(\D)\1{3}
777¶
(\D)\1\1
300¶
(\D)\1
100¶
\D{4}
10¶
\d+\D*
$*
1{100}

オンラインでお試しください!リンクにはテストケースが含まれます。4つの印刷可能なASCII非数字とそれに続く数字の初期コイン数として入力を受け取ります。説明:

O`\D

同一の記号がグループ化されるように、非数字を並べ替えます。

(\D)\1{3}
777¶

4種類のスコア777。

(\D)\1\1
300¶

スリーカードは300です。

(\D)\1
100¶

各ペアのスコアは100なので、2つのペアのスコアは200です。

\D{4}
10¶

マッチがなかった場合、あなたはまだ勝ちます!

\d+\D*
$*

値を単項に変換し、合計を取ります。

1{100}

整数を合計を100で除算し、10進数に戻します。


1

網膜、56バイト

(\D)\1{3}
777¶
w`(\D).*\1
100¶
\D{4}
10¶
\d+\D*
*
_{100}

オンラインでお試しください!リンクにはテストケースが含まれます。4つの印刷可能なASCII非数字とそれに続く数字の初期コイン数として入力を受け取ります。説明:

(\D)\1{3}
777¶

4種類のスコア777。

w`(\D).*\1
100¶

各ペアは100を獲得します。これらwはすべてのペアを考慮に入れるので、それらをインターリーブでき、さらに3種類を3ペアに分解できるため、自動的に300がスコアリングされます。

\D{4}
10¶

マッチがなかった場合、あなたはまだ勝ちます!

\d+\D*
*

値を単項に変換し、合計を取ります。

_{100}

整数を合計を100で除算し、10進数に戻します。



1

Bash76 75 71 70バイト

-4 @JonathanAllanに感謝、-1に3進法を再配置。

read c
for i;{ for j;{ ((a+=i<j));};}
echo $[!a?7+(c>22):a-6?6-a:c>89]

Zshの回答のBashポート。 オンラインでお試しください! オンラインでお試しください! オンラインでお試しください! オンラインでお試しください!


1
ここでも不等式の代わりに小なりを使用して4を保存します。
ジョナサンアラン

1
@JonathanAllanこれは、私のZshの回答で4さえも節約します、ありがとう。
GammaFunction

1

C(gcc) 92 84 82 81 79 78バイト

-1からx+=(..!=..) -5割り当てを介し戻ること-4をJonathan Allanに置き換えること!=により<、他の場所にバイトを保存します。 -1三元を再配置することによって。

@ceilingcatから:-2は関数の宣言ix外部で、-1、設定x=ix代わりにとデクリメント。

i,x;f(c,a)int*a;{for(i=x=16;i--;)x-=a[i/4]>=a[i%4];c=x?x-6?6-x:c>89:7+(c>22);}

私のZsh回答の別の移植版。私はCゴルフに不慣れです。おそらくここでさらに減らすための別のトリックがあります。 92 84 82 81 79 オンラインでお試しください!


1
以下同じではないの代わりに、より使用して保存4:x+=a[i/4]<a[i%4];c=x?(x-6?6-x:c>89):7+(c>22);
ジョナサン・アラン

1

05AB1E20 19 18 バイト

D¢<OR;т*777T)Åm+т÷

@JonathanAllanのJelly回答のポートですので、必ず彼に投票してください!!
-2バイトのおかげで@Grimyの

アイコンのリストを最初の入力として受け取ります( [1,2,3,4,5])として受け取り、コインの量を2番目の入力として受け取ります。

オンラインそれを試してみたり、すべてのテストケースを確認してください。(テストスイートはT‚à+TMI+ます。これは、等しいバイトの代替です。)

説明:

D                   # Duplicate the first (implicit) input-list
 ¢                  # Count the amount of occurrences in itself
  <                 # Decrease each count by 1
   O                # Sum these
    R               # Reverse it
     ;              # Halve it
      т*            # Multiply by 100
        777         # Push 777
           T        # Push 10
            )       # Wrap all three values into a list
             Åm     # Get the median of these three values
               +    # Add the second (implicit) input to it
                т÷  # And integer-divide it by 100
                    # (after which the result is output implicitly)

@Grimy Ah、もちろん。ありがとう!私はゼリーの答えで同じゴルフを提案しました(もちろんあなたにクレジットします)。:)
ケビン・クルーッセン

1
また、777‚ßTMIすることができます777T)Åm
グリムミー

Cheaty 17(コインカウントをフロートと見なします。これは許可されていません)
Grimmy

@Grimyそれでは0.9090コインはその場合ですか?コインの入力は範囲内[0,99]にあることが保証されているため、OPに許可するかどうかを尋ねることができます。
ケビンクルーッセン

うん、0.90は90コインを意味します。私はそれについてOPに尋ねました。いずれにせよ、ここに別の非チート18があります。
Grimmy


1

、30バイト

≔⊘ΣEη№ηιηI⌊⁺∕θ¹⁰⁰∨⁻η∕²∨›⁸η⁹∕¹χ

オンラインでお試しください!リンクは、コードの詳細バージョンです。入力をコインの数として、またPythonに匹敵する値の配列をアイコンとして受け取ります。説明:

≔⊘ΣEη№ηιη

数の合計の半分を計算する@GammaFunctionのトリックを恥知らずに盗みます。

⁻η∕²∨›⁸η⁹

減算2このような値が得られ、合計から0, 1, 2, 3適宜、しかし4のユニークなため、分割2することによって9、その結果、第一7.777...

∨...∕¹χ

ただし、結果が0の場合、一致するものはなかったため、0.1代わりに置き換えます。(リテラルを使用しても、セパレーターが必要になるため、ここでは役に立ちません。)

I⌊⁺∕θ¹⁰⁰...

最初のコインを100で割り、賞金を加算し、結果をフロア化し、暗黙の出力のために文字列にキャストします。


1

Pyth、32バイト

AQ-@[+K2/G90J/sm/HdH2+9>G22)/J3K

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

GammaFunctionのソリューションに触発されました。入力をとして受け取ります[coins, [icons]]

AQ                               # Q is the input. Set G := Q[0], H := Q[1]
    [                      )     # Construct a list from the following entries:
     +K2/G90                     # [0] (K:=2) + G/90 (/ is integer division)
            J                    # [1] J:=
              s                  #        reduce on + (
               m   H             #          map entries of H as d on (
                /Hd              #            number of occurences of d in H ) )
             /      2            #                                               / 2
                     +9>G22      # [2] 9 + (G > 22)
   @                        /J3  # Take element at position J/3
  -                            K # Subtract K (=2)

1

PowerShell、94バイト

param($n,$l)$r=@{2=100;3=300;4=777}[($l|group|% c*t)]|?{$_;$n+=$_}
+(($n+10*!$r)-replace'..$')

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

展開:

param($nowCoins,$values)
$groupCounts=$values|group|% count
$rewardedCoins=@{2=100;3=300;4=777}[$groupCounts]|?{
    $_                          # output matched only
    $nowCoins+=$_               # and accumulate
}
$nowCoins+=10*!$rewardedCoins   # add 10 coins if no rewarded conis
+($nowCoins-replace'..$')       # truncate last two digits

1

PowerShell114107バイト

mazzyのおかげで-7バイト

param($n,$l)((((0,.1,1)[+($x=($l|group|% c*t|sort))[2]],2,3)[$x[1]-1],7.77)[$x[0]-eq4]+".$n")-replace'\..*'

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

入力リストのカウントをグループ化およびソートすることで構築された、大昔のPowerShell風味の三項演算。グループ化されたリストが繰り返されるほど短くなるという事実を活用するため、ソートが必要です。実際、可能な値はすべて次のとおりです。

(1,1,1,1)
(1,1,2)
(2,2)
(1,3)
(4)

intに切り捨てることは、依然として高価です。

展開:

param($n,$l)
$x=$l|group|% c*t|sort
(((                      #Start building a list...
   (0,.1,1)[+$x[2]],     #where spot 0 holds dummy data or handles no match and 1 pair
    2,3)[$x[1]-1],       #Overwrite the dummy data with 2-pair or 3-o-k
   7.77)[$x[0]-eq4]      #OR ignore all that and use spot 1 because it's a 4-o-k
   +".$n"                #Use that value and add CoinCnt via int-to-string-to-decimal
)-replace'\..*'          #Snip off the decimal part

1
代わりに空の文字列を使用できます0か?オンラインでお試しください!
mazzy



1

R、10291、81のバイト

f=function(b,v,s=table(v))(477*any(s>3)+b+10*all(s<2))%/%100+sum(s==2)+3*any(s>2)

@Giuseppeのおかげで、11バイトをドロップできました(そしてバグを修正しました)。@Giuseppeの/ 10アイデアに触発されたさらに10を管理しました。

非ゴルフ

f=function(b,v){
  s = table(v)          #included in fn inputs
  a = b+10*all(s<2)     #covers all different case
  a = a+477*any(s>3)    #Covers 4 of a kind
  d = sum(s==2)+3*any(s>2) #covers 1 and 2 pair, 3 of a kind.
  a%/%100+d         #sum appropriate values
}

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



1
つまり、なぜあなたが把握することができます場合は、あなたが削除することができますas.factor()し、f=88バイトにそれを得るために。
ジュゼッペ

ああ-良いキャッチ、私は数学を間違えたようです。そして、一番のヒントtable-私はそうあるべきではないので、私はそれから始めましたsummary(as.factor(v))。私はそのままにしておきますf=。私はコードがそれなしで完全であるとは感じませんが、スタイルの選択であることを理解しています。
user5957401

あなたがそう言うなら。これは87バイトです含め、f=。TIOリンクを自由に入力してください:-)
ジュゼッペ

私は分割が好きです。私はそれをいじっていたので、それがsum(s==2)大いに役立つことを理解しました。しかし、それは他のすべてを
書き直す

0

8051アセンブリ(158バイトにコンパイル)

これはVEEEEEEEEEERRYの素朴なアプローチです。これはまだテストされておらず、未検証ですが、動作することはかなり自信があります。考慮すべき事項は次のとおりです。

1)8051はアキュムレータマシンです。他のアーキテクチャではまったく必要ないかもしれないmov命令が必要です。

2)8051は8ビットマシンであるため、255を超える数についてはいくつかのトリックを行う必要があります。これによりコードが増え、プラットフォームが他のプラットフォームよりも不利になります。

CSEG AT 0000H

coinStackOnes equ 0xf3
coinStackTens equ 0xf4
coinStackHundreds equ 0xf5 ; leave one byte as guard so that if that gets corrupted it doesnt really matter

values1 equ 0xf7
values2 equ 0xf8
values3 equ 0xf9
values4 equ 0xfa

numOfFlowers equ 0xfb
numOfLeaf equ 0xfc
numOfBell equ 0xfd
numOfCherry equ 0xfe
numOfBoomerang equ 0xff

flower equ 1
leaf equ 2 
bell equ 3
cherry equ 4
boomerang equ 5

numOfHeartsReceived equ 0xf1

mov r1, #4
mov r0, numOfFlowers
clearNumOfRegs: mov @r0, #0d
        inc r0
        djnz r1, clearNumOfRegs
;if you reach this all numOfXXXX registers are zeroed

mov r0, #values1 
mov r1, #flower

mov a, #6 ; innercounter
mov b, #5 ; outercounter
checkfornextpossibleitem:   mov r2, a; backup countervar
                mov a, @r0 ; store given value in a
                xrl a, @r1 ; xor a with item
                jnz nextItem ; if value!=item -> nextitem
                mov a, #numOfFlowers ;if you end up here a=0 (ie value == item) --> generate addr for numOfReg <-- load a with addr for numOfFlowers
                add a, r1 ; since items are only numbers you can add the item to get the addr for numOfReg a=addr(numOfReg)
                xch a, r1 ; change the item with the addr as r1 is indirect register
                inc @r1 ; increment numOfRegister
                xch a, r1; r1 = item
                ;next item              
                nextItem:   inc r1 ; increment item
                        mov a, r2 ; restore counter
                        dec a; decrement counter
                        cjne a, #0, checkfornextpossibleitem 
                        ;if you reach this you have successfully tested one value against all items and therefor the next value must be tested
                        mov a, #6; reset the innercounter
                        dec b; decrement the outercounter
                        inc r0; increment the register that points to the value-under-test
                        xch a,b; cjne works with a but not with b therefor exchange them
                        cjne a, #0, here ; do the comparison; if you dont jump here you have tested all values 
                        jmp howManyPairsDoIHave; if you didnt jump above you have the now the number of flowers and so on
                        here:   xch a,b ; and change back
                            jmp checkfornextpossibleitem ; check the next value
howManyPairsDoIHave:    mov r0,#0; store numOfPairsHere initialize with zeros
            mov r1, numOfFlowers; 
            mov b, #6; use as counter to know when you went through all numOfRegisters
analyseNumOfRegister:   mov a, @r1 ; load the numOfregister for some math
            xrl a, #2; a will contain zero if numOfXXX = 2
            jnz numOfXXXWasNot2; if you do not jump here you have 2 XXX therefor 
            inc r0; increment the number of pairs
            jmp nextNumOfRegister; continiue with the next one
            numOfXXXWasNot2:    mov a, @r1; restore the number of XXX and try the next magic value
                        xrl a, #3; will contain zero if you have a three of a kind                      
                        jnz no3XXX; if you dont jump here however you have a three of a kind
                        jz add300Coins
                        no3XXX:     mov a, @r1; restore number of XXX
                                xrl a, #4; a will contain zero if 4 of a kind
                                jnz nextNumOfRegister; if you numOfXXX!=4 you can only continiue trying to find something in the next numof register
                                jz add777Coins; if you didnt jump above how ever you will have to add the 777 coins as you detected a 4 of a kind
nextNumOfRegister:  inc r0; move pointer to the next numofregister
            djnz b, analyseNumOfRegister; if you havent already analysed all numofregisters then continue
            ; if you have however you end up here so you will have to take a look at the numOfPairs
            cjne r0, #1, tryIf2Pairs; test if you have 1 pair if not try if you have 2
            jmp add100Coins; if you have 1 pair however add the 100 coins
            tryIf2Pairs:    cjne r0, #2, youMustHave0Pairs; test if you have 2 pairs if not you can be sure to have 0 of them
                    jmp add200Coins; if you have 2 pairs however add them
youMustHave0Pairs:  ; add 10 coins
            inc coinStackTens
            mov a, coinStackTens
            cjne a, #10d, howManyHearts ; if your tens digit isnt outta range continue with the calculation of the number of hearts
            inc coinStackHundreds; if it is outta range do correct that
            mov coinStackTens, #0
            jmp howManyHearts;
add100Coins:    inc coinStackHundreds; here the digit can not possibly have an invalid value...
        jmp howManyHearts
add200Coins:    mov a, coinStackHundreds
        add a, #2
        mov coinStackHundreds, a
        jmp howManyHearts ; also here no invalid values possible
add300Coins:    mov a, coinStackHundreds
        add a, #3
        mov coinStackHundreds, a
        jmp howManyHearts ; same again
add777Coins:    mov r0, #coinStackOnes
        mov r2, #3
add7:       mov a, r0
        mov r1, a
        mov a, @r0
        add a, #7
        mov b, a; b contains the possibly invalid version of the ones digit     
        da a; if you have an invalid value its lower nibble gets corrected this way
        anl a, 0x0f; and the higher one gets corrected this way
        xch a,b; a and b must be swapped in order to make subb work ie b contains now the corrected value and a has the maybe faulty value
        subb a,b; returns zero if all the corrections had no effect therefor the next digit can be increased by 7
        jz nextDigit
        inc r1
        inc @r1
        nextDigit:  inc r0
                djnz r2, add7;

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