एक पंक्ति कीबोर्ड


20

चुनौती

इस चुनौती का लक्ष्य यह निर्धारित करना है कि क्या दिए गए स्ट्रिंग को एक मानक यूके QWERTY कीबोर्ड की केवल एक पंक्ति का उपयोग करके टाइप किया जा सकता है।

यह है code golf, बाइट्स जीत में इतना कम समाधान!


आईओ

इनपुट 32-126 समावेशी ASCII दशमलव सीमा में शून्य या अधिक वर्णों का एकल स्ट्रिंग होगा। आप इस चुनौती के लिए मान सकते हैं कि खाली स्ट्रिंग के लिए कोई टाइपिंग की आवश्यकता नहीं है और इस प्रकार एक ही लाइन का उपयोग करके टाइप किया जा सकता है।

आप इनपुट को अपनी भाषा के लिए स्ट्रिंग, वर्णों की सूची या समकक्ष रूप में ले सकते हैं।

आउटपुट किसी भी स्ट्रिंग के लिए एक सत्य मान होना चाहिए जिसे एक पंक्ति का उपयोग करके टाइप किया जा सकता है, या एक के लिए गलत नहीं है।


कीबोर्ड लेआउट

मानक कीबोर्ड लेआउट नीचे क्या है, इसके बारे में किसी भी अस्पष्टता को स्पष्ट करने के लिए, वैकल्पिक ऊपरी कुंजी (शिफ्ट का उपयोग करके) सहित प्रत्येक पंक्ति पर उपलब्ध कुंजियों की एक सूची है।

  • पंक्ति 1
    • मानक: `1234567890-=
  • लाइन 2
    • मानक: qwertyuiop[]
  • पंक्ति 3
    • मानक: asdfghjkl;'#
    • अपरकेस: ASDFGHJKL
    • विशेष: कैप्स लॉक
  • पंक्ति 4
    • मानक: \zxcvbnm,./
    • वैकल्पिक: |<>?
    • अपरकेस: ZXCVBNM
    • विशेष: पारी
  • पंक्ति 5
    • विशेष: स्पेस बार

वैकल्पिक ऊपरी कुंजियों को केवल तभी दबाया जा सकता है जब शिफ्ट भी उसी लाइन पर हो, और अपरकेस कुंजी केवल कैप्स लॉक या शिफ्ट के माध्यम से एक्सेस की जा सकती है। आप वास्तव में केवल एक कीबोर्ड लाइन का उपयोग कर सकते हैं!


परीक्षण के मामलों

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

तो यह सख्ती से यूएस कीबोर्ड लेआउट है? (मुझे यूके लेआउट मिला है)।
ouflak

2
@ouflak इसके विपरीत, यह सख्ती से केवल यूके QWERTY कीबोर्ड लेआउट है
ल्यूक स्टीवंस

@ अर्नुलद हाँ मैंने किया, ध्यान देने के लिए धन्यवाद!
ल्यूक स्टीवंस

हाँ, मैंने दोनों को देखना शुरू किया और देखा कि आपका लेआउट मेरे यूके कीबोर्ड लेआउट का अनुसरण करता है, न कि मेरा यूएस। हम्मम ... आश्चर्य है कि मेरे ऑस्ट्रियाई व्यक्ति की तुलना में क्या दिखता है।
फुफकार

क्या हमें इनपुट को पात्रों की सूची के रूप में लेने की अनुमति है, या क्या इसे एक स्ट्रिंग होना चाहिए?
केविन क्रूज़सेन

जवाबों:


12

पायथन 2 , 130 123 121 115 बाइट्स

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

इसे ऑनलाइन आज़माएं!


पायथन 3 , 111 बाइट्स

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

इसे ऑनलाइन आज़माएं!

-4 बाइट्स, nedla2004 के लिए धन्यवाद


1
यदि आप पायथन 3 का उपयोग करने के इच्छुक हैं, तो आप इसे 111 बाइट्स तक ले सकते हैं
nedla2004

9

रेटिना 0.8.2 , 72 71 बाइट्स

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

इसे ऑनलाइन आज़माएं! स्पष्टीकरण: प्रत्येक प्रत्यावर्तन कीबोर्ड की एक अलग पंक्ति से मेल खाता है। (?i)पैटर्न के बीच में का कारण बनता है पैटर्न के पूरे बाकी मिलान किया जा केस-insensitively। संपादित करें: @KirillL के लिए 1 बाइट धन्यवाद सहेजा गया।


opqro-r-1 के लिए बदला जा सकता है । इसके अलावा, क्या आप पंक्ति 1 के लिए एक बैकटिक चरित्र भूल गए, मैं इसे नहीं देखता?
किरिल एल।

@KirillL। वूप्स, कॉपी / पेस्ट करते समय गलती से इसे चुनने से चूक गए होंगे, इसके लिए धन्यवाद।
नील

अच्छा [][...:)
mazzy

8

05AB1E , 66 47 बाइट्स

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

इनपुट को पात्रों की सूची के रूप में लेता है।

-19 बाइट्स @Emigna की बदौलत । पूरी तरह से भूल गए कि हमारे पास क्यूवर्टी-कीबोर्ड निरंतर भवन थे। : डी

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

ž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

जावास्क्रिप्ट (Node.js) , 99 98 95 बाइट्स

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

इसे ऑनलाइन आज़माएं!

-1 रेटिना जवाब में @Kirill L. की टिप्पणी से।
-3 धन्यवाद @ इस्माईल मिगुएल और @ अर्नुलड को उनके संयुक्त प्रयास के लिए।


आपके पास asdfghjklऔर ASDFGHJKLवहां क्यों है ? आप iध्वज का उपयोग क्यों नहीं करते हैं , जैसे x=>/.../i.test(x)?
इस्माइल मिगुएल

@IsmaelMiguel क्योंकि QWERTYUIOPregex द्वारा मिलान नहीं किया जाना चाहिए। अतिरिक्त चेक उन अपरकेस अक्षरों को सीधे रेगेक्स में कोड करने से अधिक होगा।
शायरु असाकोतो

कोई बात नहीं, यह छोटी गाड़ी है। x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)वही लंबाई है
इस्माइल मिगुएल

@IsmaelMiguel एक बिटवाइज़ का उपयोग करके |1 बाइट बचाता है।
अरनौलड

1
@IsmaelMiguel यह ECMAScript विनिर्देश का हिस्सा है। केवल 3 वर्ण जिन्हें वर्ण वर्ग के भीतर भागने की आवश्यकता है \ , ]और -( कल्पना में ClassAtomNoDash देखें )। यदि यह पहला या अंतिम वर्ण है (तो, इसे वर्ण सीमा विभाजक के रूप में व्याख्या किया गया है) यदि डैश या तो अनुपस्थित हो सकता है।
अरनौलद

5

पर्ल 6 , 102 101 100 बाइट्स

Nwellnhof के लिए -1 बाइट धन्यवाद!

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

इसे ऑनलाइन आज़माएं!

सुंदर मानक कार्यान्वयन। वहाँ शायद यह करने के लिए एक छोटा सा regex आधारित समाधान है, लेकिन मैं पर्ल 6 regex अच्छी तरह से एक प्रयास करने के लिए पर्याप्त पता नहीं है।


आप (और के बजाय ) maxका उपयोग कर सकते हैं । ?anymin?all
nwellnhof 13

1
इसके लायक क्या है, एक regex- आधारित समाधान 84 बाइट्स या 80 बाइट्स होगा जिसमें पर्ल 5 रेगेक्स का उपयोग किया गया है m:P5//। लेकिन मुझे नहीं लगता कि उनमें से कोई भी उत्तर के रूप में पोस्ट करने लायक है।
nwellnhof

4

जावा 10, 209 208 बाइट्स

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 बाइट @TFeld की बदौलत

इसे ऑनलाइन आज़माएं।

स्पष्टीकरण:

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

अच्छा समाधान है, लेकिन यह !!!विस्मयादिबोधक के लिए सही है क्योंकि विस्मयादिबोधक चिह्न किसी एक पंक्ति द्वारा मुद्रित होने में असमर्थ हैं। मैंने सिर्फ एक परीक्षण के मामले के रूप में जोड़ा है
ल्यूक स्टीवंस

@LukeSvvens आह, मैंने झूठा अनुमान लगाया कि इनपुट हमेशा पांच लाइनों में से एक के लिए मान्य होता है। मैं अपने समाधान को संशोधित करूंगा। यह एक साधारण सुधार है (लेकिन कुछ बाइट्स जोड़ देगा ..)
केविन क्रूज़सेन

(?i)अन्य अपरकेस अक्षरों के लिए उपयोग क्यों नहीं किया जाता है ?
नील

@ नील स्लैश के लिए आवश्यक भागने के कारण, यह 209 बाइट्स भी है
केविन क्रूज़सेन

के p==" "बजाय सुझावp.equals(" ")
छत


4

जेली , 55 बाइट्स

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

इसे ऑनलाइन आज़माएं!

पहली पंक्ति कीबोर्ड लाइनों की एक सूची देती है और दूसरी यह जांचती है कि क्या प्रोग्राम इनपुट एकल (या शून्य) लाइनों पर समाहित है और इसमें कोई वर्ण नहीं हैं जिन्हें टाइप नहीं किया जा सकता (जैसे QWE!@#)।


3

सी , 150 बाइट्स

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

इसे ऑनलाइन आज़माएं!

यह कोई पुरस्कार नहीं जीतेगा, लेकिन यह एक मजेदार तरीका है: हम कीबोर्ड की पांच पंक्तियों पर पात्रों को मैप करते हैं 4 8 16 32 64, और प्रत्येक अमान्य चरित्र को 3। हम एक साथ स्ट्रिंग में प्रत्येक वर्ण के लिए बिटवाइज़ या वैल्यू करते हैं, और जाँचते हैं कि क्या परिणाम संतुष्ट करता है x&(x-1) == 0, जो कि x2 या शून्य की शक्ति होने पर सत्य है, अर्थात जब भी xअधिकांश एक बिट सेट में हो।



2

PHP, 98 बाइट्स

मैं थोड़ा दुखी हूं कि regex से कम कुछ नहीं है। यह शायद सबसे तेज़ समाधान नहीं है।

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

ऑनलाइन के साथ पाइप के रूप में चलाएं -Fया इसे आज़माएं


सबसे कम गैर-रेगेक्स समाधान मुझे मिला (124 बाइट्स; पढ़ने की सुविधा के लिए लाइनब्रेक और टैब):

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

1सच्चाई के लिए कोड के साथ बाहर निकलता है , 0झूठे के लिए। साथ पाइप के रूप में चलाएँ -R
PHP 5.4 या बाद की आवश्यकता है; पुराने PHP के लिए, (+5 बाइट्स) के array(...)बजाय का उपयोग करें या PHP <7 में इन 123 बाइट्स का उपयोग करें :[...]
-nR

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

2

AWK , 163 119 113 बाइट्स

यह एक AWK उत्तर है, सत्य के लिए एक संख्यात्मक 1 स्ट्रिंग, झूठी के लिए 0 स्ट्रिंग देता है। (इंटरैक्टिव उपयोग के लिए AWK awk -f फ़ाइल के रूप में लिखा गया है।)

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

इसे ऑनलाइन आज़माएं!

हालांकि, टीएबी चरित्र को लिखित (तुच्छ विस्तार) के रूप में नहीं संभालता है जैसा कि कल्पना का हिस्सा नहीं है।


4
"चुनौतियों का सभी समाधान होना चाहिए: (…) उपयोग में जीतने के मानदंड के लिए एक गंभीर दावेदार बनें। उदाहरण के लिए, कोड गोल्फ प्रतियोगिता में प्रवेश के लिए गोल्फ होना आवश्यक है, और गति प्रतियोगिता में प्रवेश के लिए तेज़ होने का प्रयास करना चाहिए। । " - सहायता केंद्र उन 2 चर को घोषित करने की आवश्यकता नहीं है और निश्चित रूप से उन्हें तार बनाने की कोई आवश्यकता नहीं है। और एक एकल printपर्याप्त है: इसे ऑनलाइन आज़माएं!
11

आपकी टिप्पणी कि समाधान गंभीर होना चाहिए, लेकिन मैं यह तर्क दूंगा कि संशोधित 05AB1E के बाद कोई भी समाधान इसलिए अप्रासंगिक है क्योंकि वे परिणाम से मेल नहीं खा सकते थे या बेहतर नहीं थे। मैं यह नहीं देखता कि आप कैसे सच और गलत दोनों को प्राप्त करने के लिए दो बार प्रिंट का उपयोग नहीं कर सकते हैं (निश्चित रूप से कुछ के लिए जो इनपुट के अंत तक तार पढ़ता है)। और मैंने कहा कि अनुकूलित समय पर इष्टतम नहीं है। अपने विचारों के लिए धन्यवाद इसे 143 वर्णों तक कम किया जा सकता है।
फिल एफ

और वास्तव में सभी तरह से इसे 121 अक्षर बनाएंगे ...
फिल एफ

2
कोड-गोल्फ समग्रतम कोड के लिए एक प्रतियोगिता नहीं है, लेकिन आपकी भाषा के लिए सबसे छोटा है। यदि आप अपने समाधान में सुधार कर सकते हैं, तो मैं ऐसा करने का सुझाव
Jo King

@ राजा, आपके स्पष्टीकरण के लिए धन्यवाद। संशोधित कोड / हो सकता है: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
फिल एफ

1

बैश , 119 बाइट्स

"पठनीय" आउटपुट प्रदान करने के लिए एक प्रतिध्वनि शामिल है। यदि आप प्रिंट / आउटपुट को शामिल करने के लिए इसके चारों ओर शेल (आपकी पसंद) का एक उपयुक्त आवरण डालते हैं, तो आप 8 बाइट्स बचा सकते हैं। चुनौती का मेरा पढ़ना बताता है कि समाधान को एक उपयुक्त आउटपुट संकेत देना चाहिए ताकि मैं 119 बाइट्स के साथ रहूं।

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

इसे ऑनलाइन आज़माएं!


सलाह दी जाए कि बैश समाधान का अर्थ है मेरा / @ मैनटवर्क AWK समाधान 113 बाइट्स तक कम हो सकता है।
फिल एफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.