这些是什么数字?


22

当我写数字时,过了一会儿我发现键盘上的Shift按键被按下和锁定,而我写的只是$%&类似字符。更糟糕的是,我一直在英语和西班牙语键盘布局之间切换,所以我不知道我为每个数字使用哪个键盘布局。

挑战

给定包含符号字符的字符串,请尝试猜测我写的数字。Shift按下时,键盘会为数字产生以下字符:

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • 输入将是一个由上述符号组成的非空,非空字符串。
  • 如果可以从字符串中推断出键盘布局(例如,如果字符串包含@英语布局,并且如果字符串包含"西班牙布局,则输出)将是单个数字,或者对于两种布局(即,输入是!$意为14两种布局); 否则,如果无法推断输出且结果数字不同,则输出将是两种布局的两个可能数字。
  • 输入字符串将始终以单个布局编写。因此,您不需要期望"@输入。

例子

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)}可以接受(对于第四个测试用例)输出?
林恩

@Lynn是的。
查理

输出2个数字时,顺序重要吗?
毛茸茸的

Answers:


6

果冻32 31字节

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

在线尝试!

  • -1个字节感谢外长者埃里克(Erik the Outgolfer)

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+"|.*#.*")
凯文·克鲁伊森

3

Japt,38个字节

首先输出具有西班牙布局的字符串数组。

"=!\"·$%&/())!@#$%^&*("òA £ËXbD
kø'- â

试试吧


2

果冻,38个字节

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

在线尝试!


真好!只是一个问题,我尝试使用()(())作为输入来尝试您的代码,但是您的代码什么也不返回。我想这是Jelly收到的输入的限制吗?
查理

1
@Charlie 分别尝试使用'()''(())'。是的,如果您不引述参数,则只能将其作为字符串输入eval编码为Python 3值。
暴民埃里克(Erik the Outgolfer)'18年

2

视网膜0.8.2,60字节

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

在线尝试!链接包括测试用例。说明:

.+
$&¶$&

复制输入。

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

尝试根据不同的键盘布局来翻译每一行。

D`

对结果进行重复数据删除。

Gm`^\d+$

仅保留仅包含数字的行。


m在最后阶段是否需要?
ovs

@ovs是,首先运行匹配项,然后拆分行,并保留包含匹配项的行。
尼尔,

1

JavaScript(ES6),99个字节

s=>(g=l=>a=s.replace(/./g,c=>l.indexOf(c)))('=!"·$%&/()',b=g(')!@#$%^&*('))>=0?a-b&&b>=0?[a,b]:a:b

在线尝试!

怎么样?

G尝试使用给定的布局转换输入字符串。

-1个x >= 0


1

05AB1E42 41 字节

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

@dylnan的果冻口岸。

在线尝试验证所有测试用例

说明:

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个字节'""!ÿ·$%&/()=""!@#$%^&*()"‚Ç


!$!!$$%%案件应只输出一个号码作为结果均为布局相同,没有歧义。
查理

@Charlie Oops,已修复
Kevin Cruijssen


1

干净的 116字节

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

在线尝试!

接受输入并在CP437中进行编码。TIO仅支持UTF-8,因此在演示代码中使用了转义符来获取与中心点相对应的文字字节值250(计数为一个字节)。


!$%输入应输出只有一个号码,而不是两个,作为结果是两种布局相同。
查理

@Charlie修复它。
Οurous

1

APL(Dyalog),40 字节

匿名默认前缀功能。尽管未使用,但· 在Dyalog单字节字符集中。假定基于0的索引(⎕IO←0)在许多系统上都是默认的。

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

在线尝试!

 整个论点

'=!"·$%&/()' ')!@#$%^&*('⍳¨ 这些字符串中每个字符的索引

{∪⍵/⍨~10∊¨⍵} 应用以下lambda(是参数):

10∊¨⍵ 对于每个数字列表,是否有10(表示“未找到”)是其成员

~ 本地否定(即仅找到所有数字的否定)

⍵/⍨ 以此过滤参数

 找到那个独特的元素


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();
}
  • 用两个指定的键值(从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的预先存在的表i进行输入根据我们的IO标准,。

使用两个不同的字符串连接输入表,然后使用新的SQL 2017函数TRANSLATE换出单个字符,并TRY_CAST查看是否以数字结尾。如果不是,则TRY_CAST返回NULL

最终的外部SELECT DISTINCT结合了相同的结果并滤除了NULLS

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.