Những con số này là gì?


22

Trong khi tôi đang viết số, tôi nhận thấy sau đó bàn phím của tôi có Shiftphím bấm và bị chặn và tất cả những gì tôi viết là $%&giống như các ký tự. Và thậm chí tệ hơn, tôi đã chuyển đổi giữa bố trí bàn phím tiếng Anh và tiếng Tây Ban Nha để tôi không biết tôi đã sử dụng cái nào cho mỗi số.

Thử thách

Đưa ra một chuỗi chứa các ký tự ký hiệu, hãy thử đoán xem tôi đã viết số nào. Bàn phím của tôi tạo ra các ký tự sau cho các số khi Shiftnhấn:

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • Đầu vào sẽ là một chuỗi không rỗng, không rỗng bao gồm các ký hiệu ở trên.
  • Đầu ra sẽ là một số duy nhất nếu bố cục bàn phím có thể được suy ra từ chuỗi (nghĩa là nếu chuỗi chứa @bố cục tiếng Anh đã được sử dụng và nếu chuỗi có "bố cục tiếng Tây Ban Nha được sử dụng) hoặc nếu số đó giống với cả hai bố cục (tức là đầu vào được !$dịch như 14cho cả hai bố cục); mặt khác, đầu ra sẽ là hai số có thể cho cả hai bố cục nếu không thể suy ra và các số kết quả là khác nhau.
  • Chuỗi đầu vào sẽ luôn được viết theo một bố cục duy nhất. Vì vậy, bạn không cần phải mong đợi "@như là đầu vào.

Ví dụ

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

Đây là , vì vậy có thể mã ngắn nhất cho mỗi ngôn ngữ sẽ giành chiến thắng!


Xin chào, đó ·là một thách thức ...
Erik the Outgolfer

2
@EriktheOutgolfer trên thực tế ·là vô dụng đối với tiếng Tây Ban Nha, nó chỉ được sử dụng trong ngôn ngữ tiếng Catalan.
Charlie

Đầu ra như {(8, 9, 6, 1), (9, 0, 7, 1)}(cho trường hợp thử nghiệm thứ 4) có được chấp nhận không?
Lynn

@Lynn vâng, đúng vậy.
Charlie

Khi xuất 2 số, thứ tự có quan trọng không?
Xù xì

Câu trả lời:


6

Thạch , 32 31 byte

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

Hãy thử trực tuyến!

  • -1 byte nhờ 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 byte

Chơi gôn

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;}

Hãy thử trực tuyến!


Bị đánh cắp

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
}


Mảng tra cứu băm ma thuật

Sau một số thử nghiệm với các giá trị, tôi nhận ra rằng mỗi giá trị ASCII của các ký tự !"·$%&/()=@#^*modulo 16 trả về một số duy nhất. Các 'tra cứu băm mảng ma thuật' cửa hàng số tiếng Anh kết hợp với mỗi nhân vật ở chỉ số duy nhất này, và mỗi người trong số các con số tiếng Tây Ban Nha tại chỉ số này bù đắp bằng 16, tỉ số lấy số lượng yêu cầu từ các mảng tầm thường cho mỗi ngôn ngữ. Băm được lưu trữ cho các giá trị không hợp lệ cho cả hai ngôn ngữ.


Tôi không cho rằng bạn có thể sử dụng toCharArray () và các giá trị int để làm cho nó ngắn hơn? (Chỉ là một ý tưởng, tôi chưa thử nó.)
Quintec

@Quintec Tôi đã thử nó, nhưng các byte bổ sung từ toCharArray()và tính toán số mũ được áp dụng cho giá trị int làm cho nó dài hơn cả hai .contains()câu lệnh.
Luke Stevens

s.equals(e)|s.contains("#")có thể s.matches(e+"|.*#.*").
Kevin Cruijssen

3

Japt, 38 byte

Đầu ra một chuỗi các chuỗi có bố cục tiếng Tây Ban Nha đầu tiên.

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

Thử nó


2

Thạch , 38 byte

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

Hãy thử trực tuyến!


Tốt đẹp! Chỉ cần một câu hỏi, tôi đã thử mã của bạn với ()hoặc (())là đầu vào, nhưng mã của bạn sau đó không trả về gì cả. Tôi cho rằng đó là một hạn chế với những gì Jelly nhận được làm đầu vào?
Charlie

1
@Charlie Thử với '()''(())'tương ứng. Có, nếu bạn không trích dẫn đối số, nó chỉ được nhập dưới dạng chuỗi nếu nó không thể được evalgán cho giá trị Python 3.
Erik the Outgolfer

2

Võng mạc 0.8.2 , 60 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

.+
$&¶$&

Nhân đôi đầu vào.

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

Cố gắng dịch từng dòng theo một bố cục bàn phím khác nhau.

D`

Không lặp lại kết quả.

Gm`^\d+$

Chỉ giữ các dòng chỉ chứa chữ số.


Bạn có cần mtrong giai đoạn cuối của bạn?
trứng

@ovs Có, các trận đấu chạy trước, và sau đó các dòng được phân chia và các dòng chứa các trận đấu được giữ.
Neil


1

05AB1E , 42 41 byte

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

Cổng của câu trả lời Jelly của @dylnan .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)

Xem 05AB1E mẹo này của tôi (phần như thế nào vào danh sách số nguyên nén? ) Để hiểu tại sao •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]). Điều này (cùng với ) ngắn hơn 1 byte so với việc lấy các giá trị unicode của chuỗi : '""!ÿ·$%&/()=""!@#$%^&*()"‚Ç.


Các trường hợp !$!!$$%%chỉ nên xuất một số vì kết quả là giống nhau cho cả hai bố cục và không có sự mơ hồ.
Charlie

@Charlie Rất tiếc, đã sửa
Kevin Cruijssen


1

Sạch sẽ , 116 byte

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

Hãy thử trực tuyến!

Lấy đầu vào và được mã hóa trong CP437. TIO chỉ hỗ trợ UTF-8, do đó, một lối thoát được sử dụng trong mã trình diễn để lấy giá trị byte bằng 250 tương ứng với dấu chấm trung tâm (được tính là một byte).


Đầu !$%vào chỉ nên xuất một số, không phải hai, vì kết quả là giống nhau cho cả hai bố cục.
Charlie

@Charlie Đã sửa nó.
Οurous

1

APL (Dyalog) , 40 byte

Chức năng tiền tố ẩn danh. Mặc dù không được sử dụng, · nằm trong bộ ký tự byte đơn Dyalog . Giả sử lập chỉ mục dựa trên 0 ( ⎕IO←0) được mặc định trên nhiều hệ thống.

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

Hãy thử trực tuyến!

 toàn bộ lập luận

'=!"·$%&/()' ')!@#$%^&*('⍳¨ chỉ số của các ký tự trong mỗi chuỗi này

{∪⍵/⍨~10∊¨⍵} áp dụng lambda sau ( là đối số):

10∊¨⍵ đối với mỗi danh sách các chữ số, cho dù 10 (cho biết "không tìm thấy") là thành viên của nó

~ phủ định cục bộ (tức là chỉ những nơi tìm thấy tất cả các chữ số)

⍵/⍨ lọc đối số bằng cách đó

 tìm các yếu tố độc đáo của điều đó


0

Phi tiêu , 125 byte

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

Ung dung:

f(s){
  ['=!"·\$%&/()',')!@#\$%^&*(']
    .map(
      (b)=>s.split('').map((e)=>b.indexOf(e))
      .join()
    ).where(
      (e)=>!e.contains('-')
    ).toSet();
}
  • Tạo một mảng với hai giá trị khóa được chỉ định, từ 0 đến 9
  • Đối với mỗi người trong số họ, chuyển đổi chuỗi đầu vào thành số tương ứng bằng cách sử dụng chỉ mục của các ký tự
  • Tham gia mảng kết quả để tạo một số
  • Xóa bất kỳ số nào có '-' (Trả về -1 khi indexOf không thể tìm thấy char)
  • Quay lại dưới dạng Set để xóa trùng lặp

Hãy thử nó trên Dartpad!


0

T-SQL, 143 byte

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

Đầu vào được lấy thông qua bảng i có sẵn với trường varchar v , theo tiêu chuẩn IO của chúng tôi .

Tham gia bảng đầu vào với hai chuỗi ký tự khác nhau, sau đó sử dụng hàm SQL 2017 mớiTRANSLATE để trao đổi các ký tự riêng lẻ và TRY_CASTđể xem liệu chúng ta có kết thúc bằng một số không. Nếu không, TRY_CASTtrả lại NULL.

Bên ngoài cuối cùng SELECT DISTINCTkết hợp các kết quả giống hệt nhau và lọc ra NULLS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.