Tastiera a una riga


20

La sfida

L'obiettivo di questa sfida è determinare se una determinata stringa può essere digitata usando solo una riga di una tastiera QWERTY del Regno Unito standard.

Questa è la code golfsoluzione più breve in byte vince!


IO

L'input sarà una singola stringa di zero o più caratteri nell'intervallo decimale ASCII di 32-126 inclusi. Si può presumere per questa sfida che una stringa vuota non richiede alcuna digitazione e quindi può essere digitata utilizzando una sola riga.

Puoi prendere l'input come stringa, elenco di caratteri o forma equivalente per la tua lingua.

L'output dovrebbe essere un valore di verità per qualsiasi stringa che può essere digitata usando una sola riga o falsa per una stringa che non può.


Layout della tastiera

Per chiarire qualsiasi ambiguità su ciò che è il layout di tastiera standard di seguito è un elenco di tasti disponibili su ogni riga, inclusi i tasti superiori alternati (accessibili tramite MAIUSC).

  • Linea 1
    • Standard: `1234567890-=
  • Linea 2
    • Standard: qwertyuiop[]
  • Linea 3
    • Standard: asdfghjkl;'#
    • Maiuscolo: ASDFGHJKL
    • Speciale: Blocco maiuscole
  • Linea 4
    • Standard: \zxcvbnm,./
    • Alternato: |<>?
    • Maiuscolo: ZXCVBNM
    • Speciale: Maiusc
  • Linea 5
    • Speciale: barra spaziatrice

I tasti superiori alternativi possono essere premuti solo se Shift si trova anche sulla stessa riga e i tasti maiuscoli sono accessibili solo tramite BLOC MAIUSC o MAIUSC. Puoi davvero usare solo una riga di tastiera!


Casi test

            -> true     (empty string)
45-2=43     -> true     (line 1)
qwerty      -> true     (line 2)
tryitout    -> true     (line 2)
Qwerty      -> false    (no shift or caps on line 2)
#sad        -> true     (line 3)
AsDf        -> true     (caps lock used)
@sDF        -> false    (no shift for alternate upper)
zxcvbn?     -> true     (line 4)
zxc vbn     -> false    (spacebar on separate line)
123abc      -> false    (multiple lines)
            -> true     (just space bar)
!!!         -> false    (exclamation marks cannot be printed by a single line)

Quindi questo è rigorosamente layout di tastiera degli Stati Uniti? (Ho un layout nel Regno Unito).
ouflak,

2
@ouflak Al contrario, è rigorosamente solo il layout della tastiera QWERTY nel Regno Unito
Luke Stevens,

@Arnauld Sì, grazie, per averlo notato!
Luke Stevens,

Sì, ho iniziato a guardare entrambi e ho notato che il layout sembra seguire il layout della tastiera del mio Regno Unito, non quello degli Stati Uniti. Hmmm ... Mi chiedo come sia il mio austriaco in confronto.
ouflak,

È consentito prendere l'input come un elenco di caratteri o deve essere una stringa?
Kevin Cruijssen,

Risposte:


12

Python 2 , 130 123 121 115 byte

lambda s:any(set(s)<=set(l+l.lower())for l in["`1234567890-=","eqwrtyuiop[]","ASDFGHJKL;'#","ZXCVBNM\,./|<>?"," "])

Provalo online!


Python 3 , 111 byte

lambda s:any({*s}<={*l+l.lower()}for l in["`1234567890-=","eqwrtyuiop[]","ASDFGHJKL;'#","ZXCVBNM\,./|<>?"," "])

Provalo online!

-4 byte, grazie a nedla2004


1
Se si desidera utilizzare Python 3, è possibile ridurlo a 111 byte .
nedla2004,

9

Retina 0.8.2 , 72 71 byte

`^([-=\d`]+|[][eio-rtuwy]+|(?i)[adfghjkls;'#]+|[\\bcnmvxz,./|<>?]+| *)$

Provalo online! Spiegazione: Ogni alternanza corrisponde a una riga diversa della tastiera. La (?i)parte centrale del motivo fa sì che tutto il resto del motivo sia abbinato a maiuscole e minuscole. Modifica: salvato 1 byte grazie a @KirillL.


opqrpuò essere modificato in o-rper -1. Inoltre, hai dimenticato un personaggio di backtick per la linea 1, non lo vedo?
Kirill L.,

@KirillL. Spiacenti, deve essersi perso accidentalmente selezionandolo durante la copia / incolla, grazie per averlo individuato.
Neil,

bello [][...:)
mazzy

8

05AB1E , 66 47 byte

žh…`-=«žS„[]«žTDu…;'#««žUDu"\,./|<>?"««ð)εISåP}O

Prende l'input come un elenco di caratteri.

-19 byte grazie a @Emigna . Dimenticato completamente che avevamo builtin costanti tastiera qwerty. : D

Provalo online o verifica tutti i casi di test .

Spiegazione:

žh                # Push "0123456789"
  …`-=            # Push "`-="
      «           # Merge them together
žS                # Push "qwertyuiop"
  „[]             # Push "[]"
     «            # Merge them togeter
žT                # Push "asdfghjkl"
  Du              # Duplicate, and toUppercase the copy
    …;'#          # Push ";'#"
        ««        # Merge all three together
žU                # Push "zxcvbnm"
  Du              # Duplicate, and toUppercase the copy
    "\,./|<>?"    # Push "\,./|<>?"
              ««  # Merge all three together
ð                 # Push a space
 )                # Wrap all string in an array
  ε   }           # Map each to:
   I              #  Take the input (list of characters)
    å             #  Check for each if it's in the current string of the map-iteration
     P            #  Take the product (1 if all are truthy, 0 otherwise)
       O          # Take the sum (either 1 or 0, so truthy/falsey), and output implicitly



5

JavaScript (Node.js) , 99 98 95 byte

x=>/^([-`=\d]+|[wetyuio-r[\]]+)$/.test(x)|/^([asdfghjkl;'#]+|[zxcvbnm,./<>?\\|]+| *)$/i.test(x)

Provalo online!

-1 dal commento di @Kirill L. nella risposta Retina.
-3 grazie @Ismael Miguel e @Arnauld per il loro sforzo combinato.


Perché hai asdfghjkle ASDFGHJKLlì dentro? Perché non usi la ibandiera, come x=>/.../i.test(x)?
Ismael Miguel,

@IsmaelMiguel perché QWERTYUIOPnon dovrebbe corrispondere al regex. Il controllo extra costerà di più che codificare quelle lettere maiuscole direttamente nel regex.
Shieru Asakoto,

Non importa, è buggy. x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)è della stessa lunghezza
Ismael Miguel,

@IsmaelMiguel Utilizzando un bit per bit si |salva 1 byte.
Arnauld,

1
@IsmaelMiguel Fa parte delle specifiche ECMAScript. I soli 3 caratteri che devono essere sfuggito all'interno di una classe di caratteri sono \ , ]e -(vedere ClassAtomNoDash nelle specifiche). Il trattino può anche apparire senza caratteri di escape se è il primo o l'ultimo carattere (in caso contrario, viene interpretato come un separatore di intervalli di caratteri).
Arnauld,

5

Perl 6 , 102 101 100 byte

-1 byte grazie a nwellnhof!

->\a{max map {a.combcomb $_~.lc:},|<eqwrtyuiop[] ASDFGHJKL;'# ZXCVBNM\,./|<>?>,' ',"`-="~[~] ^10}

Provalo online!

Implementazione piuttosto standard. Probabilmente esiste una soluzione basata su regex più breve, ma non conosco la regex di Perl 6 abbastanza bene da fare un tentativo.


Puoi usare maxinvece di ?any(e mininvece di ?all).
nwellnhof,

1
Per quello che vale, una soluzione basata su regex sarebbe 84 byte o 80 byte usando regex Perl 5 con m:P5//. Ma non credo che nessuno dei due meriti di essere pubblicato come risposta.
nwellnhof,

4

Java 10, 209 208 byte

s->{int l=0,t;for(var p:s){t=p.matches("[[0-9]`\\-=]")?1:"qwertyuiop[]".contains(p)?2:p.matches("(?i)[asdfghjkl;'#]")?3:"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?4:p.equals(" ")?5:9;l=l<1?t:l!=t?9:l;}return l<6;}

-1 byte grazie a @TFeld .

Provalo online.

Spiegazione:

s->{                    // Method with String-array parameter and boolean return-type
  int l=0,              //  Line-integer, starting at 0
      t;                //  Temp integer
  for(var p:s){         //  Loop over the characters
    t=p.matches("[[0-9]`\\-=]")?
                        //   If it's a character from the first line: 
       1                //    Set `t` to 1
      :"qwertyuiop[]".contains(p)?
                        //   Else-if it's a character from the second line:
       2                //    Set `t` to 2
      :p.matches("(?i)[asdfghjkl;'#]")?
                        //   Else-if it's a character from the third line
       3                //    Set `t` to 3
      :"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?
                        //   Else-if it's a character from the fourth line:
       4                //    Set `t` to 4
      :p.equals(" ")?   //   Else-if it's a space from the fifth line:
       5                //    Set `t` to 5
      :                 //   Else (invalid character):
       9;               //    Set `t` to 9
    l=l<1?              //   If `l` is still 0:
       t                //    Set it to `t`
      :l!=t?            //   Else-if `t` is a different line than `l`:
       9                //    Set `l` to 9 (non-existing line)
      :                 //   Else (`t` is the same line as `l`):
       l;}              //    Leave `l` the same
  return l<6;}          //  Return whether `l` is not 9

Bella soluzione, ma restituisce valore vero !!!nonostante i punti esclamativi non possano essere stampati da una singola riga. L'ho appena aggiunto come test case
Luke Stevens,

@LukeStevens Ah, ho erroneamente supposto che l'input sia sempre valido per una delle cinque righe. Modificherò la mia soluzione. È una soluzione semplice (ma aggiungerà alcuni byte ..)
Kevin Cruijssen,

Perché non usare (?i)per le altre lettere maiuscole?
Neil,

@Neil A causa della fuga richiesta per la barra, è anche 209 byte .
Kevin Cruijssen,

Suggerisci p==" "invece dip.equals(" ")
ceilingcat il

4

Powershell, 87 byte

Regex di Retina del porto di Neil .

"$args"-cmatch"^([-=\d``]+|[][eio-rtuwy]+|(?i)[adfghjkls;'#]+|[\\bcnmvxz,./|<>?]+| *)$"

4

Gelatina , 55 byte

ØDW;Øq;Œu$€3,4¦;"“rɠ3“Ż²“¿µ|“aƲƘ0ÞḅzḂ»⁶ṭ
¢f€ẈṠSỊafƑ¢F¤$

Provalo online!

La prima riga produce un elenco delle righe della tastiera e la seconda controlla se l'input del programma è contenuto su una singola (o zero) righe e che non ci sono caratteri che non possono essere digitati (come QWE!@#).


3

C , 150 byte

x;f(char*s){for(x=0;*s;x|="@               "[*s++-32]);return!(x&x-1);}

Provalo online!

Non vincerà alcun premio, ma questo è un approccio divertente: mappiamo i caratteri sulle cinque righe della tastiera 4 8 16 32 64e ogni carattere non valido su 3. Analizziamo bit a bit il valore di ciascun carattere nella stringa insieme e controlliamo se il risultato è soddisfacente x&(x-1) == 0, il che è vero quando xè una potenza di 2 o zero, cioè ogni volta che xè impostato al massimo un bit.


2

LUA , 282 262 259 270 byte

s=io.read()l=0
t=0
for c in s:gmatch"."do
f=c.find
t=f(c,"[0-9%`-=]")or 0|(f(c,"[qwertyuiop%[%]]")or 0)*2|(f(c,"[aAsSdDfFgGhHjJkKlL:'@#~]")or 0)*4|(f(c,"[\\zxcvbnm,./|<>?ZXCVBNM]")or 0)*8|(f(c," ")or 0)*16
t=t==0 and 17or t
l=l<1 and t or l~=t and 17or l
end
print(l<17)

Provalo online!


2

PHP, 98 byte

Sono un po 'triste che non ci sia niente di più breve di regex. Probabilmente non è la soluzione più veloce.

<?=preg_match("%^([`\d=-]*|[wetyuio-r[\]]*|(?i)[asdfghjkl;'#]*|[\\\zxcvbnm,./|<>?]*| *)$%",$argn);

Esegui come pipe -Fo provalo online .


La soluzione non regex più corta che ho trovato (124 byte; interruzione di riga e scheda per comodità di lettura):

foreach(["`1234567890-=","qwertyuiop[]","asdfghjkl;'#ASDFGHJKL","zxcvbnm,./\|<>?ZXCVBNM"," "]as$d)
    trim($argn,$d)>""||die(1);

esce con il codice 1per la verità, 0per la falsità. Esegui come pipe con -R.
Richiede PHP 5.4 o successivo; per PHP più vecchi, usa array(...)invece di [...](+5 byte)
o usa questi 123 byte con -nRin PHP <7:

foreach(split(_,"`1234567890-=_qwertyuiop[]_asdfghjkl;'#ASDFGHJKL_zxcvbnm,./\|<>?ZXCVBNM_ ")as$d)
    trim($argn,$d)>""||die(1);

2

AWK , 163 119 113 byte

Questa è una risposta AWK, restituisce una stringa numerica 1 per true, 0 stringa per false. (Scritto come AWK invoca come file awk -f per uso interattivo.)

{print/^[-`1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}

Provalo online!

Tuttavia, non gestisce il carattere TAB come scritto (estensione banale) come non parte delle specifiche.


4
"Tutte le soluzioni alle sfide dovrebbero: (...) essere un serio contendente per i criteri vincenti in uso. Ad esempio, è necessario giocare a golf per partecipare a una gara di codice golf e si dovrebbe tentare di essere veloci ". - centro assistenza Non è necessario dichiarare quelle 2 variabili e sicuramente non è necessario renderle stringhe. E ne printbasta uno solo : provalo online!
arte

Il tuo commento secondo cui le soluzioni dovrebbero essere serie è valido, ma direi che qualsiasi soluzione quindi dopo la revisione 05AB1E è quindi irrilevante in quanto non potrebbero eguagliare o migliorare il risultato. Non vedo come non si possa usare print due volte per ottenere sia vero che falso (sicuramente per qualcosa che legge stringhe fino alla fine dell'input). E ho detto ottimizzato non ottimale al momento. Grazie ai tuoi pensieri può essere ridotto a 143 caratteri.
Phil F,

E infatti andare fino in fondo lo farà 121 personaggi ...
Phil F

2
code-golf non è una competizione per il codice più corto in generale, ma il più breve per la tua lingua. Se riesci a migliorare la tua soluzione, suggerirei di farlo
Jo King,

@Jo King, grazie per i tuoi chiarimenti. il codice modificato sarebbe / potrebbe essere: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
Phil F

1

Bash , 119 byte

Include un'eco per fornire un output "leggibile". Se si inserisce un involucro adatto di shell (a scelta) per includere stampa / output, è possibile salvare 8 byte. La mia lettura della sfida suggerisce che la soluzione dovrebbe fornire un'indicazione di output adeguata, quindi rimango con 119 byte.

[[ "$@" =~ ^[asdfghjklASDFGHJKL\;\'#]*$|^[-\`0-9=]+$|^[]qwertyuiop\[]*$|^[zxcvbnm,./\|\<\>\?ZXCVBNM]*$|^\ *$ ]];echo $?

Provalo online!


Nota che la soluzione Bash significa anche che la soluzione AWK my / @ manatwork può essere ridotta a 113 byte.
Phil F
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.