이것들은 어떤 숫자입니까?


22

숫자를 쓰는 동안 잠시 후 키보드에 Shift키가 눌려져 있고 차단 된 $%&문자 가 모두 같은 문자 라는 것을 알았 습니다 . 그리고 더 나쁜 것은 영어와 스페인어 키보드 레이아웃 간을 전환했기 때문에 각 숫자에 어떤 것을 사용했는지 알 수 없습니다.

도전

기호 문자가 포함 된 문자열이 주어지면 내가 쓴 숫자를 추측하십시오. 키보드를 Shift누르면 숫자에 대해 다음 문자가 생성됩니다 .

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • 입력은 위의 기호로 구성된 null이 아닌 비어 있지 않은 문자열입니다.
  • 키보드 레이아웃이 문자열에서 유추 될 수있는 경우 (예 : 문자열 @에 영어 레이아웃이 포함 된 문자열 이 사용되었고 문자열 "에 스페인어 레이아웃이 사용 된 경우) 또는 숫자가 동일한 경우 출력은 단일 숫자 입니다. 두 레이아웃 모두 (즉, 입력은 두 레이아웃 모두 !$를 번역하는 것 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

이것은 이므로 각 언어마다 가장 짧은 코드가 이길 수 있습니다!


댕이, ·도전 ...
Outgolfer 에릭

2
@EriktheOutgolfer 사실은 ·스페인어에 쓸모가 없으며 카탈로니아 어 언어로만 사용됩니다.
Charlie

{(8, 9, 6, 1), (9, 0, 7, 1)}(4 번째 테스트 케이스 와 같은) 출력이 허용됩니까?
Lynn

@Lynn 네, 그렇습니다.
Charlie

2 개의 숫자를 출력 할 때 순서가 중요합니까?
Shaggy

답변:


6

젤리 , 32 31 바이트

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

온라인으로 사용해보십시오!

  • Outgolfer Erik 덕분에 -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 값에 적용될 지수를 계산하고 계산하여 두 .contains()명령문 보다 훨씬 길었습니다 .
Luke Stevens

s.equals(e)|s.contains("#")일 수 있습니다 s.matches(e+"|.*#.*").
Kevin Cruijssen

3

apt, 38 바이트

스페인어 레이아웃이있는 문자열 배열을 먼저 출력합니다.

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

시도 해봐


2

젤리 , 38 바이트

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

온라인으로 사용해보십시오!


좋은! 한 가지 질문만으로, 입력 ()하거나 (())입력으로 코드를 시도했지만 코드가 아무것도 반환하지 않습니다. Jelly가 입력으로받는 것에 대한 제한이라고 생각합니까?
Charlie

1
@Charlie '()'and와 '(())'각각 시도하십시오 . 예, 인수를 인용하지 않으면 evalPython 3 값으로 조작 할 수없는 경우에만 문자열로 입력됩니다 .
Outgolfer Erik

2

레티 나 0.8.2 , 60 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

.+
$&¶$&

입력을 복제하십시오.

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

다른 키보드 레이아웃에 따라 각 줄을 번역하십시오.

D`

결과를 중복 제거하십시오.

Gm`^\d+$

숫자 만 포함 된 줄만 유지하십시오.


m마지막 단계에서 필요 합니까?
ovs

@ovs 예, 일치 항목이 먼저 실행 된 다음 줄이 분할되고 일치 항목이 포함 된 줄이 유지됩니다.
Neil

1

자바 스크립트 (ES6), 99 바이트

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

온라인으로 사용해보십시오!

방법?

는 주어진 레이아웃을 사용하여 입력 문자열을 변환하려고 시도합니다.

1x >= 0


1

05AB1E , 42 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]). 이것은 (와 함께 ) 문자열의 유니 코드 값을 취하는 것보다 1 바이트 짧습니다 '""!ÿ·$%&/()=""!@#$%^&*()"‚Ç.


!$!!$$%%경우는 결과로서 출력 하나만 수가 레이아웃 모두에서 동일하고 모호성이 없을 것이다.
Charlie

@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 만 지원하므로 데모 코드에서 이스케이프를 사용하여 중심점 (1 바이트로 계산)에 해당하는 리터럴 바이트 값 250을 가져옵니다.


!$%입력해야 출력 결과가 레이아웃 모두에서 동일 번호로 하나만이 아닌 두.
Charlie

@Charlie 수정했습니다.
OUurous

1

APL (Dyalog) , 40 바이트

익명의 암묵적 접두사 기능. 사용되지 · 않지만 Dyalog 1 바이트 문자 세트에 있습니다. ⎕IO←0많은 시스템에서 기본값 인 0 기반 인덱싱 ( )을 가정 합니다.

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

온라인으로 사용해보십시오!

 전체 논쟁

'=!"·$%&/()' ')!@#$%^&*('⍳¨ 이 문자열 각각의 문자 색인

{∪⍵/⍨~10∊¨⍵} 다음 람다를 적용하십시오 ( 인수입니다).

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을 리턴 함)
  • 중복을 제거하기 위해 세트로 반환

다트 패드에서 사용해보십시오!


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의 기준에 따라 .

두 개의 다른 문자열로 입력 테이블을 조인 한 다음 새로운 SQL 2017 함수TRANSLATE 를 사용하여 개별 문자를 바꾸고 TRY_CAST숫자로 끝나는 지 확인합니다. 그렇지 TRY_CAST않으면를 반환합니다 NULL.

최종 외부 SELECT DISTINCT는 동일한 결과를 결합하고를 필터링합니다 NULLS.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.