Klawiatura jednoliniowa


20

Wyzwanie

Celem tego wyzwania jest ustalenie, czy dany ciąg może zostać wpisany przy użyciu tylko jednego wiersza standardowej klawiatury QWERTY w Wielkiej Brytanii.

To code golfwygrywa najkrótsze rozwiązanie w bajtach!


IO

Dane wejściowe będą składać się z jednego ciągu zerowego lub większej liczby znaków w zakresie dziesiętnym ASCII 32-126 włącznie. Dla tego wyzwania możesz założyć, że pusty Ciąg nie wymaga wpisywania i dlatego można go pisać za pomocą pojedynczego wiersza.

Możesz wziąć dane wejściowe jako ciąg znaków, listę znaków lub równoważną formę dla swojego języka.

Dane wyjściowe powinny być prawdziwą wartością dla dowolnego ciągu znaków, który można wpisać za pomocą pojedynczej linii, lub falsey dla tego, który nie może.


Układ klawiatury

Aby wyjaśnić wszelkie niejasności dotyczące standardowego układu klawiatury poniżej, znajduje się lista klawiszy dostępnych w każdej linii, w tym alternatywne górne klawisze (dostępne za pomocą shift).

  • Linia 1
    • Standard: `1234567890-=
  • Linia 2
    • Standard: qwertyuiop[]
  • Linia 3
    • Standard: asdfghjkl;'#
    • Duże litery: ASDFGHJKL
    • Specjalne: Caps Lock
  • Linia 4
    • Standard: \zxcvbnm,./
    • Alternatywny: |<>?
    • Duże litery: ZXCVBNM
    • Specjalne: Shift
  • Wiersz 5
    • Specjalne: spacja

Alternatywne górne klawisze można nacisnąć tylko wtedy, gdy Shift jest również w tej samej linii, a do wielkich liter można uzyskać tylko za pomocą Caps Lock lub Shift. Naprawdę możesz użyć tylko jednej linii klawiatury!


Przypadki testowe

            -> 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)

Więc to układy ściśle amerykańskie? (Mam układ brytyjski).
ouflak

2
@ouflak Wręcz przeciwnie, jest to wyłącznie układ klawiatury w Wielkiej Brytanii QWERTY
Luke Stevens,

@Arnauld Tak, dziękuję za uwagę!
Luke Stevens,

Tak, zacząłem patrzeć na oba i zauważyłem, że twój układ wydaje się być zgodny z układem klawiatury brytyjskiej, a nie amerykańskiej. Hmmm ... Zastanawiam się, jak wygląda mój austriacki w porównaniu.
ouflak

Czy wolno nam traktować dane wejściowe jako listę znaków, czy może to być ciąg znaków?
Kevin Cruijssen

Odpowiedzi:


12

Python 2 , 130 123 121 115 bajtów

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

Wypróbuj online!


Python 3 , 111 bajtów

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

Wypróbuj online!

-4 bajty, dzięki nedla2004


1
Jeśli chcesz używać języka Python 3, możesz obniżyć go do 111 bajtów .
nedla2004,

9

Retina 0.8.2 , 72 71 bajtów

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

Wypróbuj online! Objaśnienie: Każda alternacja pasuje do innego rzędu klawiatury. (?i)W środku wzór powoduje, że cała reszta wzorca być dopasowane rozróżniana wielkość liter. Edycja: Zapisano 1 bajt dzięki @KirillL.


opqrmożna zmienić o-rna -1. Czy zapomniałeś też znaku zwrotnego dla linii 1, nie widzę go?
Kirill L.,

@KirillL. Ups, musiał przypadkowo przegapić wybranie go podczas kopiowania / wklejania, dziękuję za wykrycie tego.
Neil,

fajnie [][...:)
mazzy

8

05AB1E , 66 47 bajtów

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

Pobiera dane wejściowe jako listę znaków.

-19 bajtów dzięki @Emigna . Zupełnie zapomniałem, że mamy wbudowane stałe qwerty-klawiatura. :RE

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

ž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 bajtów

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

Wypróbuj online!

-1 od komentarza @Kirill L. w odpowiedzi Retina.
-3 dzięki @Ismael Miguel i @Arnauld za ich wspólny wysiłek.


Dlaczego masz asdfghjkli ASDFGHJKLtam? Dlaczego nie użyjesz iflagi x=>/.../i.test(x)?
Ismael Miguel,

@IsmaelMiguel, ponieważ wyrażenie regularne QWERTYUIOPnie powinno być dopasowane. Dodatkowa kontrola kosztuje więcej niż kodowanie wielkich liter bezpośrednio w wyrażeniu regularnym.
Shieru Asakoto,

Nieważne, to jest buggy. x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)ma taką samą długość
Ismael Miguel,

@IsmaelMiguel Korzystanie z bitowego |oszczędza 1 bajt.
Arnauld,

1
@IsmaelMiguel Jest to część specyfikacji ECMAScript. Jedynymi 3 znaków, które muszą być chronione w obrębie klasy postaci są \ , ]i -(patrz ClassAtomNoDash w specyfikacji). Kreska może również wydawać się nieskalowana, jeśli jest to pierwszy lub ostatni znak (w przeciwnym razie jest interpretowany jako separator zakresu znaków).
Arnauld,

5

Perl 6 , 102 101 100 bajtów

-1 bajt dzięki nwellnhof!

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

Wypróbuj online!

Całkiem standardowe wdrożenie. Prawdopodobnie istnieje krótsze rozwiązanie oparte na wyrażeniach regularnych, ale nie znam wystarczająco dobrze wyrażeń regularnych w Perlu 6, aby podjąć próbę.


Możesz użyć maxzamiast ?any(i minzamiast ?all).
nwellnhof,

1
Za to, co jest warte, rozwiązaniem opartym na wyrażeniach regularnych byłoby 84 bajtów lub 80 bajtów przy użyciu wyrażeń regularnych Perl 5 z m:P5//. Ale nie sądzę, aby któreś z nich było warte opublikowania jako odpowiedzi.
nwellnhof,

4

Java 10, 209 208 bajtów

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 bajt dzięki @TFeld .

Wypróbuj online.

Wyjaśnienie:

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

Fajne rozwiązanie, ale zwraca uwagę, !!!mimo że wykrzykników nie można wydrukować w żadnej linii. Właśnie dodałem to jako przypadek testowy
Luke Stevens

@LukeStevens Ach, fałszywie założyłem, że dane wejściowe są zawsze poprawne dla jednego z pięciu wierszy. Zmodyfikuję moje rozwiązanie. Jest to prosta poprawka (ale doda kilka bajtów ..)
Kevin Cruijssen

Dlaczego nie użyć (?i)innych wielkich liter?
Neil,

@Neil Ze względu na konieczność ucieczki dla ukośnika, jest to również 209 bajtów .
Kevin Cruijssen

Zaproponuj p==" "zamiastp.equals(" ")
ceilingcat


4

Galaretka , 55 bajtów

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

Wypróbuj online!

Pierwszy wiersz zawiera listę wierszy klawiatury, a drugi sprawdza, czy dane wejściowe programu są zawarte w pojedynczych (lub zerowych) wierszach i czy nie ma znaków, których nie można wpisać (jak QWE!@#).


3

C , 150 bajtów

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

Wypróbuj online!

Nie wygra żadnych nagród, ale jest to zabawne podejście: odwzorowujemy postacie w pięciu rzędach klawiatury 4 8 16 32 64i na każdą nieprawidłową postać 3. Bitowo LUB wartość dla każdego znaku w ciągu razem i sprawdzamy, czy wynik jest satysfakcjonujący x&(x-1) == 0, co jest prawdą, gdy xpotęga wynosi 2 lub zero, tj. Ilekroć xma ustawiony najwyżej jeden bit.


2

LUA , 282 262 259 270 bajtów

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)

Wypróbuj online!


2

PHP, 98 bajtów

Trochę mi smutno, że nie ma nic krótszego niż regex. Prawdopodobnie nie jest to najszybsze rozwiązanie.

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

Uruchom jako potok z -Flub spróbuj online .


Najkrótsze rozwiązanie niebędące wyrażeniem regularnym, jakie znalazłem (124 bajty; podział linii i tab dla wygody czytania):

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

wychodzi z kodem 1dla prawdy, 0dla fałszu. Uruchom jako potok za pomocą -R.
Wymaga PHP 5.4 lub nowszego; dla starszych PHP, użyj array(...)zamiast [...](+5 bajtów)
lub użyj tych 123 bajtów -nRw PHP <7:

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

2

AWK , 163 119 113 bajtów

To jest odpowiedź AWK, zwraca łańcuch liczbowy 1 dla wartości true, 0 dla wartości false. (Zapisane jako wywołanie AWK jako plik awk -f do użytku interaktywnego).

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

Wypróbuj online!

Jednak nie obsługuje znaku TAB w formie napisanej (trywialne rozszerzenie), która nie jest częścią specyfikacji.


4
„Wszystkie rozwiązania wyzwań powinny: (…) Być poważnym kandydatem do zastosowania kryteriów zwycięstwa. Na przykład, należy wziąć udział w konkursie golfa kodowego, a udział w konkursie prędkości powinien być szybki . ” - Centrum pomocy Nie ma potrzeby deklarowania tych 2 zmiennych i zdecydowanie nie ma potrzeby tworzenia ich ciągów. I printwystarczy jeden: Wypróbuj online!
manatwork

Twój komentarz, że rozwiązania powinny być poważne, jest jednak słuszny, ale argumentowałbym, że każde rozwiązanie po poprawionym 05AB1E jest zatem nieistotne, ponieważ nie mogą one dopasować ani poprawić wyniku. Nie rozumiem, jak nie można użyć print dwa razy, aby uzyskać zarówno prawda, jak i fałsz (z pewnością coś, co odczytuje ciągi znaków do końca danych wejściowych). Powiedziałem wtedy, że zoptymalizowane, a nie optymalne. Dzięki twoim myślom można go zmniejszyć do 143 znaków.
Phil F

I rzeczywiście, przejście na całość sprawi, że będzie to 121 znaków ...
Phil F

2
code-golf nie jest konkurencją dla najkrótszego kodu, ale dla twojego języka. Jeśli możesz ulepszyć swoje rozwiązanie, sugeruję zrobienie tego
Jo King,

@Jo King, dziękuję za wyjaśnienia. zmieniony kod będzie / mógłby być: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
Phil F

1

Bash , 119 bajtów

Zawiera echo zapewniające „czytelny” wynik. Jeśli umieścisz wokół niego odpowiednie opakowanie powłoki (do wyboru) w celu dołączenia wydruku / wydruku, możesz zaoszczędzić 8 bajtów. Mój odczyt wyzwania sugeruje, że rozwiązanie powinno wypisać odpowiednie wskazanie wyjścia, więc trzymam 119 bajtów.

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

Wypróbuj online!


Pamiętaj, że rozwiązanie Bash oznacza również, że rozwiązanie AWK my / @ manatwork może zostać zmniejszone do 113 bajtów.
Phil F,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.