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.comb⊆comb $_~.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.