คีย์บอร์ดหนึ่งบรรทัด


20

ความท้าทาย

เป้าหมายของความท้าทายนี้คือการพิจารณาว่าสตริงที่กำหนดสามารถพิมพ์โดยใช้เพียงหนึ่งบรรทัดของคีย์บอร์ดมาตรฐาน UK QWERTY

นี่คือcode golfทางออกที่สั้นที่สุดในหน่วยไบต์!


IO

อินพุตจะเป็นสตริงเดี่ยวที่มีศูนย์หรือมากกว่าหนึ่งตัวในช่วงทศนิยม ASCII ที่ครอบคลุม 32-126 คุณอาจจะถือว่าความท้าทายนี้ที่สตริงว่างไม่จำเป็นต้องพิมพ์และสามารถพิมพ์โดยใช้บรรทัดเดียว

คุณสามารถรับอินพุตเป็นสตริงรายการอักขระหรือรูปแบบที่เทียบเท่าสำหรับภาษาของคุณ

เอาต์พุตควรเป็นค่าจริงสำหรับสตริงใด ๆ ที่สามารถพิมพ์โดยใช้บรรทัดเดียวหรือเป็นเท็จสำหรับสิ่งที่ไม่สามารถทำได้


รูปแบบแป้นพิมพ์

เพื่อชี้แจงความคลุมเครือใด ๆ เกี่ยวกับรูปแบบแป้นพิมพ์มาตรฐานด้านล่างนี้คือรายการของคีย์ที่มีอยู่ในแต่ละบรรทัดรวมถึงปุ่มบนอื่น ๆ (เข้าถึงได้โดยใช้ shift)

  • บรรทัด 1
    • มาตรฐาน: `1234567890-=
  • บรรทัด 2
    • มาตรฐาน: qwertyuiop[]
  • บรรทัดที่ 3
    • มาตรฐาน: asdfghjkl;'#
    • ตัวพิมพ์ใหญ่: ASDFGHJKL
    • พิเศษ: Caps Lock
  • บรรทัด 4
    • มาตรฐาน: \zxcvbnm,./
    • สำรอง: |<>?
    • ตัวพิมพ์ใหญ่: ZXCVBNM
    • พิเศษ: Shift
  • บรรทัดที่ 5
    • พิเศษ: Space Bar

ปุ่มกดด้านบนสำรองสามารถกดได้ถ้า Shift อยู่ในบรรทัดเดียวกันเท่านั้นและปุ่มตัวพิมพ์ใหญ่สามารถเข้าถึงได้ผ่าน Caps Lock หรือ Shift เท่านั้น คุณสามารถใช้แป้นพิมพ์เพียงบรรทัดเดียวเท่านั้นจริงๆ!


กรณีทดสอบ

            -> 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 สหราชอาณาจักร
ลุคสตีเวนส์

@Annauld ใช่ฉันทำขอบคุณสำหรับการสังเกต!
ลุคสตีเวนส์

ใช่ฉันเริ่มดูทั้งคู่และสังเกตว่าเลย์เอาต์ของคุณดูเหมือนว่าจะเป็นไปตามรูปแบบแป้นพิมพ์ของสหราชอาณาจักรไม่ใช่ US US อืม ... สงสัยว่าสิ่งที่คนออสเตรียของฉันดูเหมือนจะเปรียบเทียบกัน
ouflak

เราได้รับอนุญาตให้รับอินพุตเป็นรายการอักขระหรือต้องเป็นสตริงหรือไม่?
Kevin Cruijssen

คำตอบ:


12

Python 2 , 130 123 121 115 ไบต์

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

ลองออนไลน์!


Python 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)อยู่ตรงกลางของรูปแบบทำให้รูปแบบที่เหลือทั้งหมดถูกจับคู่แบบตัวพิมพ์ใหญ่ - เล็ก แก้ไข: บันทึก 1 ไบต์ขอบคุณ @KirillL


opqrสามารถเปลี่ยนเป็นo-rสำหรับ -1 นอกจากนี้คุณลืมอักขระ backtick สำหรับ Line 1 ฉันไม่เห็นหรือไม่
Kirill L.

@KirillL อ๊ะต้องพลาดโดยไม่ได้ตั้งใจในการเลือกเมื่อคัดลอก / วางขอบคุณที่ตรวจพบ
Neil

nice [][...:)
mazzy

8

05AB1E , 66 47 ไบต์

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

รับอินพุตเป็นรายการของอักขระ

-19 ไบต์ขอบคุณที่@Emigna ลืมไปโดยสิ้นเชิงว่าเรามีคีย์บอร์ดในตัว : D

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ž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 ไบต์

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

ลองออนไลน์!

-1 จากความคิดเห็นโดย @Kirill L. ในคำตอบของ Retina
-3 ขอบคุณ @Ismael Miguel และ @Arnauld สำหรับความพยายามร่วมกัน


ทำไมคุณถึงมีasdfghjklและASDFGHJKLอยู่ในนั้น? ทำไมคุณไม่ใช้iธงเช่นx=>/.../i.test(x)นี้
Ismael Miguel

@IsmaelMiguel เพราะQWERTYUIOPไม่ควรจับคู่กับ regex การตรวจสอบพิเศษจะมีค่าใช้จ่ายมากกว่าการเข้ารหัสตัวอักษรตัวพิมพ์ใหญ่เหล่านั้นลงใน regex โดยตรง
Shieru Asakoto

ไม่เป็นไรมันเป็นรถ x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)มีความยาวเท่ากัน
Ismael Miguel

@IsmaelMiguel การใช้ bitwise |จะช่วยประหยัด 1 ไบต์
Arnauld

1
@IsmaelMiguel นี่เป็นส่วนหนึ่งของข้อมูลจำเพาะ ECMAScript เพียง 3 ตัวอักษรที่จะต้องหนีออกมาภายในชั้นเรียนตัวอักษร\ , ]และ-(ดูClassAtomNoDashในสเปค) เครื่องหมายขีดกลางอาจปรากฏเป็นไม่เปิดใช้งานหากเป็นอักขระตัวแรกหรืออักขระสุดท้าย (มิฉะนั้นจะถูกตีความว่าเป็นตัวคั่นช่วงอักขระ)
Arnauld

5

Perl 6 , 102 101 100 ไบต์

-1 ไบต์ขอบคุณ nwellnhof!

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

ลองออนไลน์!

ใช้งานมาตรฐานสวย อาจมีวิธีการแก้ปัญหา regex ที่สั้นกว่านี้ แต่ฉันไม่ทราบว่า regex Perl 6 ดีพอที่จะพยายาม


คุณสามารถใช้maxแทน?any(และminแทน?all)
nwellnhof

1
สำหรับสิ่งที่คุ้มค่าเป็นทางออกที่ regex-based จะเป็น84 ไบต์หรือ 80 ไบต์ใช้ Perl 5 regexes m:P5//กับ แต่ฉันไม่คิดว่าทั้งคู่มีค่าโพสต์เป็นคำตอบ
nwellnhof

4

Java 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

คำตอบที่ดี แต่มันกลับเป็นจริงสำหรับ!!!แม้จะมีเครื่องหมายอัศเจรีย์ไม่สามารถพิมพ์ด้วยบรรทัดเดียว ฉันเพิ่งเพิ่มว่าเป็นกรณีทดสอบ
ลุคสตีเวนส์

@LukeStevens อ่าฉันคิดว่าข้อมูลที่ป้อนนั้นถูกต้องเสมอสำหรับหนึ่งในห้าบรรทัด ฉันจะแก้ไขทางออกของฉัน เป็นการแก้ไขแบบง่าย ๆ (แต่จะเพิ่มจำนวนไบต์ .. )
Kevin Cruijssen

ทำไมไม่ใช้(?i)ตัวอักษรตัวพิมพ์ใหญ่ตัวอื่น?
Neil

@Neil เพราะการหลบหนีที่จำเป็นสำหรับการเฉือนก็ยัง 209 ไบต์
Kevin Cruijssen

แนะนำp==" "แทนp.equals(" ")
ceilingcat


4

เยลลี่ , 55 ไบต์

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

ลองออนไลน์!

บรรทัดแรกให้รายการของบรรทัดคีย์บอร์ดและบรรทัดที่สองตรวจสอบว่าอินพุตโปรแกรมมีอยู่ในบรรทัดเดียว (หรือศูนย์) และไม่มีอักขระที่ไม่สามารถพิมพ์ได้ (เช่นQWE!@#)


3

C , 150 ไบต์

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

ลองออนไลน์!

มันจะไม่ชนะรางวัลใด ๆ แต่นี้เป็นวิธีที่สนุกเรา map ตัวอักษรบนห้าแถวของแป้นพิมพ์เพื่อและทุกตัวอักษรที่ไม่ถูกต้อง4 8 16 32 64 3เรา bitwise หรือค่าสำหรับตัวละครแต่ละตัวในสตริงด้วยกันและตรวจสอบว่าผลลัพธ์เป็นไปตามx&(x-1) == 0หรือไม่ซึ่งเป็นจริงเมื่อxกำลังของ 2 หรือศูนย์คือเมื่อใดก็ตามที่xมีชุดบิตมากที่สุด


2

LUA , 282 262 259 270 ไบต์

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)

ลองออนไลน์!


2

PHP, 98 ไบต์

ฉันเศร้าเล็กน้อยที่ไม่มีอะไรสั้นไปกว่า regex อาจไม่ใช่วิธีที่เร็วที่สุด

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

ทำงานเป็นท่อที่มี-Fหรือลองออนไลน์


วิธีแก้ปัญหาที่ไม่ใช่ regex สั้นที่สุดที่ฉันพบ (124 bytes; linebreak และแท็บเพื่อความสะดวกในการอ่าน):

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

ออกด้วยรหัส1เพื่อความจริง0สำหรับความเท็จ -Rทำงานเป็นท่อด้วย
ต้องใช้ PHP 5.4 ขึ้นไป สำหรับ PHP รุ่นเก่าใช้array(...)แทน[...](+5 ไบต์)
หรือใช้ 123 ไบต์เหล่านี้ด้วย-nRใน PHP <7:

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]*$/||/^ *$/}

ลองออนไลน์!

อย่างไรก็ตามไม่ได้จัดการอักขระ TAB ตามที่เขียน (ส่วนขยายเล็กน้อย) ซึ่งไม่ใช่ส่วนหนึ่งของข้อมูลจำเพาะ


4
"ทางออกสำหรับความท้าทายทั้งหมดควร: (... ) เป็นผู้แข่งขันที่จริงจังสำหรับเกณฑ์การชนะที่ใช้ตัวอย่างเช่นการเข้าร่วมการแข่งขันกอล์ฟรหัสจำเป็นต้องมีการตีกอล์ฟ ." - ศูนย์ช่วยเหลือไม่จำเป็นต้องประกาศตัวแปร 2 ตัวนั้นและไม่จำเป็นต้องทำให้เป็นสตริง และคนเดียวprintก็พอ: ลองออนไลน์!
จัดการ

ความคิดเห็นของคุณว่าการแก้ปัญหาอย่างจริงจังนั้นถูกต้อง แต่ฉันขอยืนยันว่าการแก้ปัญหาใด ๆ ดังนั้นหลังจากการแก้ไข 05AB1E นั้นไม่เกี่ยวข้องเนื่องจากพวกเขาไม่สามารถจับคู่หรือผลลัพธ์ที่ดีกว่า ฉันไม่เห็นวิธีที่คุณไม่สามารถใช้การพิมพ์สองครั้งเพื่อให้ได้ทั้งจริงและเท็จ (แน่นอนสำหรับสิ่งที่อ่านสตริงจนกระทั่งสิ้นสุดอินพุต) และฉันก็บอกว่าไม่เหมาะที่สุดในเวลา ขอบคุณที่ความคิดของคุณสามารถลดได้ถึง 143 ตัวอักษร
Phil F

และในความเป็นจริงไปตลอดทางจะทำให้มันเป็นตัวละคร 121 ตัว ...
ฟิล F

2
code-golfไม่ใช่การแข่งขันสำหรับรหัสที่สั้นที่สุดโดยรวม แต่สั้นที่สุดสำหรับภาษาของคุณ หากคุณสามารถปรับปรุงวิธีแก้ปัญหาของคุณได้ฉันขอแนะนำให้ทำเช่นนั้น
Jo King

@Jo King ขอบคุณสำหรับคำชี้แจงของคุณ รหัสแก้ไขจะ / อาจจะ: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
ฟิล F

1

Bash , 119 ไบต์

รวมเสียงสะท้อนเพื่อให้เอาต์พุต "อ่านได้" หากคุณใส่ wrapper ที่เหมาะสมของ shell (ตัวเลือกของคุณ) ไว้รอบ ๆ มันเพื่อรวม print / output คุณสามารถประหยัด 8 bytes การอ่านความท้าทายของฉันชี้ให้เห็นว่าทางออกควรส่งสัญญาณออกที่เหมาะสมดังนั้นฉันจึงติดกับ 119 ไบต์

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

ลองออนไลน์!


ได้รับคำแนะนำวิธีการแก้ปัญหา Bash ยังหมายถึงวิธีการแก้ปัญหา / @ manatwork AWK ของฉันอาจลดลงถึง 113 ไบต์
Phil F
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.