Які це цифри?


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)}прийнятний вихід на зразок (для 4-го тестового випадку)?
Лінн

@Lynn так, так і є.
Чарлі

Виводить 2 числа, чи має значення порядок?
Кудлатий

Відповіді:


6

Желе , 32 31 байт

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

Спробуйте в Інтернеті!

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


Магічний масив пошуку

Після деякого експерименту зі значеннями я зрозумів, що кожне із значень ASCII символів !"·$%&/()=@#^*модуля 16 повертає унікальне число. У «магічних хешуванні підстановка масив» зберігає англійські цифри , пов'язані з кожним символом в цьому унікальному індексі, і кожен з іспанських номерів в цьому індексі компенсовано 16, що робить вибірку необхідну числа з масиву тривіального для кожної мови. Хеш зберігається для значень, недійсних для будь-якої мови.


Я не думаю, що ви могли використовувати toCharArray () та значення int, щоб зменшити це? (Просто ідея, я ще не пробував її.)
Квінтек,

@Quintec Я спробував це, але додаткові байти toCharArray()та обчислення експонента, який буде застосовано до значення int, зробили його набагато довшим, ніж обидва .contains()твердження.
Люк Стівенс

s.equals(e)|s.contains("#")може бути s.matches(e+"|.*#.*").
Кевін Кройсейсен


2

Желе , 38 байт

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

Спробуйте в Інтернеті!


Приємно! Лише одне питання, я спробував ваш код з введенням ()або (())як вхід, але ваш код потім нічого не повертає. Я припускаю, що це обмеження в тому, що Jelly отримує як вхід?
Чарлі

1
@Charlie Спробуйте '()'і '(())'відповідно. Так, якщо ви не цитуєте аргумент, він вводиться лише як рядок, якщо його не можна використовувати evalдля значення Python 3.
Ерік Аутгольфер

2

Сітківка 0,8,2 , 60 байт

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

.+
$&¶$&

Скопіюйте введення.

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

Спробуйте перекласти кожен рядок відповідно до іншого розкладки клавіатури.

D`

Дублюйте результат.

Gm`^\d+$

Тримайте лише рядки, що містять лише цифри.


Вам потрібен mостанній етап?
ов

@ovs Так, спочатку виконується відповідність, а потім лінії розбиваються, а рядки, що містять відповідність, зберігаються.
Ніл


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 На жаль, виправлено
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 байт

Функція анонімного негласного префікса. Хоч він і не використовується, · є в наборі символів "Дьялог" . Передбачає індексацію на основі 0 ( ⎕IO←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
  • Для кожного з них перетворіть вхідний рядок у відповідне число, використовуючи індекси символів
  • Приєднайтеся до отриманого масиву, щоб створити число
  • Видаліть будь-яке число, що має "-" (Dart повертає -1, коли indexOf не може знайти знак)
  • Поверніть як набір для видалення дублікатів

Спробуйте на Дартпаді!


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

Введення проводиться через попередньо існуючу таблицю i з варчарським полем v , згідно з нашими стандартами IO .

Приєднується до таблиці введення з двома різними символьними рядками, потім використовує нову функцію SQL 2017,TRANSLATE щоб замінити окремі символи та TRY_CASTпобачити, чи не закінчилось це число. Якщо ні, TRY_CASTповертається NULL.

Заключний зовнішній вигляд SELECT DISTINCTпоєднує в собі однакові результати і відфільтровує NULLS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.