Какие это цифры?

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-го теста) приемлемым?
Линн
@ Линн да, это так.
Чарли
При выводе 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.
dylnan
источник
1
31 байт .
Эрик Outgolfer
3

Java (JDK) , 173 байта

Golfed

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

Попробуйте онлайн!


Ungolfed

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
}


Массив Magic Hashing Lookup

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

Люк Стивенс
источник
Я не думаю, что вы могли бы использовать toCharArray () и значения int, чтобы сделать это короче? (Просто идея, я еще не пробовал.)
Quintec
@Quintec Я попробовал это сделать, но дополнительные байты toCharArray()и вычисление показателя степени, применяемые к значению 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.
Эрик Outgolfer
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 's 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]. Это (вместе с ) 1 байт короче , чем принимать значения Юникода строки: '""!ÿ·$%&/()=""!@#$%^&*()"‚Ç.

Кевин Круйссен
источник
!$И !!$$%%случаи должны выводиться только один номер , как результат является одинаковым для обоих макетов и нет никакой неоднозначности.
Чарли
@Charlie Упс, исправлено
Кевин Круйссен
1

Чисто , 116 байт

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

Попробуйте онлайн!

Принимает ввод и кодируется в CP437. TIO поддерживает только UTF-8, поэтому в демонстрационном коде используется экранирование для получения буквального значения 250 байта, соответствующего центральной точке (считается одним байтом).

Οurous
источник
На !$%входе должно выводиться только одно число, а не два, поскольку результат одинаков для обоих макетов.
Чарли
@ Чарли Исправил это.
Οurous
1

APL (Dyalog) , 40 байт

Функция анонимного молчаливого префикса. Хотя он не используется, он · входит в однобайтовый набор символов Dyalog . Предполагается индексирование на основе 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();

Ungolfed:

f(s){
  ['=!"·\$%&/()',')!@#\$%^&*(']
    .map(
      (b)=>s.split('').map((e)=>b.indexOf(e))
      .join()
    ).where(
      (e)=>!e.contains('-')
    ).toSet();
}
  • Создает массив с двумя указанными значениями ключа, от 0 до 9
  • Для каждого из них преобразуйте входную строку в соответствующее число, используя индексы символов
  • Присоединитесь к полученному массиву, чтобы создать число
  • Удалите любое число, имеющее '-' (Дарт возвращает -1, когда indexOf не может найти символ)
  • Вернуться как набор для удаления дубликатов

Попробуйте это на Dartpad!

Elcan
источник
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 с VARCHAR полем V , в соответствии с нашими стандартами IO .

Объединяет входную таблицу с двумя различными символьными строками, а затем использует новую функцию SQL 2017,TRANSLATE чтобы поменять отдельные символы и TRY_CASTпосмотреть, получим ли мы число. Если нет, TRY_CASTвозвращается NULL.

Окончательный внешний SELECT DISTINCTобъединяет идентичные результаты и отфильтровывает NULLS.

BradC
источник