Quels sont ces chiffres?

22

Pendant que j'écrivais des chiffres, j'ai remarqué après un moment que mon clavier avait la Shifttouche enfoncée et bloquée et tout ce que j'écrivais était $%&comme des caractères. Et pire encore, j'avais basculé entre les dispositions de clavier anglais et espagnol, donc je ne sais pas lequel j'ai utilisé pour chaque numéro.

Défi

Étant donné une chaîne contenant des caractères de symbole, essayez de deviner quel numéro j'ai écrit. Mon clavier produit les caractères suivants pour les chiffres lorsque vous Shiftappuyez sur:

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • L'entrée sera une chaîne non nulle et non vide composée des symboles ci-dessus.
  • La sortie sera un numéro unique si la disposition du clavier peut être déduite de la chaîne (c'est-à-dire si la chaîne contient une @disposition anglaise a été utilisée, et si la chaîne contient une "disposition espagnole a été utilisée) ou si le nombre est le même pour les deux mises en page (c'est-à-dire que l'entrée est !$qui se traduit comme 14pour les deux mises en page); sinon la sortie sera les deux nombres possibles pour les deux dispositions si elle ne peut pas être déduite et les nombres résultants sont différents.
  • La chaîne d'entrée sera toujours écrite dans une seule disposition. Vous n'avez donc pas besoin de vous attendre "@en entrée.

Exemples

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

Il s'agit de , de sorte que le code le plus court pour chaque langue gagne!

Charlie
la source
Dang it, c'est ·difficile ...
Erik the Outgolfer
2
@EriktheOutgolfer en fait le ·est inutile pour l'espagnol, il n'est utilisé qu'en catalan.
Charlie
La sortie comme {(8, 9, 6, 1), (9, 0, 7, 1)}(pour le 4ème cas de test) est-elle acceptable?
Lynn
@Lynn oui, ça l'est.
Charlie
Lors de la sortie de 2 numéros, l'ordre est-il important?
Shaggy du

Réponses:

6

Gelée , 32 31 octets

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

Essayez-le en ligne!

  • -1 octets grâce à Erik l'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
la source
1
31 octets .
Erik the Outgolfer
4

Python 3 , 76 octets

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

Essayez-le en ligne!

Lynn
la source
3

Java (JDK) , 173 octets

Golfé

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

Essayez-le en ligne!


Non golfé

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
}


Tableau de recherche Magic Hashing

Après quelques essais avec des valeurs, j'ai réalisé que chacune des valeurs ASCII des caractères !"·$%&/()=@#^*modulo 16 renvoie un nombre unique. Le `` tableau de recherche de hachage magique '' stocke les nombres anglais associés à chaque caractère à cet index unique, et chacun des nombres espagnols à cet index compensé par 16, ce qui rend la récupération du nombre requis du tableau triviale pour chaque langue. Un hachage est stocké pour les valeurs non valides pour l'une ou l'autre langue.

Luke Stevens
la source
Je ne suppose pas que vous pourriez utiliser toCharArray () et les valeurs int pour raccourcir cela? (Juste une idée, je ne l'ai pas encore essayée.)
Quintec
@Quintec Je l'ai essayé, mais les octets supplémentaires toCharArray()et le calcul de l'exposant à appliquer à la valeur int l'ont rendu beaucoup plus long que les deux .contains()instructions.
Luke Stevens
s.equals(e)|s.contains("#")peut être s.matches(e+"|.*#.*").
Kevin Cruijssen
3

Japt, 38 octets

Génère d'abord un tableau de chaînes avec la disposition espagnole.

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

Essayez-le

Hirsute
la source
2

Gelée , 38 octets

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

Essayez-le en ligne!

Erik le Outgolfer
la source
Agréable! Juste une question, j'ai essayé votre code avec ()ou (())en entrée, mais votre code ne renvoie alors rien. Je suppose que c'est une limitation avec ce que Jelly reçoit en entrée?
Charlie
1
@Charlie Essayez avec '()'et '(())'respectivement. Oui, si vous ne citez pas l'argument, il n'est saisi sous forme de chaîne que s'il ne peut pas être mis evalà une valeur Python 3.
Erik the Outgolfer
2

Retina 0.8.2 , 60 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

.+
$&¶$&

Dupliquez l'entrée.

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

Essayez de traduire chaque ligne selon une disposition de clavier différente.

D`

Dédupliquez le résultat.

Gm`^\d+$

Conserver uniquement les lignes contenant uniquement des chiffres.

Neil
la source
Avez-vous besoin de la mdernière étape?
2018
@ovs Oui, les correspondances s'exécutent en premier, puis les lignes sont divisées et les lignes contenant les correspondances sont conservées.
Neil
1

JavaScript (ES6), 99 octets

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

Essayez-le en ligne!

Comment?

g

1x >= 0

Arnauld
la source
1

05AB1E , 42 41 octets

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

Réponse de Jelly du port de @dylnan .

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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)

Voir cette astuce de mes 05AB1E (section Comment les listes entières Compresser? ) Pour comprendre pourquoi •Hhç₁d©u÷^Σ(“ðΣèõĆ\n-•184вest [33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41]). Ce (avec le ) est plus courte que 1 octet prenant les valeurs unicode de la chaîne: '""!ÿ·$%&/()=""!@#$%^&*()"‚Ç.

Kevin Cruijssen
la source
Les cas !$et !!$$%%ne doivent générer qu'un seul numéro car le résultat est le même pour les deux dispositions et il n'y a aucune ambiguïté.
Charlie
@Charlie Oops, corrigé
Kevin Cruijssen
1

Rubis , 68 octets

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

Essayez-le en ligne!

GB
la source
1

Nettoyer , 116 octets

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

Essayez-le en ligne!

Prend en entrée et est codé en CP437. TIO ne prend en charge que l'UTF-8, donc un échappement est utilisé dans le code de démonstration pour obtenir la valeur d'octet littérale 250 correspondant au point central (compté comme un octet).

Οurous
la source
L' !$%entrée ne doit générer qu'un seul chiffre, pas deux, car le résultat est le même pour les deux dispositions.
Charlie
@Charlie Le fixe.
2018
1

APL (Dyalog) , 40 octets

Fonction de préfixe tacite anonyme. Bien qu'il ne soit pas utilisé, il · fait partie du jeu de caractères Dyalog à un octet . Suppose une indexation basée sur 0 ( ⎕IO←0) qui est par défaut sur de nombreux systèmes.

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

Essayez-le en ligne!

 l'argument entier

'=!"·$%&/()' ')!@#$%^&*('⍳¨ index des caractères dans chacune de ces chaînes

{∪⍵/⍨~10∊¨⍵} appliquer le lambda suivant ( est l'argument):

10∊¨⍵ pour chaque liste de chiffres, 10 (indiquant "non trouvé") en fait partie

~ négation locale (c'est-à-dire uniquement celles où tous les chiffres sont trouvés)

⍵/⍨ filtrer l'argument par ce

 trouver les éléments uniques de cette

Adam
la source
0

Fléchette , 125 octets

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

Non golfé:

f(s){
  ['=!"·\$%&/()',')!@#\$%^&*(']
    .map(
      (b)=>s.split('').map((e)=>b.indexOf(e))
      .join()
    ).where(
      (e)=>!e.contains('-')
    ).toSet();
}
  • Crée un tableau avec les deux valeurs de clé spécifiées, de 0 à 9
  • Pour chacun d'eux, convertissez la chaîne d'entrée en nombre correspondant en utilisant les index des caractères
  • Rejoignez le tableau résultant pour créer un nombre
  • Supprimez tout nombre ayant un «-» (Dart renvoie -1 lorsque indexOf ne trouve pas de caractère)
  • Retourner comme un ensemble pour supprimer les doublons

Essayez-le sur Dartpad!

Elcan
la source
0

T-SQL, 143 octets

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

L'entrée est prise via la table préexistante i avec le champ varchar v , selon nos normes IO .

Joint la table d'entrée avec les deux chaînes de caractères différentes, puis utilise la nouvelle fonction SQL 2017TRANSLATE pour échanger des caractères individuels et TRY_CASTvoir si nous nous retrouvons avec un nombre. Sinon, TRY_CASTrevient NULL.

L'extérieur final SELECT DISTINCTcombine des résultats identiques et filtre le NULLS.

BradC
la source