これらの数字は何ですか?


22

数字を書いている間、しばらくするとキーボードのShiftキーが押されてブロックされ、書いたものはすべて$%&文字のようなものであることに気付きました。さらに悪いことに、私は英語とスペイン語のキーボードレイアウトを切り替えていたため、各番号にどのキーボードレイアウトを使用したかわかりません。

チャレンジ

記号文字を含む文字列が与えられたら、私が書いた数字を推測してみてください。キーボードをShift押すと、数字に対して次の文字が生成されます。

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • 入力は、上記の記号で構成されたnull以外の空でない文字列になります。
  • 文字列からキーボードレイアウトを推測できる場合(つまり、文字列に@英語のレイアウトが含まれてい"て、文字列にスペイン語のレイアウトが含まれている場合)、または番号が同じ場合、出力は単一の数字になります。両方のレイアウト(つまり、入力は両方のレイアウトに関して!$変換さ14れます); それ以外の場合、出力は推測できない場合と結果の数値が異なる場合、両方のレイアウトの2つの可能な数値になります。
  • 入力文字列は常に単一のレイアウトで書き込まれます。したがって"@、入力として期待する必要はありません。

Input  -->  Output
------------------
/()         789        (Spanish layout detected by the use of /)
$%&         456,457    (Layout cannot be inferred)
!@#         123        (English layout detected by the use of @ and #)
()&!        8961,9071  (Layout cannot be inferred)
((·))       88399      (Spanish layout detected by the use of ·)
!$          14         (Layout cannot be inferred but the result is the same for both)
!!$$%%      114455     (Layout cannot be inferred but the result is the same for both)
==$"        0042/42    (Spanish layout, if a number starts with 0 you can choose to
                       omit them in the result or not)

Single character translations:
------------------------------
!   1    
"   2
·   3
$   4
%   5
&   6,7
/   7
(   8,9
)   9,0
=   0
@   2
#   3
^   6
*   8

これはなので、各言語の最短コードが勝つかもしれません!


それを·
やりなさい

2
@EriktheOutgolferは実際に·はスペイン語には役に立たず、カタロニア語でのみ使用されます。
チャーリー

{(8, 9, 6, 1), (9, 0, 7, 1)}(4番目のテストケースのような)出力は受け入れられますか?
リン

@Lynnはい、そうです。
チャーリー

2つの数字を出力する場合、順序は重要ですか?
シャギー

回答:


6

ゼリー32 31バイト

O“=!"Ṣ$%&/()“)!@#$%^&*(‘iⱮ€PƇ’Q

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

  • Erik the Outgolferのおかげで-1バイト

O“!"Ṣ$%&/()=“!@#$%^&*()‘iⱮ€PƇ%⁵Q
O                                  ord of each character in the input
 “!"Ṣ$%&/()=“!@#$%^&*()‘           Constant that yields the list:
                                      [[33, 34, 183, 36, 37, 38, 47, 40, 41, 61],
                                       [33, 64, 35, 36, 37, 94, 38, 42, 40, 41]
                          €        For each list of numbers:
                         Ɱ           For each ord of the characters in the input:
                        i              Find the index of the ord of the character
                                       in the list of numbers.
                                       If the number is not found, `i` returns zero
                                       which means it's a character from only one
                                       keyboard.
                                   There are now two lists of numbers 1-10.
                            Ƈ      Keep the list(s) that: 
                           P         have nonzero product.
                             %⁵    Modulo 10. This maps 10->0.
                               Q   Unique elements. This removes duplicates if the two numbers are the same.




3

Java(JDK)、173バイト

ゴルフ

c->{String s="",e=s;var m="21#3457#908###6##12#456389###0#7".split("");for(int l:c){e+=m[l=l%16];s+=m[l+16];}return s.equals(e)|s.contains("#")?e:e.contains("#")?s:s+","+e;}

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


非ゴルフ

c->{                                                      // Lamdba taking char array as input
    String s="",e=s;                                      // Initialise Spanish and English strings
    var m="21#3457#908###6##12#456389###0#7".split("");   // Create magic hashing lookup array (see below)
    for(int l:c){                                         // Loops through all chars in input
        e+=m[l=l%16];                                     // Get english number from array and append
        s+=m[l+16];                                       // Get Spanish number from array and append
    }
    return s.equals(e)|s.contains("#")?e:                 // If equal or Spanish is invalid return english
        e.contains("#")?s:                                // If English is invalid return Spanish
        s+","+e;                                          // If both are valid but not equal, return both
}


マジックハッシュルックアップアレイ

値を試した後、!"·$%&/()=@#^*16を法とする文字のASCII値のそれぞれが一意の数値を返すことに気付きました。「魔法のハッシュルックアップ配列」このインデックスの店舗英語このユニークなインデックスでは、各文字に関連付けられた番号、およびスペイン語の数字のそれぞれは、各言語の些細な配列から必要な数を取得すること、16により一部相殺されました。どちらの言語でも無効な値のハッシュが保存されます。


これを短くするためにtoCharArray()とint値を使用できるとは思いませんか?(ちょうどアイデア、私はまだそれを試していません。)
Quintec

@Quintec私はそれを試しましたがtoCharArray()、int値からの余分なバイトとint値に適用される指数の計算により、両方の.contains()ステートメントよりもはるかに長くなりました。
ルークスティーブンス

s.equals(e)|s.contains("#")することができますs.matches(e+"|.*#.*")
ケビンクルーイッセン


2

ゼリー、38バイト

183Ọ“=!"“$%&/()”j,“)!@#$%^&*(”iⱮ€⁸ẠƇ’Q

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


いいね!一つだけ質問があります。入力あり()または(())入力としてコードを試しましたが、コードは何も返しません。Jellyが入力として受け取るものに制限があると思いますか?
チャーリー

1
@Charlieと'()''(())'それぞれ試してください。はい。引数を引用符で囲まない場合eval、Python 3値に使用できない場合にのみ文字列として入力されます。
エリックアウトゴルファー

2

Retina 0.8.2、60バイト

.+
$&¶$&
T`=!"·$%&/()`d`^.+
T`)!@#$%^&*(`d`.+$
D`
Gm`^\d+$

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

.+
$&¶$&

入力を複製します。

T`=!"·$%&/()`d`^.+
T`)!@#$%^&*(`d`.+$

異なるキーボードレイアウトに従って各行を翻訳してみてください。

D`

結果を重複排除します。

Gm`^\d+$

数字のみを含む行のみを保持します。


m最後の段階で必要ですか?
ovs

@ovsはい、最初に一致が実行され、次に行が分割され、一致を含む行が保持されます。
ニール


1

05AB1E42 41 バイト

•Hhç₁d©u÷^Σ(“ðΣèõĆ
-•184в2äεIÇk}ʒ®å_}>T%Ù

@dylnanのJelly回答のポート。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Hhç₁d©u÷^Σ(“ðΣèõĆ
-•184в           # Compressed list [33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41]
      2ä         # Split into two parts: [[33,34,183,36,37,38,47,40,41,61],[33,64,35,36,37,94,38,42,40,41]]
ε   }            # Map each inner list to:
 IÇ              #  Get the input, and convert each character to its unicode value
   k             #  Then get the index of each unicode value in the current map-list
                 #  (this results in -1 if the item doesn't exist)
     ʒ   }       # Filter the resulting list of indices by:
      ®å_        #  If the inner list does not contain any -1
          >      # Increase each index by 1 to make it from 0-indexed to 1-indexed
           T%    # Take modulo-10 to convert 10 to 0
             Ù   # Uniquify the result-lists (and output implicitly)

この05AB1Eのヒント(整数リストの圧縮方法?を参照して、理由を理解し•Hhç₁d©u÷^Σ(“ðΣèõĆ\n-•184вてください[33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41])。これは(とともに)、文字列のUnicode値を取得するよりも1バイト短くなります'""!ÿ·$%&/()=""!@#$%^&*()"‚Ç


!$そして!!$$%%ケースは結果として出力つのみ数は両方のレイアウトのために同じであり、全くあいまいさがあるべきではありません。
チャーリー

@チャーリーおっと、修正
ケビン・クルーッセン


1

クリーン、116バイト

import StdEnv,Text
$s=removeDup[foldl(<+)""d\\r<-["=!\"·$%&/()",")!@#$%^&*("],d<-[[indexOf{c}r\\c<-s]]|all((<) -1)d]

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

入力を受け取り、CP437でエンコードされます。TIOはUTF-8のみをサポートするため、デモコードではエスケープを使用して、中央のドット(1バイトとしてカウント)に対応するリテラルバイト値250を取得します。


!$%入力は出力だけの数ではなく、2つの結果は、両方のレイアウトのために同じであるようにすべきです。
チャーリー

@Charlieが修正しました。
18年

1

APL(Dyalog)、40 バイト

匿名の暗黙の接頭辞関数。使用されていませんが· 、Dyalogシングルバイト文字セットにあります。⎕IO←0多くのシステムでデフォルトである0ベースのインデックス付け()を想定しています。

{∪⍵/⍨~10∊¨⍵}'=!"·$%&/()' ')!@#$%^&*('⍳¨⊂

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

 引数全体

'=!"·$%&/()' ')!@#$%^&*('⍳¨ これらの各文字列の文字のインデックス

{∪⍵/⍨~10∊¨⍵} 次のラムダを適用します(引数です):

10∊¨⍵ 数字のリストごとに、10(「not found」を示す)がそのメンバーであるかどうか

~ ローカル否定(つまり、すべての数字が見つかったもののみ)

⍵/⍨ それによって引数をフィルタリングする

 そのユニークな要素を見つける


0

ダーツ、125バイト

f(s)=>['=!"·\$%&/()',')!@#\$%^&*('].map((b)=>s.split('').map((e)=>b.indexOf(e)).join()).where((e)=>!e.contains('-')).toSet();

アンゴルフド:

f(s){
  ['=!"·\$%&/()',')!@#\$%^&*(']
    .map(
      (b)=>s.split('').map((e)=>b.indexOf(e))
      .join()
    ).where(
      (e)=>!e.contains('-')
    ).toSet();
}
  • 指定された2つのキー値(0〜9)で配列を作成します
  • それぞれについて、文字のインデックスを使用して入力文字列を対応する数値に変換します
  • 結果の配列を結合して数値を作成します
  • 「-」を持つ数字を削除します(indexOfが文字を見つけられない場合、Dartは-1を返します)
  • セットとして戻り、重複を削除します

Dartpadでお試しください!


0

T-SQL、143バイト

SELECT DISTINCT*FROM(SELECT TRY_CAST(TRANSLATE(v,m,'1234567890')as INT)a
FROM i,(VALUES('!"·$%&/()='),('!@#$%^&*()'))t(m))b
WHERE a IS NOT NULL

入力は、既存のテーブルを経由して取得され、私のvarcharフィールドでV私たちのIO規格ごと

入力テーブルを2つの異なる文字列と結合し、新しいSQL 2017関数TRANSLATEを使用して個々の文字を交換しTRY_CAST、数字で終わるかどうかを確認します。そうでなければ、をTRY_CAST返しますNULL

最終的なアウターSELECT DISTINCTは、同一の結果を組み合わせてを除外しNULLSます。

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