バイナリナンバーマジックトリック


28

課題は単純です。次の6つの2D整数配列を出力します。

[[ 1, 11, 21, 31, 41, 51],
 [ 3, 13, 23, 33, 43, 53],
 [ 5, 15, 25, 35, 45, 55],
 [ 7, 17, 27, 37, 47, 57],
 [ 9, 19, 29, 39, 49, 59]]

[[ 2, 11, 22, 31, 42, 51],
 [ 3, 14, 23, 34, 43, 54],
 [ 6, 15, 26, 35, 46, 55],
 [ 7, 18, 27, 38, 47, 58],
 [10, 19, 30, 39, 50, 59]]

[[ 4, 13, 22, 31, 44, 53],
 [ 5, 14, 23, 36, 45, 54],
 [ 6, 15, 28, 37, 46, 55],
 [ 7, 20, 29, 38, 47, 60],
 [12, 21, 30, 39, 52]]

[[ 8, 13, 26, 31, 44, 57],
 [ 9, 14, 27, 40, 45, 58],
 [10, 15, 28, 41, 46, 59],
 [11, 24, 29, 42, 47, 60],
 [12, 25, 30, 43, 56]]

[[16, 21, 26, 31, 52, 57],
 [17, 22, 27, 48, 53, 58],
 [18, 23, 28, 49, 54, 59],
 [19, 24, 29, 50, 55, 60],
 [20, 25, 30, 51, 56]]

[[32, 37, 42, 47, 52, 57],
 [33, 38, 43, 48, 53, 58],
 [34, 39, 44, 49, 54, 59],
 [35, 40, 45, 50, 55, 60],
 [36, 41, 46, 51, 56]]

これらの2D整数配列とは何ですか?これらは、これらの番号を含むカードでのマジックトリックで使用される番号です。

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

マジックトリックは、誰かに[1、60]の範囲の数字を考え、この数字を含むすべてのカードをマジックトリックを実行する人に与えるように依頼します。マジックトリックを実行する人は、与えられたカードの左上の数字(すべて2のべき乗)を合計して、その人が考えていた数字を得ることができます。これがなぜ機能するかについての追加の説明は、ここにあります。

チャレンジルール:

  • 6つの2D整数配列を適切な形式で出力できます。区切り文字付きで印刷できます。6つの2D整数配列を含む3D整数配列にすることができます。行の文字列リストにすることができます。等
  • あなたは範囲内の負の値で、最後の4枚のカードの右下の位置を埋めるために許可されている[-60, -1]か、文字'*'配列の整数2Dを作ってそれを除外するのではなく、長方形の行列が(いや、あなたがそれらを埋めるために許可されていない0か、非-の代わりにnull/のような整数。undefinedただし*、スターは実際のカードでも使用されます。
  • マトリックス内の数字の順序は必須です。それは物理的なマジックのトリックのために重要ではありませんが、私は主として、この挑戦を見 - 1、したがって制限オーダー。
    出力リスト内のマトリックス自体の順序は、左上のカードからどのマトリックスが明らかであるため、任意の順序にすることができます。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーター、戻り値型、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテスト(TIOなど)へのリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

関連。(同じように、それは同じ魔法のトリックを指しますが、私が思うこの挑戦のためにインスピレーションを得るのは本当に有用ではありません。その挑戦は数字nk'thカードに現れるかどうか真実/偽の値を出力することを求めます;私の挑戦はKCチャレンジで6つのマトリックスを出力します。)
Kevin Cruijssen

1
@DigitalTrauma Hm、これは本当に重複しているかどうかはわかりません、なぜならあなたの挑戦はascii-art(そのようにタグ付けされていませんが、そうです)である一方、これはあなたがより寛大な形式で配列を出力することを可能にします(本質的に同一の4つの方法だけではありません)。ただし、ハンマーを持っているため、再開することはできません。
アウトゴルファーのエリック

@EriktheOutgolfer Woops ..ハンマーも持っているのを忘れた>。>時々、ハンマーを閉じたり開いたりするのはかなり面倒です。既に2票ありました。しかし、誰かが再びそれを閉じたいなら、私は気にしません。それらは実際に非常に似ていますが、彼の挑戦は[ascii-art]、厳密な(MD5)出力ルールでの挑戦であり、私のものは非常に柔軟です(そして行/列が交換され、範囲が[1,60]代わりになり[1,63]ます;かなり小さな違いですが、それでも)。
ケビンクルーイッセン

「これは私の貴重な挑戦です!」という態度でVTROを試みなかったようです。少なくとも...:P
エリック・ザ・アウトゴルファー

1
私もハンマーを忘れました。私はまだこれがdupに投票するのに十分近いと思いますが、コミュニティが再開されればコミュニティの知恵に任せます。
デジタル外傷

回答:


6

MATL12 11バイト

マスター自身のおかげで-1バイト:)

60:B"@fQ6eq

説明:

60:           % create a vector [1,2,3,...,60]
   B          % convert to binary matrix (each row corresponds to one number)
    "         % loop over the columns and execute following commands:
     @f       % "find" all the nonzero entries and list their indices
       Q      % increment everything
        6e    % reshape and pad with a zero at the end
          q   % decrement (reverts the increment and makes a -1 out of the zero
              % close loop (]) implicitly
              % display the entries implicitly

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



7

Python 2、76バイト

r=range;print[[[i for i in r(61)if i&2**k][j::5]for j in r(5)]for k in r(6)]

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

ここでの方法は、すべての可能な数字のリストを作成し、r(61)それからカードの数字のリストまでそれを削ることi&2**kです。

次に、リストスライスを使用して、その1Dの番号リストを正しい6x5カードサイズに再配置します[card nums][j::5]for j in r(5)

次に、このジェネレーターを6枚のカードに対して繰り返しますfor k in r(6)


76バイト未満のソリューションは見つかりませんでしたが、76バイトのソリューションが2つあります。

r=range;print[[[i for i in r(61)if i&1<<k][j::5]for j in r(5)]for k in r(6)]

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

この次はジョナサン・アランに触発されました。

k=32
while k:print[[i for i in range(61)if i&k][j::5]for j in range(5)];k/=2

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

コメントは大歓迎です。


6

、26バイト

E⁶E⁵⪫E⁶§⁺§⪪Φ⁶¹&πX²ι⁵ν⟦*⟧λ 

オンラインでお試しください!リンクは、コードの詳細バージョンです。エントリを直接計算してみました*が、右下で調整する前にこれはすでに27バイトでした。スペースで区切られた各行と、カード間の空白行を出力します。説明:

E⁶                          Loop over 6 cards
  E⁵                        Loop over 5 rows
     E⁶                     Loop over 6 columns
           Φ⁶¹              Filter over 0..60 where
               π            Current value
              &             Bitwise And
                 ²          Literal 2
                X           Raised to power
                  ι         Card index
          ⪪        ⁵        Split into groups of 5
         §          ν       Indexed by column
        ⁺                   Concatenated with
                      *     Literal string `*`
                     ⟦ ⟧    Wrapped in an array
       §                λ   Indexed by row
    ⪫                       Joined with spaces
                            Implicitly print

*実際のカードの星を見てから、楽しみのためにこのルールを追加しました。それを使用する言語があるかどうか疑問に思っていましたが、少なくとも1つが使用されているのを見てうれしいです。:) いい答えだ!
ケビンクルーッセン

1
@KevinCruijssenチャコールには転置演算子がありません。また、最もゴルファーの転置には既知のサイズの長方形の配列が必要です。そのため、サイズを構成するために何かを追加する必要*があります。
ニール

これは26バイトだとは思わない...
Tvde1

@ Tvde1チャコールは、このサイトの多くのエソランと同様に、カスタムコードページを使用します。そのページの文字のコストは1バイトですが、他の文字のコストは最大4バイトです。
ニール

6

05AB1E、16バイト

60L2вíƶ0ζε0K5ô®ζ

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

説明

60L                 # push [1 ... 60]
   2в               # convert each to a list of binary digits
     í              # reverse each
      ƶ             # multiply each by its 1-based index
       0ζ           # transpose with 0 as filler
         ε          # apply to each list
          0K        # remove zeroes
            5ô      # split into groups of 5
              ®ζ    # zip using -1 as filler

05AB1E、17バイト

6F60ÝNoôāÈϘ5ô®ζ,

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

説明

6F                  # for N in [0 ... 5] do
  60Ý               # push [0 ... 60]
     Noô            # split into groups of 2^N numbers
        āÈÏ         # keep every other group
           ˜        # flatten
            5ô      # split into groups of 5
              ®ζ    # transpose with -1 as filler
                ,   # print

5

、13バイト

ṠMöTC5Wnünḣ60

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

説明

          ḣ60  Range [1..60]
        ü      Uniquify using equality predicate
         n     bitwise AND: [1,2,4,8,16,32]
 M             For each number x in this list,
Ṡ     W        take the indices of elements of [1..60]
       n       that have nonzero bitwise AND with x,
    C5         cut that list into chunks of length 5
  öT           and transpose it.


5

Japt、14バイト

6Æ60õ f&2pX)ó5

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

6Æ              Create a range from 0 to 5 (inclusive) and map each X into
  60õ             Elements in the range [1..60]
      f             Where
       &2pX)          The number bitwise AND with X is not 0
  ó5              Split into 5 arrays, where each array contains every 5th element

-Q flag is just for formatting purposes

4

JavaScript(ES6)、 90  88バイト

_=>[1,2,4,8,16,32].map(n=>(g=i=>i<60?g(++i,i&n?m[y%5]=[...m[y++%5]||[],i]:0):m)(y=m=[]))

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

コメント済み

_ =>                        // anonymous function taking no argument
  [1, 2, 4, 8, 16, 32]      // list of powers of 2, from 2**0 to 2**5
  .map(n =>                 // for each entry n in this list:
    ( g = i =>              //   g = recursive function taking a counter i
      i < 60 ?              //     if i is less than 60:
        g(                  //       recursive call:
          ++i,              //         increment i
          i & n ?           //         if a bitwise AND between i and n is non-zero:
            m[y % 5] =      //           update m[y % 5]:
            [ ...m[y++ % 5] //             prepend all previous values; increment y
              || [],        //             or prepend nothing if it was undefined so far
              i             //             append i
            ]               //           end of update
          :                 //         else:
            0               //           do nothing
        )                   //       end of recursive call
      :                     //     else:
        m                   //       return m[]
    )(y = m = [])           //   initial call to g with i = y = m = []
                            //   (i and y being coerced to 0)
  )                         // end of map()


4

C(gcc)、95バイト

i,j,k;f(int o[][5][6]){for(i=6;i;)for(o[--i][4][5]=j=k=-1;j<60;)++j&1<<i?o[i][++k%5][k/5]=j:0;}

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

oの3D int配列として行列を返します。

最後の4つの行列の最後の値は-1です。

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

Arnauldのおかげで7 8バイト節約されました。


を変更o[i][4][5]=-1;for(j=k=0;for(o[i][4][5]=-1,j=k=0;てブラケットを削除できるようにすると、2バイト節約できます。素敵な答えは、私から+1。
ケビンクルーイッセン


(。。すでに正しい寸法に割り当てられ渡し3Dアレイが許可されている場合、私は確信して100%ではないが、私は、通常のCのゴルファーはそれについてより深い洞察を提供してもらおうということに注意してください)
アルノー

@Arnauld私はそれについて考えていましたが、それに反対しました。
Matej Mulej

アウト残して、より良い#include、それはそれなしで動作することを示すために
ASCIIのみ

3

CJam(18バイト)

6{61{2A#&},5/zp}fA

オンラインデモ。これは、標準出力に出力する完全なプログラムです。

解剖

6{             }fA    # for A = 0 to 5
  61{2A#&},           #   filter [0,61) by whether bit 2^A is set
           5/z        #   break into chunks of 5 and transpose to get 5 lists
              p       #   print

3

ゼリー、13 バイト

60&ƇⱮs€5LÐṂZ€

(6)整数のリストのリストを生成するniladicリンク。(*フィラーなしまたはネガティブフィラーのデフォルトオプションを使用して出力します)

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

どうやって?

60

60[1,60]5

60&ƇⱮs€5LÐṂZ€ - Link: no arguments
60            - set the left argument to 60
    Ɱ         - map across ([1..60]) with:  (i.e. [f(60,x) for x in [1..60]])
   Ƈ          -   filter keep if:  (N.B. 0 is falsey, while non-zeros are truthy)
  &           -     bitwise AND
      €       - for each:
     s 5      -   split into chunks of five
         ÐṂ   - keep those with minimal:
        L     -   length
           Z€ - transpose each

「5に分割したときに長さで最小」トリックを実現せずに15の多く:

5Ż2*Ɱ60&ƇⱮs€5Z€
6µ’2*60&Ƈ)s€5Z€
60&ƇⱮ`LÞḣ6s€5Z€

...そして、より短いものを見つけようとしている間に、私はまったくトリックを必要とせずに別の13を得ました:

60B€Uz0Ts5ZƊ€

3

Wolfram言語(Mathematica)、88バイト

Transpose@Partition[#~Append~-1,5]&/@Last@Reap[Sow[,NumberExpand[,2]]~Do~{,60},Except@0]

TIOリンクを追加する自由を取りました(@ J42161217の回答に基づく)。私から+1。
ケビンクルーッセン


@ Mr.Xcoderありがとう。私はこの使用していた~もう一つの場所でトリックをして変数を置き換えるkことでNull。申し訳ありませんが、tioリンクを追加する時間はありません。
ブルーノルフロック

2

Wolfram言語(Mathematica)、99バイト

Transpose@Partition[#~FromDigits~2&/@Last@GatherBy[{0,1}~Tuples~6,#[[-k]]&],5]~Table~{k,6}/. 61->-1

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


いくつかの文字を保存するTranspose@にはTranspose[...]、次のようにします。パーティション化する前に30エントリにパディングします。の使用Table[...,{k,6}]を避ける必要がありk=#ます。
ブルーノルフロック

@Bruno Le Flochテーブルは1バイト節約できます。transpose @を試しましたか?注意深く見ればうまくいかないからです。私はafkですが、後でゴルフします
J42161217

申し訳ありませんが、中にTranspose@移動した後に動作します。別のコメントは、質問がプレースホルダーを考慮していないようだということです。バイトを失うことなく置き換えることができます。PadRightPartition""-1
ブルーノルフロック


2

R、73バイト

`!`=as.raw;lapply(0:5,function(i)matrix(c((a=1:60)[(!a&!2^i)>0],-1),5,6))

Rはデフォルトで列ごとにマトリックスを埋めるため、順序の要件を満たしているかどうかは完全にはわかりません。したがって、カードに物理的に表示される順序は、Rでマトリックスが割り当てられる方法と同じです。

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


出力は良好です。そして、Rが他のほとんどすべての言語のように列の前の行ではなく、行の前の列でマトリックスを埋める場合、それはこのチャレンジに使用するのに良いプログラミング言語であることを意味します。:)
ケビン・クルーッセン

2

T-SQL、(1,168 1,139バイト)

できると知りたかっただけです。

最適化されたバージョン

 WITH g AS(SELECT 1 AS n UNION ALL SELECT n+1 FROM g WHERE n+1<61),B as(SELECT cast(cast(n&32 as bit)as CHAR(1))+cast(cast(n&16 as bit)as CHAR(1))+cast(cast(n&8 as bit)as CHAR(1))+cast(cast(n&4 as bit)as CHAR(1))+cast(cast(n&2 as bit)as CHAR(1))+cast(cast(n&1 as bit)as CHAR(1))as b FROM g),P as(SELECT * from (values(1), (2), (4), (8), (16), (32)) as Q(p)),S as(select distinct p,p+(substring(b,6,1)*1)*(case when p=1 then 0 else 1 end)+(substring(b,5,1)*2)*(case when p=2 then 0 else 1 end)+(substring(b,4,1)*4)*(case when p=4 then 0 else 1 end)+(substring(b,3,1)*8)*(case when p=8 then 0 else 1 end)+(substring(b,2,1)*16)*(case when p=16 then 0 else 1 end)+(substring(b,1,1)*32)*(case when p=32 then 0 else 1 end)as e from P cross apply B),D as(select * from S where e>=p and e<61),R as(select p,(row_number()over(partition by p order by cast(e as int)))%5 as r,e from D),H as(select k.p,'['+stuff((select','+cast(l.e as varchar)from R l where l.p=k.p and l.r=k.r for xml path('')),1,1,'')+']'as s from R k group by k.p,k.r)select stuff((select','+cast(x.s as varchar)from H x where x.p=z.p for xml path('')),1,1,'')from H z group by z.p

オンラインデモ

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

詳細バージョン-SQLコメントとしてメモ付き

WITH gen -- numbers 1 to 60
AS (
    SELECT 1 AS num
    UNION ALL
    SELECT num+1 FROM gen WHERE num+1<=60
),
BINARIES -- string representations of binaries 000001 through 111111
as (
SELECT 
    +cast( cast(num & 32 as bit) as CHAR(1))
    +cast( cast(num & 16 as bit)  as CHAR(1))
    +cast( cast(num & 8 as bit)  as CHAR(1))
    +cast( cast(num & 4 as bit)  as CHAR(1))
    +cast( cast(num & 2 as bit)   as CHAR(1))
    +cast(cast(num & 1 as bit)  as CHAR(1)) as binry FROM gen
),
POWERS -- first 6 powers of 2
as (
SELECT * from (values(1), (2), (4), (8), (16), (32)) as Q(powr)
),
SETELEMENTS -- cross apply the six powers of 2 against the binaries
-- returns 2 cols. col 1 = the power of 2 in question.
-- col 2 is calculated as that power of 2 plus the sum of each power of 2 other than the current row's power value, 
-- but only where a given power of 2 is switched "on" in the binary string, 
-- ie. where the first digit in the string represents 32, the second represents 16 and so on. 
-- That is, if the binary is 100100 then the number will be 
-- the sum of (32 x 1) + (16 x 0) + (8 x 0) + (4 x 1) + (2 x 0) + (1 x 0) 
-- but if the current row's power is 32 or 4, then just that number (32 or 4) is excluded from the sum.
-- rows are distinct.
as (
select distinct powr,
powr+
 (substring(binry,6,1) * 1) * (case when powr = 1 then 0 else 1 end)
 +(substring(binry,5,1) * 2) * (case when powr = 2 then 0 else 1 end)
 +(substring(binry,4,1) * 4) * (case when powr = 4 then 0 else 1 end)
 +(substring(binry,3,1) * 8) * (case when powr = 8 then 0 else 1 end)
 +(substring(binry,2,1) * 16) * (case when powr = 16 then 0 else 1 end)
 +(substring(binry,1,1) * 32) * (case when powr = 32 then 0 else 1 end) as elt
from POWERS cross apply BINARIES
),
DISTINCTELEMENTS -- purge calculated numbers smaller than the power of 2 or greater than 60
as (
select * from SETELEMENTS where elt >= powr and elt < 61
)--,
,
ROWNUMBERED -- for each power, number the rows repeatedly from 0 through 5, then back to 0 through 5 again, etc
as (
select powr, (row_number() over (partition by powr order by cast(elt as int)))%5 as r, elt  from DISTINCTELEMENTS
),
GROUPEDSETS -- for each row number, within each power, aggregate the numbers as a comma-delimited list and wrap in square brackets - the inner arrays
as (
select r1.powr, '['+stuff((select ',' + cast(r2.elt as varchar) from ROWNUMBERED r2 where r2.powr = r1.powr and r2.r = r1.r for xml path('')),1,1,'')+']' as s
from ROWNUMBERED r1
group by r1.powr,r1.r
)
select -- now aggregate all the inner arrays per power
stuff((select ',' + cast(g2.s as varchar) from GROUPEDSETS g2 where g2.powr = g1.powr for xml path('')),1,1,'')
from GROUPEDSETS g1
group by g1.powr

出来上がり!

注1:一部のロジックは、角括弧とコンマのレンダリングに関連しています。

注2:SQLServerの新しいバージョンには、コンマ区切りリストを作成するためのよりコンパクトなアプローチがあります。(これはSQL Server 2016で作成されました。)

注3:特定のカードの配列はソートされていません(仕様ごとに問題ありません)。配列内の数値は正しくソートされます。この場合、質問の各「カード」は、結果の別の行に配列をレンダリングします。

ハードコード配列が短い?

はい。

バイトして。


ええ、結果をハードコードするだけで短くなりませんか?
ジョーキング

ハハ。楽しくも拡張性もない。
youcantryreachingme

私は完全に理解していません-あなたのソリューションは偶然にしか機能しないと言っているのですか、それとも仕様に従っていると確信しているのですか?
ジョナサンフレッチ

@JonathanFrech-言語に暗黙の条件があり、保証された順序になる可能性があるものの、数値の順序を明示的にコーディングしませんでした。正しい昇順でレンダリングします。それとは別に、投稿後、データの表示方法を誤解していたことに気付きました(カードごとに1セットではなく、カードごとにストライプ配列で)-その問題をまだ解決していない。そのため、結果は現在、6つの予想される各セット内で正しい数値を昇順でレンダリングします(リンクされたSQLフィドルを参照)。まだやるべきことは、セットをそれぞれ5つのサブセットに分割することです。
youcantryreachingme

努力に感謝しますが、解決策が正しくない場合は、修正するか、投稿を削除してください。一般に、無効な回答が残ることは許可しません。
ジョナサンフレッチ




1

MATLAB、155バイト

cellfun(@disp,cellfun(@(x)x-repmat(62,5,6).*(x>60),cellfun(@(x)reshape(find(x,30),[5 6]),mat2cell(dec2bin(1:62)-48,62,ones(1,6)),'Uniform',0),'Uniform',0))

これは複数行で短くなる可能性がありますが、1行のコードで実行したかったのです。


1
テストコードを使用してTIOリンクを追加し、出力を確認できますか?
ケビンクルーッセン

1

05AB1E、14バイト

žOε60LDNo&ĀÏ5ι

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


1
なぜžOただの代わりに6L?マップでそれらを使用していないことは知っていますが、なぜaeiouy6つの値を持つリストを作成するのに使用したのでしょうか。xDいい答え、ところで!
ケビンクルイッセン

1
@KevinCruijssenませんが、特定の理由は、私はちょうどそれがより笑えるだと思った6L、または9!
グリムミー

それは確かに私の目を引きました、それは確かです。;)
Kevin Cruijssen

@KevinCruijssen私だけ実現тœ₅œ₁œ、また仕事、それらはかなり(あまりにもクールされています
Grimmy

₆b同様に動作します;)
ケビン・クルーッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.