同じ桁の2倍ではなく、複数の基数


15

入力

正の整数の空でない配列。

仕事

各桁(ようにいずれかの2進数、8進数、10進数または16進数の各整数を変換0Fが)一度ほとんどで使用されています。

出力

パズルの解決に使用されたベースのリスト。

詳細な例

[16、17]の期待される出力は[8進数、10進数]です。

その理由は次のとおりです。

  • 両方に1が含まれているため、両方の数値に単純に10進数を使用することはできません。
  • 16は、このベース(10000)の表現に複数の0が含まれているため、バイナリに変換できません。
  • 17は、このベース(10001)の表現がいくつかの0といくつかの1を含むため、バイナリに変換することもできません。
  • 17は、この基数(11)の表現が2つの1で構成されているため、16進数に変換できません。
  • 残りのすべての可能性を考えてみましょう。

                   +---------+---------+--------+
                   | oct(16) | dec(16) | hex(16)|
                   | = 20    | = 16    | = 10   |
    +--------------+---------+---------+--------+
    | oct(17) = 21 | 20,21   | 16,21   | 10,21  |
    | dec(17) = 17 | 20,17   | 16,17   | 10,17  |
    +--------------+---------+---------+--------+
    

    唯一可能な解決策は、16を8進数(20)に変換し、17を10進数(17)に保つことです。このように、数字012及び7は、一度だけ使用されます。

明確化と規則

  • 入力は、独自のソリューションにつながることが保証されています。あなたのコードは、いくつかのソリューションを提供する配列をサポートするものではなく、まったくソリューションを提供するものではありません。
  • ["bin"、​​ "oct"、 "dec"、 "hex"]['b'、 'o'、 'd'、 'h']"BODHなど、任意の妥当な形式でベースを出力できます。[2,8,10,16][0,1,2,3]など。ただし、回答で明確に説明する必要があります。
  • 出力の基数の順序は、入力整数の順序と一致する必要があります。
  • それが役立つ場合は、入力が最低から最高、または最高から最低の順にソートされていると想定できます。
  • これはなので、バイト単位の最短回答が勝ちです!

テストケース

下記の変換結果を出力する必要はありません。それらは単なる情報です。

Input                                  | Output          | Conversion result
---------------------------------------+-----------------+------------------------
[ 119 ]                                | O               | 167
[ 170 ]                                | D               | 170
[ 64222 ]                              | H               | FADE
[ 16, 17 ]                             | O/D             | 20/17
[ 14, 64, 96 ]                         | H/H/D           | E/40/96
[ 34, 37, 94 ]                         | O/D/H           | 42/37/5E
[ 2, 68, 82 ]                          | B/D/H           | 10/68/52
[ 22, 43, 96 ]                         | O/O/O           | 26/53/140
[ 3639, 19086, 57162 ]                 | H/D/H           | E37/19086/DF4A
[ 190, 229, 771 ]                      | O/H/O           | 276/E5/1403
[ 2, 44, 69, 99 ]                      | B/H/H/H         | 10/2C/45/63
[ 75, 207, 218, 357, 385 ]             | H/H/H/D/O       | 4B/CF/DA/357/601
[ 12, 28, 46, 78, 154, 188, 222, 240 ] | D/O/O/D/H/H/H/H | 12/34/56/78/9A/BC/DE/F0

生の入力リストはこちらから入手できます


効率のいくつかの側面に注意する必要がありますか?(配列の長さが1000などの場合)
ダニエルインディー

3
@DanielIndieいいえ、そうする必要はありません。また、1000エントリのパズルには、使用されるベースに関係なく、多くの重複する数字が含まれるため、有効な数字になることはありません。(これは、最初のルールに従って発生しないことが保証されています。)
アーナルド

はい、あなたは正しい...ばか私は... :)
ダニエルインディー

1
Japtソリューションを本当に楽しみにしています。試してみて、良いものが見つからなかったからです。
Nit

2
@Scroobleいいえ。:) よい試み!
アーナウルド

回答:


4

JavaScript(Node.js)192,155,154,152,151,145,136,113,99,92 90バイト

  • [0,1,2,3]を返すことができることを思い出させてくれた@Arnauldに感謝します-> [2,8,10,16]は8バイトを節約し、素晴らしいアイデア(23+バイト)
  • @Kevin Cruijssenが1バイト削減してくれてありがとう
f=([c,...a],t="")=>c?[1,4,5,8].find(b=>T=!/(.).*\1/.test(n=t+c.toString(b*2))&&f(a,n))+T:a

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

説明:

[c,...a]-一度に1つのアイテムc?***:" "を取得するための@Arnauldトリック -> cが未定義の場合、最終結果に到達することができました-[]-私が ""を入力した場合、検索はその正当性を考慮しません。([] + 5 = "5" JS FTW) [1,4,5,8].find正しいベースが見つかるたびに(出力はこの配列(1,4,5,8)->(2,8,10,16)の正当なものになります)。検索の仕組み->何かが見つかった場合は要素(1-8)を返し、内部ソリューションの結果を追加します。見つからない場合はundefined + Tがfalseを返します-> NaN親呼び出しは偽と見なされます

!/(.).*\1/.test(n=t+b) 文字列に重複があるかどうかを判断します(重複している場合)。

f(a,n)) 新しいstring(n)で次の番号(aはarray.slice(1)になります)

findが見つかると停止するため、結果のT(temp)に結果を割り当てます。したがって、最後の結果は結果Bであるf()になることがわかります。


1
t="",B=""t="",B=tバイトを保存します。
ケビンCruijssen

@KevinCruijssenがソリューションを更新します、ありがとう:)(そして、あなたはArnauldに)
-DanielIndie

@Arnauld私はあなたの素晴らしいアイデアを取り入れて、似たようなことをしました。今すぐソリューションを見る
DanielIndie

@Arnauldの純粋な素晴らしさ
DanielIndie

1
涼しい!さらに2バイトを削りましょう(trim()もう必要ありません)。
アルノー


3

ルビー、72 71バイト

->a{a.map{%w[b o d x]}.inject(&:product).find{|c|/(.).*\1/!~[p,c]*?%%a}}

出力形式は、ある種の逆S式の極悪非道です。

f[[12, 28, 46, 78, 154, 188, 222, 240]]
=> [[[[[[["d", "o"], "o"], "d"], "x"], "x"], "x"], "x"]

代わりにスラッシュで区切ると、さらに3バイトかかります(追加*?/)。

この形式は、より慣用的なものよりもわずかに短いループ構造に由来し、repeated_combination(a.size)文字の配列の配列を生成し、それをクロス積関数で削減します。

編集:リンのおかげで1バイトを保存しました。


2

Pyth、21 20バイト

f{Is.bjYNTQ^[8T2y8)l

すべての可能なベースリストのリストを返します(常に長さ1を持ちます)。
ここで試してみてください

説明

f{Is.bjYNTQ^[8T2y8)l
           ^[8T2y8)lQ  Get the tuples of bases of the same length as the input.
f                      Filter to get those...
    .bjYNTQ            ... where converting bases elementwise...
   s                   ... and joining together...
 {I                    ... has no repeats.


2

ゼリー17 16バイト

⁴⁽%ʠḃṗL³bF⁼Q$ƲÐf

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

塩基のリストを返します。

 ==説明==
⁴⁽%ʠḃṗL³bF⁼Q$ƲÐfメインリンク。
 ⁽%ʠ数字。
    bi全単射に変換...
⁴16.結果は[2,8,10,16]です。
     ṗL入力長によるデカルトパワー。
             ƲÐfフィルター、満たすものを保持...
       ³入力
        bそのベースに変換する
         フラット化されたときF(\のすべての数字を結合します
                      異なる数字を一緒に)
          uniQ $はそれ自体と等しくなります。


2

05AB1E、17バイト

2žv8T)sgãʒIsв˜DÙQ

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


05AB1Eがわからないので、説明を追加するまで待ってからこの質問をする必要がありますが8、キャラクターの結果'8'と他の3つの結果は整数ですか ただし、+ 1は、最後のテストケースを含めて、うまく機能しているようです。
ケビンCruijssen

2
@KevinCruijssenそれは「2žv8T」から来ています。ソースコードの数字は05AB1Eの文字としてプッシュされますが、žv(16)とT(10)はそれぞれの数字をスタックにプッシュするビルトインです。05AB1Eのスタック内の最後の要素の暗黙的な表示は数値に変換されるため、これは通常気付かれませんが、この場合、表示される結果は要素の配列であるため、これらの要素はそのまま残り、引用符になります。たとえば、コマンドïを)の後に使用して、2つのchar要素をintにキャストできます。
カルド

@KevinCruijssen私の説明の例: tio.run ##MzBNTDJM f fyPbQDtv//wE コード:2を押して、印刷し、配列にラップして、印刷します。
カルド


1

、19バイト

fȯS=UΣz`B¹πmDd1458L

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

塩基のリストを返します

説明

fȯS=UΣz`B¹πmDd1458L  Implicit input
                  L  Length of input
          π          Cartesian power of
             d1458     The digits of 1458  [1,4,5,8]
           mD          Double the digits   [2,8,10,16]
fȯ                   Filter by
      z`B¹             Zip with input by converting to its base
     Σ                 Concatenate
  S=U                  Equal to itself with unique elements
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.