Jakie to są liczby?

22

Podczas pisania liczb zauważyłem po chwili, że moja klawiatura ma Shift wciśnięty i zablokowany klawisz, a wszystko, co napisałem, było jak $%&znaki. Co gorsza, przełączałem się między układami klawiatury angielskiej i hiszpańskiej, więc nie wiem, którego użyłem dla każdego numeru.

Wyzwanie

Biorąc pod uwagę ciąg znaków zawierający znaki symboliczne, spróbuj zgadnąć, który numer napisałem. Po Shiftnaciśnięciu moja klawiatura wyświetla następujące cyfry dla liczb :

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • Dane wejściowe będą niepustym, niepustym łańcuchem złożonym z powyższych symboli.
  • Wynik będzie liczbą pojedynczą, jeśli układ klawiatury można wywnioskować z ciągu (tj. Jeśli ciąg zawiera @układ w języku angielskim, a jeśli ciąg zawiera układ "w języku hiszpańskim) lub jeśli liczba jest taka sama dla oba układy (tzn. dane wejściowe są !$tłumaczone jak 14dla obu układów); w przeciwnym razie dane wyjściowe będą dwiema możliwymi liczbami dla obu układów, jeśli nie będzie można ich wywnioskować, a uzyskane liczby będą różne.
  • Ciąg wejściowy będzie zawsze zapisywany w jednym układzie. Więc nie musisz oczekiwać "@jako danych wejściowych.

Przykłady

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

To jest , więc może wygrać najkrótszy kod dla każdego języka!

Charlie
źródło
Cholera, ·to trudne ...
Erik the Outgolfer,
2
@EriktheOutgolfer w rzeczywistości ·jest bezużyteczny dla hiszpańskiego, jest używany tylko w języku katalońskim.
Charlie,
Czy dane wyjściowe takie jak {(8, 9, 6, 1), (9, 0, 7, 1)}(dla 4. przypadku testowego) są dopuszczalne?
Lynn,
@ Lynn tak, to prawda.
Charlie,
Czy przy liczeniu 2 liczb kolejność ma znaczenie?
Kudłaty

Odpowiedzi:

6

Galaretka , 32 31 bajtów

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

Wypróbuj online!

  • -1 bajty dzięki Erikowi 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.
dylnan
źródło
1
31 bajtów .
Erik the Outgolfer
4

Python 3 , 76 bajtów

lambda s:{(*map(k.find,s),)for k in['=!"·$%&/()',')!@#$%^&*(']if{*s}<={*k}}

Wypróbuj online!

Lynn
źródło
4

Perl 6 , 62 bajtów

{set grep {!/\D/},TR'=!"·$%&/()'0..9',TR')!@\x23$%^&*('0..9'}

Wypróbuj online!

Zwraca zestaw. (Można by zrobić dwa lub trzy bajty krótsze, gdyby nie było błędu w obsłudze Rakudo # na listach wyszukiwania.)

nwellnhof
źródło
3

Java (JDK) , 173 bajtów

Grał w golfa

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

Wypróbuj online!


Nie golfił

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
}


Tablica wyszukiwania Magic Hashing

Po kilku eksperymentach z wartościami zdałem sobie sprawę, że każda z wartości ASCII znaków !"·$%&/()=@#^*modulo 16 zwraca unikalny numer. Te „magiczne mieszania lookup array” przechowuje numery angielskie związane z każdego znaku w tym unikatowy indeks, a każdy z numerów hiszpańskich w tym indeksie przesunięte o 16, co ściągam wymaganą liczbę z tablicy trywialne dla każdego języka. Hash jest przechowywany dla wartości, które są nieprawidłowe dla dowolnego języka.

Luke Stevens
źródło
Nie sądzę, że możesz użyć toCharArray () i wartości int, aby to skrócić? (Pomysł, jeszcze go nie wypróbowałem.)
Quintec
@Quintec Próbowałem, ale dodatkowe bajty toCharArray()i obliczenie wykładnika, który ma być zastosowany do wartości int, spowodowało, że była ona znacznie dłuższa niż obie .contains()instrukcje.
Luke Stevens,
s.equals(e)|s.contains("#")może być s.matches(e+"|.*#.*").
Kevin Cruijssen
3

Japt, 38 bajtów

Najpierw wyprowadza tablicę ciągów z hiszpańskim układem.

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

Spróbuj

Kudłaty
źródło
2

Galaretka , 38 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło
Miły! Tylko jedno pytanie, wypróbowałem twój kod z ()lub (())jako dane wejściowe, ale twój kod nic nie zwraca. Przypuszczam, że to ograniczenie w tym, co Jelly otrzymuje jako wkład?
Charlie,
1
@Charlie Wypróbuj odpowiednio '()'i '(())'. Tak, jeśli nie zacytujesz argumentu, zostanie on wprowadzony jako ciąg znaków tylko wtedy, gdy nie będzie można go evaldopasować do wartości Python 3.
Erik the Outgolfer,
2

Retina 0.8.2 , 60 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

.+
$&¶$&

Zduplikuj dane wejściowe.

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

Spróbuj przetłumaczyć każdą linię zgodnie z innym układem klawiatury.

D`

Deduplikuj wynik.

Gm`^\d+$

Zachowaj tylko wiersze zawierające tylko cyfry.

Neil
źródło
Czy potrzebujesz na mostatnim etapie?
ovs
@ovs Tak, najpierw uruchamiane są dopasowania, a następnie linie są dzielone i linie zawierające dopasowania są zachowywane.
Neil,
1

JavaScript (ES6), 99 bajtów

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

Wypróbuj online!

W jaki sposób?

Funkcja pomocnika sol próbuje przekonwertować ciąg wejściowy przy użyciu danego układu.

Nieprawidłowe znaki są zastępowane przez -1, co powoduje albo prawidłowy, ale negatywnie wyglądający ciąg liczbowy (jeśli brakuje tylko pierwszego znaku), lub nieprawidłowy ciąg liczbowy. Tak czy inaczej, test x >= 0jest fałszywy.

Arnauld
źródło
1

05AB1E , 42 41 bajtów

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

Port @dylnan 's Jelly .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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)

Zobacz moją wskazówkę 05AB1E (sekcja Jak skompresować listy liczb całkowitych? ), Aby zrozumieć, dlaczego tak •Hhç₁d©u÷^Σ(“ðΣèõĆ\n-•184вjest [33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41]). Ten (wraz z ) jest krótszy niż 1 bajt przyjmując wartości Unicode ciągu: '""!ÿ·$%&/()=""!@#$%^&*()"‚Ç.

Kevin Cruijssen
źródło
!$I !!$$%%przypadki powinny wyjście tylko jeden numer jako wynik jest taki sam dla obu układów i nie ma dwuznaczności.
Charlie
@Charlie Oops, naprawiono
Kevin Cruijssen
1

Rubinowy , 68 bajtów

->s{%w[=!"·$%&/() )!@#$%^&*(].map{|a|s.tr a,'0-9'}.grep_v(/\D/)|[]}

Wypróbuj online!

GB
źródło
1

Czysty , 116 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe i jest zakodowany w CP437. TIO obsługuje tylko UTF-8, więc w kodzie demonstracyjnym zastosowano znak ucieczki, aby uzyskać literalną wartość bajtu 250 odpowiadającą środkowej kropce (liczonej jako jeden bajt).

Obrzydliwe
źródło
Dane !$%wejściowe powinny wypisywać tylko jedną liczbę, a nie dwie, ponieważ wynik jest taki sam dla obu układów.
Charlie
@Charlie Naprawiono.
Οurous
1

APL (Dyalog) , 40 bajtów

Anonimowa ukryta funkcja prefiksu. Chociaż nieużywany, · znajduje się w jednobajtowym zestawie znaków Dyalog . Zakłada indeksowanie oparte na 0 ( ⎕IO←0), które jest domyślne w wielu systemach.

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

Wypróbuj online!

 cały argument

'=!"·$%&/()' ')!@#$%^&*('⍳¨ indeksy znaków w każdym z tych ciągów

{∪⍵/⍨~10∊¨⍵} zastosuj następującą lambda ( jest argumentem):

10∊¨⍵ dla każdej listy cyfr, czy 10 (oznaczające „nie znaleziono”) jest jej członkiem

~ lokalna negacja (tj. tylko te, w których znajdują się wszystkie cyfry)

⍵/⍨ odfiltruj argument przez to

 znaleźć unikalne elementy tego

Adám
źródło
0

Dart , 125 bajtów

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

Nie golfowany:

f(s){
  ['=!"·\$%&/()',')!@#\$%^&*(']
    .map(
      (b)=>s.split('').map((e)=>b.indexOf(e))
      .join()
    ).where(
      (e)=>!e.contains('-')
    ).toSet();
}
  • Tworzy tablicę z dwiema określonymi wartościami kluczy, od 0 do 9
  • Dla każdego z nich przekonwertuj ciąg wejściowy na odpowiednią liczbę za pomocą indeksów znaków
  • Dołącz wynikową tablicę, aby utworzyć liczbę
  • Usuń dowolną liczbę ze znakiem „-” (Dart zwraca -1, gdy indexOf nie może znaleźć znaku)
  • Wróć jako zestaw, aby usunąć duplikaty

Wypróbuj na Dartpad!

Elcan
źródło
0

T-SQL, 143 bajty

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

Dane wejściowe są pobierane za pośrednictwem istniejącej tabeli i z polem varchar v , zgodnie z naszymi standardami we / wy .

Łączy tabelę wprowadzania z dwoma różnymi ciągami znaków, a następnie używa nowej funkcji SQL 2017TRANSLATE do zamiany pojedynczych znaków i TRY_CASTsprawdzenia, czy otrzymamy liczbę. Jeśli nie, TRY_CASTzwraca NULL.

Ostateczny zewnętrzny SELECT DISTINCTłączy identyczne wyniki i odfiltrowuje NULLS.

BradC
źródło