Welche Zahlen sind das?


22

Während ich Zahlen schrieb, bemerkte ich nach einer Weile, dass meine Tastatur die ShiftTaste gedrückt und blockiert hatte und alles, was ich schrieb, waren $%&ähnliche Zeichen. Und noch schlimmer war, dass ich zwischen der englischen und der spanischen Tastatur umgeschaltet habe, sodass ich nicht weiß, welche ich für jede Nummer verwendet habe.

Herausforderung

Versuchen Sie anhand einer Zeichenfolge mit Symbolzeichen zu erraten, welche Zahl ich geschrieben habe. Meine Tastatur erzeugt die folgenden Zeichen für die Zahlen, wenn die ShiftTaste gedrückt wird:

1234567890
----------
!"·$%&/()=  Spanish layout
!@#$%^&*()  English layout
  • Die Eingabe ist eine nicht leere Zeichenfolge, die aus den obigen Symbolen besteht.
  • Die Ausgabe ist eine einzelne Zahl, wenn das Tastaturlayout aus der Zeichenfolge abgeleitet werden kann (dh wenn die Zeichenfolge @ein englisches Layout enthält und wenn die Zeichenfolge "ein spanisches Layout enthält ) oder wenn die Zahl dieselbe ist beide Layouts (dh die Eingabe entspricht !$der 14für beide Layouts); Andernfalls werden die beiden möglichen Zahlen für beide Layouts ausgegeben, wenn dies nicht möglich ist und die resultierenden Zahlen unterschiedlich sind.
  • Die Eingabezeichenfolge wird immer in einem einzigen Layout geschrieben. Sie müssen also nicht mit "@Eingaben rechnen .

Beispiele

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

Das ist , also kann der kürzeste Code für jede Sprache gewinnen!


·
Verdammt

2
@EriktheOutgolfer in der Tat ·ist das für Spanisch nutzlos, es wird nur in der katalanischen Sprache verwendet.
Charlie

Ist eine Ausgabe wie {(8, 9, 6, 1), (9, 0, 7, 1)}(für den 4. Testfall) akzeptabel?
Lynn

@Lynn ja, das ist es.
Charlie

Bei der Ausgabe von 2 Zahlen spielt die Reihenfolge eine Rolle?
Shaggy

Antworten:


6

Jelly , 32 31 Bytes

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

Probieren Sie es online!

  • -1 Bytes dank Erik dem 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.




3

Java (JDK) , 173 Byte

Golf gespielt

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

Probieren Sie es online!


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
}


Das Magic Hashing Lookup Array

Nach einigem Experimentieren mit Werten wurde mir klar, dass jeder der ASCII-Werte der Zeichen !"·$%&/()=@#^*modulo 16 eine eindeutige Zahl zurückgibt. Das 'Magic Hashing Lookup Array' speichert die englischen Zahlen, die jedem Zeichen in diesem eindeutigen Index zugeordnet sind, und jede der spanischen Zahlen in diesem Index, die um 16 versetzt sind. Dadurch wird das Abrufen der erforderlichen Nummer aus dem Array für jede Sprache trivial. Ein Hash wird für Werte gespeichert, die für beide Sprachen ungültig sind.


Ich nehme nicht an, dass Sie toCharArray () und die int-Werte verwenden könnten, um dies zu verkürzen. (Nur eine Idee, ich habe es noch nicht ausprobiert.)
Quintec

@Quintec Ich habe es versucht, aber die zusätzlichen Bytes von toCharArray()und die Berechnung des Exponenten, der auf den int-Wert angewendet werden soll, haben es weitaus länger gemacht als die beiden .contains()Anweisungen.
Luke Stevens

s.equals(e)|s.contains("#")kann sein s.matches(e+"|.*#.*").
Kevin Cruijssen

3

Japt, 38 Bytes

Gibt zuerst ein Array von Zeichenfolgen mit dem spanischen Layout aus.

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

Versuch es


2

Jelly , 38 Bytes

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

Probieren Sie es online!


Nett! Nur eine Frage, ich habe deinen Code mit ()oder (())als Eingabe probiert , aber dein Code gibt dann nichts zurück. Ich nehme an, das ist eine Einschränkung dessen, was Jelly als Input erhält.
Charlie

1
@ Charlie Versuchen Sie es mit '()'und '(())'. Ja, wenn Sie das Argument nicht in Anführungszeichen setzen, wird es nur als Zeichenfolge eingegeben, wenn es nicht evalauf einen Python 3-Wert angepasst werden kann.
Erik der Outgolfer

2

Retina 0.8.2 , 60 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

.+
$&¶$&

Duplizieren Sie die Eingabe.

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

Versuchen Sie, jede Zeile mit einem anderen Tastaturlayout zu übersetzen.

D`

Deduplizieren Sie das Ergebnis.

Gm`^\d+$

Behalten Sie nur Zeilen bei, die nur Ziffern enthalten.


Benötigst du das min deiner letzten Etappe?
OVS

@ovs Ja, die Übereinstimmungen werden zuerst ausgeführt und dann werden die Zeilen aufgeteilt und Zeilen mit Übereinstimmungen werden beibehalten.
Neil

1

JavaScript (ES6), 99 Byte

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

Probieren Sie es online!

Wie?

G

-1x >= 0


1

05AB1E , 42 41 Bytes

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

Port of @dylnans Gelee Antwort .

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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)

Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Wie komprimiere ich Integer-Listen? ) An, um zu verstehen, warum das so •Hhç₁d©u÷^Σ(“ðΣèõĆ\n-•184вist [33,34,183,36,37,38,47,40,41,61,33,64,35,36,37,94,38,42,40,41]. Das (mit dem ) ist 1 Byte kürzer als die Unicode - Werte der Zeichenfolge unter: '""!ÿ·$%&/()=""!@#$%^&*()"‚Ç.


Die Fälle !$und !!$$%%sollten nur eine Zahl ausgeben, da das Ergebnis für beide Layouts gleich ist und keine Mehrdeutigkeit besteht.
Charlie

@Charlie Oops, behoben
Kevin Cruijssen


1

Sauber , 116 Bytes

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

Probieren Sie es online!

Übernimmt die Eingabe und ist in CP437 codiert. TIO unterstützt nur UTF-8, daher wird im Demo-Code ein Escape verwendet, um den Literal-Bytewert 250 abzurufen, der dem Mittelpunkt (gezählt als ein Byte) entspricht.


Die !$%Eingabe sollte nur eine Zahl und nicht zwei ausgeben, da das Ergebnis für beide Layouts gleich ist.
Charlie

@ Charlie repariert es.
Freitag,

1

APL (Dyalog) , 40 Bytes

Anonyme implizite Präfixfunktion. Obwohl nicht verwendet, · ist in der Dyalog einzelnen Byte - Zeichensatzes . Nimmt eine 0-basierte Indizierung ( ⎕IO←0) an, die auf vielen Systemen standardmäßig verwendet wird.

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

Probieren Sie es online!

 das gesamte Argument

'=!"·$%&/()' ')!@#$%^&*('⍳¨ Indizes der Zeichen in jeder dieser Zeichenfolgen

{∪⍵/⍨~10∊¨⍵} Wende das folgende Lambda an ( ist das Argument):

10∊¨⍵ für jede Liste von Ziffern, ob 10 (was "nicht gefunden" anzeigt) ein Mitglied davon ist

~ lokale Negation (dh nur diejenigen, bei denen alle Ziffern gefunden werden)

⍵/⍨ filtere das Argument danach

 finde die einzigartigen Elemente davon


0

Pfeil , 125 Bytes

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();
}
  • Erstellt ein Array mit den beiden angegebenen Schlüsselwerten von 0 bis 9
  • Konvertieren Sie für jede Zeichenfolge die Eingabe in die entsprechende Zahl, indem Sie die Indizes der Zeichen verwenden
  • Verbinden Sie das resultierende Array, um eine Zahl zu erstellen
  • Entferne eine beliebige Zahl mit einem '-' (Dart gibt -1 zurück, wenn indexOf kein Zeichen findet)
  • Kehre als Set zurück, um Duplikate zu entfernen

Probieren Sie es auf Dartpad!


0

T-SQL, 143 Bytes

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

Die Eingabe erfolgt über die bereits vorhandene Tabelle i mit dem Varchar-Feld v . je unseren IO - Standards .

Verbindet die Eingabetabelle mit den zwei verschiedenen Zeichenfolgen und verwendet dann die neue SQL 2017-FunktionTRANSLATE , um einzelne Zeichen auszutauschen und TRY_CASTfestzustellen, ob wir eine Zahl erhalten. Wenn nicht, TRY_CASTkehrt zurückNULL .

Das letzte Äußere SELECT DISTINCTkombiniert identische Ergebnisse und filtert das heraus NULLS.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.