Tek satırlı Klavye


20

Meydan okuma

Bu zorluğun amacı, belirli bir String'in standart bir UK QWERTY klavyesinin yalnızca bir satırı kullanılarak yazılabilir olup olmadığını belirlemektir.

Bu, code golfbayttaki en kısa çözüm kazanır!


IO

Giriş, 32-126 (dahil) ASCII ondalık aralığında sıfır veya daha fazla karakterden oluşan tek bir Dize olacaktır. Bu meydan okuma için boş bir String'in yazım gerektirmediğini ve böylece tek bir satır kullanılarak yazılabileceğini varsayabilirsiniz.

Girişi Dize, karakter listesi veya diliniz için eşdeğer bir form olarak alabilirsiniz.

Çıktı, tek bir satır kullanılarak yazılabilen herhangi bir Dize için gerçek bir değer veya yapamayan bir satır için falsey olmalıdır.


Klavye düzeni

Standart klavye düzeninin altında ne olduğu konusundaki belirsizlikleri açıklığa kavuşturmak için, her satırda alternatif üst tuşlar (vardiya kullanılarak erişilir) de dahil olmak üzere tuşların bir listesi bulunmaktadır.

  • Satır 1
    • Standart: `1234567890-=
  • Hat 2
    • Standart: qwertyuiop[]
  • Satır 3
    • Standart: asdfghjkl;'#
    • Büyük harf: ASDFGHJKL
    • Özel Etkinlik: Caps Lock
  • Satır 4
    • Standart: \zxcvbnm,./
    • Alternatif: |<>?
    • Büyük harf: ZXCVBNM
    • Özel Etkinlik: Shift
  • Çizgi 5
    • Özel Etkinlik: Boşluk Çubuğu

Alternatif üst tuşlara yalnızca Üst Karakter aynı satırdaysa basılabilir ve büyük harf tuşlarına yalnızca Büyük Harf Kilidi veya ÜstKrktr üzerinden erişilebilir. Gerçekten sadece bir klavye hattı kullanabilirsiniz!


Test senaryoları

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

Yani bu kesinlikle ABD klavye düzenleri mi? (İngiltere'deki bir düzenim var).
ouflak

2
@ouflak Aksine, sadece İngiltere QWERTY klavye düzeni
Luke Stevens

@ Arnauld Evet, farkettiğiniz için teşekkürler!
Luke Stevens

Evet, her ikisine de bakmaya başladım ve düzeninizin, ABD'deki klavye düzenimi izlediğini fark ettim. Hmmm ... Avusturya'lı olanın neye benzediğini merak ediyorum.
ouflak

Girişi karakter listesi olarak almamıza izin var mı, yoksa bir dize mi olması gerekiyor?
Kevin Cruijssen

Yanıtlar:


12

Piton 2 , 130 123 121 115 bayt

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

Çevrimiçi deneyin!


Python 3 , 111 bayt

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

Çevrimiçi deneyin!

-4 bayt, nedla2004 sayesinde


1
Python 3'ü kullanmak istiyorsanız, 111 bayta kadar indirebilirsiniz .
nedla2004

9

Retina 0.8.2 , 72 71 bayt

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

Çevrimiçi deneyin! Açıklama: Her bir alternatif, farklı bir klavye satırıyla eşleşir. (?i)Desen ortasında şablonunun tüm dinlenme harf duyarsız eşleştirilecek neden olur. Düzenleme: @KirillL sayesinde 1 bayt kaydedildi.


opqro-r-1 için değiştirilebilir . Ayrıca, Satır 1 için bir backtick karakteri unuttun mu, görmüyorum?
Kirill

@KirillL. Hata! Kopyalama / yapıştırma sırasında yanlışlıkla seçmeyi kaçırmış olmanız gerekir, bunu tespit ettiğiniz için teşekkürler.
Neil

güzel [][...:)
mazzy

8

05AB1E , 66 47 bayt

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

Girdiyi karakter listesi olarak alır.

@Emigna sayesinde -19 bayt . Tamamen unuttum qwerty-klavye sabit yerleşik. : D

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

ž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 bayt

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

Çevrimiçi deneyin!

Retina yanıtında @Kirill L.'nin yorumundan -1.
-3 @Ismael Miguel ve @Arnauld'a ortak çabaları için teşekkür ederiz.


Neden orada asdfghjklve ASDFGHJKLiçinde? Neden ibayrağı kullanmıyorsunuz x=>/.../i.test(x)?
Ismael Miguel

@IsmaelMiguel çünkü QWERTYUIOPnormal ifade ile eşleştirilmemelidir. Ekstra kontrol, bu büyük harfleri doğrudan normal ifadeye kodlamaktan daha pahalıya mal olacaktır.
Shieru Asakoto

Boşver, buggy. x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)aynı uzunluktadır
Ismael Miguel

@IsmaelMiguel Bitsel kullanıldığında |1 bayt kaydedilir.
Arnauld

1
@IsmaelMiguel Bu, ECMAScript spesifikasyonunun bir parçasıdır. Bir karakter sınıfının içindeki çıkışı gereken sadece 3 karakter \ , ]ve -(bkz ClassAtomNoDash spec olarak). Çizgi, ilk veya son karakter ise kaçışsız olarak görünebilir (aksi takdirde, karakter aralığı ayırıcısı olarak yorumlanır).
Arnauld

5

Perl 6 , 102101100 bayt

Nwellnhof sayesinde -1 bayt!

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

Çevrimiçi deneyin!

Oldukça standart uygulama. Muhtemelen buna daha kısa regex tabanlı bir çözüm var, ama Perl 6'nın regex'i bir girişimde bulunacak kadar iyi bilmiyorum.


Sen kullanabilirsiniz maxyerine ?any(ve minyerine ?all).
nwellnhof

1
Değeri için, regex tabanlı bir çözüm Perl 5 regexes kullanarak 84 bayt veya 80 bayt olacaktır m:P5//. Ama ikisinin de cevap olarak göndermeye değer olduğunu düşünmüyorum.
nwellnhof

4

Java 10, 209208 bayt

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

@TFeld sayesinde -1 bayt .

Çevrimiçi deneyin.

Açıklama:

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

Güzel bir çözüm, ancak !!!ünlem işaretlerinin herhangi bir satır tarafından yazdırılamamasına rağmen doğrudur . Bunu bir test vakası olarak ekledim
Luke Stevens

@LukeStevens Ah, girişin beş satırdan biri için daima geçerli olduğunu varsaydım. Çözümümü değiştireceğim. Bu basit bir düzeltme (ancak bazı bayt ekleyecek ..)
Kevin Cruijssen

Neden (?i)diğer büyük harfler için kullanılmıyor?
Neil

@Neil Eğik çizgi için gereken kaçış nedeniyle 209 bayt .
Kevin Cruijssen

p==" "Bunun yerine önerp.equals(" ")
ceilingcat

4

Powershell, 87 bayt

Neil limanından Retina regex .

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

4

Jöle , 55 bayt

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

Çevrimiçi deneyin!

İlk satır, klavye satırlarının bir listesini verir ve ikincisi, program girişinin tek (veya sıfır) satırda bulunup bulunmadığını ve yazılamayan (örneğin QWE!@#) karakterlerin olup olmadığını kontrol eder .


3

C , 150 bayt

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

Çevrimiçi deneyin!

Herhangi bir ödül kazanmaz, ancak bu eğlenceli bir yaklaşımdır: klavyenin beş satırındaki 4 8 16 32 64karakterleri ve her geçersiz karakteri eşleştiririz 3. Dize VEYA dizedeki her karakter için değeri birlikte bitwise ve sonucun tatmin edip edilmediğini kontrol ederiz x&(x-1) == 0; bu, x2 veya sıfır güç olduğunda, yani xen fazla bir bit ayarlandığında doğrudur .


2

LUA , 282 262 259 270 bayt

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)

Çevrimiçi deneyin!


2

PHP, 98 bayt

Normal ifadeden daha kısa bir şey olmadığı için biraz üzgünüm. Muhtemelen en hızlı çözüm değil.

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

Pipo ile çalıştırın -Fveya çevrimiçi deneyin .


En kısa regex olmayan çözüm buldum (124 bayt; satır rahatlığı ve okuma kolaylığı için sekme):

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

1doğruluk, sahtelik kodu ile çıkar 0. İle boru olarak çalıştırın -R.
PHP 5.4 veya üst sürümünü gerektirir; daha eski PHP için, (+5 bayt) array(...)yerine kullanın veya şu 123 baytı PHP <7 ile kullanın:[...]
-nR

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

2

AWK , 163 119 113 bayt

Bu bir AWK cevabı, true için sayısal 1 dize, false için 0 dize döndürür. (AWK olarak yazılır ve etkileşimli kullanım için awk -f dosyası olarak çağrılır.)

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

Çevrimiçi deneyin!

Ancak, TAB karakterini özelliğin bir parçası olarak yazıldığı gibi (önemsiz uzantı) işlemez.


4
"Zorluklara yönelik tüm çözümler: (…) Kullanımdaki kazanan kriterler için ciddi bir yarışmacı olmalıdır. Örneğin, bir kod golf yarışmasına giriş golf oynamak gerekir ve bir hız yarışmasına giriş hızlı olmak için biraz girişimde bulunmalıdır ." - yardım merkezi Bu iki değişkeni açıklamaya gerek yoktur ve kesinlikle onları dizgiye dönüştürmeye gerek yoktur. Ve bir single printyeter: Çevrimiçi deneyin!
manatwork

Çözümlerin ciddi olması gerektiği yorumunuz geçerlidir ancak bu nedenle revize 05AB1E'den sonra herhangi bir çözümün, sonuçla eşleşemediği veya daha iyi sonuç veremedikleri için önemsiz olduğunu iddia ediyorum. Hem doğru hem de yanlış almak için iki kez baskı kullanamayacağınızı göremiyorum (kesinlikle giriş sonuna kadar dizeleri okuyan bir şey için). Ve ben o zaman optimal değil optimize dedim. Düşünceleriniz sayesinde 143 karaktere kadar düşürülebilir.
Phil F

Ve aslında tüm yol boyunca gitmek 121 karakter yapacak ...
Phil F

2
code-golf genel olarak en kısa kod için değil, diliniz için en kısa olan bir yarışmadır. Çözümünüzü geliştirebilirseniz, bunu yapmanızı öneririm
Jo King

@Jo King, açıklamalarınız için teşekkür ederim. gözden geçirilmiş kod şöyle olabilir / olabilir: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
Phil F

1

Bash , 119 bayt

"Okunabilir" çıktı sağlamak için bir yankı içerir. Baskı / çıktıyı eklemek için çevresine uygun bir kabuk (seçtiğiniz) sarıcı koyarsanız, 8 bayt kaydedebilirsiniz. Zorluğu okuduğumda, çözümün uygun bir çıkış göstergesi vermesi gerektiği anlaşılıyor, bu yüzden 119 bayt ile yapışıyorum.

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

Çevrimiçi deneyin!


Bash çözümünün ayrıca / / manatwork AWK çözümümün 113 bayta düşürülebileceği anlamına gelir.
Phil F
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.