พิมพ์คำได้อย่างง่ายดาย


30

การแข่งขันครั้งนี้จบลงแล้ว

ผู้ชนะคือ CJam ที่มี 22 ตัวอักษรเต้นคำตอบของTwiNightโดยตัวละครตัวหนึ่ง ขอแสดงความยินดีเดนนิส !

การกล่าวถึงอันทรงเกียรตินั้นไปถึงFalkoผู้คลั่งไคล้ในการนำเข้าฟรี

.


ไม่นานมานี้ฉันต้องการทราบว่าฉันสามารถใช้สมาร์ทโฟนรุ่นใหม่ด้วย Nokia 3310 ของฉันได้อย่างไรและในขณะที่บางคำตอบดีมากฉันยังไม่ทันติดตาม! บางทีฉันควรใช้แนวทางที่แตกต่างและไม่ควรเขียนคำใด ๆ ที่พิมพ์ไม่สะดวก

เราจะเรียกชิ้นส่วนของข้อความที่พิมพ์ได้อย่างง่ายดายหากไม่มีตัวอักษรสองตัวติดต่อกันบนปุ่มเดียวกันบนแป้นพิมพ์โทรศัพท์ตามรูปแบบมาตรฐาน:

คีย์บอร์ดโทรศัพท์


งานของคุณ

งานของคุณคือการเขียนโปรแกรม / ฟังก์ชั่นที่ยอมรับสตริงsจาก stdin / เป็นพารามิเตอร์และส่งกลับค่าความจริงหากsสามารถพิมพ์ได้ง่ายและค่าเท็จเป็นอย่างอื่น ข้อมูลที่ป้อนจะประกอบด้วยตัวอักษรและช่องว่างเล็ก ๆ เท่านั้นและรับประกันว่าจะไม่ว่างเปล่า!

เกณฑ์การให้คะแนน

นี่คือ codegolf ดังนั้นจำนวนตัวละครจึงต่ำที่สุด

งบนำเข้าจะไม่ถูกนับคะแนนสุดท้ายของคุณดังนั้นหากคุณเคยต้องการที่จะใช้std::set_symmetric_difference, liftM4หรือitertools.combinationsในรหัสของคุณตอนนี้เป็นเวลา!

-3หากซอร์สโค้ดของคุณพิมพ์ได้ง่ายสมมติว่าทุกอย่างที่ไม่ใช่ตัวอักษรอยู่บนปุ่ม 0 ท้ายที่สุดฉันอาจส่งข้อความโค้ดถึงเพื่อน ๆ !

Testcases

ต่อไปนี้เป็นตัวอย่างทดสอบเล็กน้อยเพื่อตรวจสอบว่ารหัสของคุณใช้งานได้ตามที่ต้องการหรือไม่:

"x" -> True
"aardvark" -> False
"ardvark" -> True
"flonk" -> False

"im codegolfing all day long" -> False
"i indulge in minimizing bytecount" -> True

"havent heard from you in a long time" -> False
"your silence was of undue permanence" -> True

"how are  you" -> False
"how are you" -> True

มีความสุขในการเล่นกอล์ฟ!


ช่องว่างสองช่องติดต่อกันไม่ดีหรือไม่?
Martin Ender

@ MartinBüttnerใช่! ควรเพิ่ม testcase สำหรับสิ่งนั้น
Flonk

9
ฉันมี Nokia dumbphone ถ้าฉันกด space สองครั้งฉันจะได้หมายเลข 0
overactor

1
คำถามที่เกี่ยวข้อง: ประดิษฐ์รูปแบบแป้นพิมพ์ของโทรศัพท์ซึ่งเพิ่มคะแนนบางส่วนโดยขึ้นอยู่กับว่าพิมพ์คำที่เกิดขึ้นบ่อยที่สุดได้ง่ายเพียงใด
justinpc

1
@ jpcooper เหมือนสองคนที่กล่าวถึงที่นี่ ? ฉันใช้ 8pen และชอบมากยกเว้นว่ากระจกโทรศัพท์ของฉันร้อนขึ้นใช้ (จากการติดต่อไม่ใช่จากการทำงานของ CPU) และค่าสัมประสิทธิ์แรงเสียดทานทำให้ยากต่อการใช้งานนาน การใช้ S-ปากกาในหมายเหตุ 3 เป็นมากขึ้น :)
Eben

คำตอบ:


6

CJam, 34 31 27 22 ตัวละคร

1l{'h-_9/-D+3/X\:X^*}/

ลองออนไลน์

ตัวอย่างการวิ่ง

$ cjam <(echo "1l{'h-_9/-D+3/X\:X^*}/") <<< 'aardvark'; echo
0
$ cjam <(echo "1l{'h-_9/-D+3/X\:X^*}/") <<< 'ardvark'; echo
66000

มันทำงานอย่างไร

1l                         " Push a R := 1 and read a line L from STDIN.                  ";
                           " Initialize X := 1. (implicit)                                ";
  {                  }/    " For each character C of L, do the following:                 ";
    'h-                    "     C -= 'h'                                                 ";
       _9/-D+3/            "     Y := (C - C / 9 + 13) / 3                                ";
               X\  ^*      "     R *= X ^ Y                                               ";
                 :X        "     X := Y                                                   ";
                           " Print R. (implicit)                                          ";

พื้นหลัง

แกนหลักของรหัสประกอบด้วยการใช้แผนที่FกับอักขระCแต่ละตัวของสตริงอินพุตเพื่อให้รูปภาพของสัญลักษณ์บนคีย์เดียวกันตรงกัน ฉันพบแผนที่ที่เหมาะสมโดยสังเกตจากสิ่งต่อไปนี้:

แผนที่T: C ↦ (C - 'h') + 13แปลงสตริงS: = "abcdefghijklmnopqrstuvxyz"ดังนี้:

[-59   6  7  8   9 10 11  12 13 14  15 16 17  18 19 20  21 22 23 24  25 26 27  28 29 30 31]

กุญแจ0ที่จะ6มันจะพอเพียงที่จะแบ่งT (C)โดย3แต่เราต้องใช้การจัดเรียงของการแก้ไขบางอย่างเพื่อให้ตัวละครในs , T , V , YและZ

แผนที่D: C ↦ (C - 'h') / 9แปลงสตริงSเป็นอาร์เรย์ต่อไปนี้:

[ -8   0  0  0   0  0  0   0  0  0   0  0  0   0  0  0   0  1  1  1   1  1  1   1  1  1  2]

สิ่งนี้จะแก้ไขผลหารของs , t , v , yและzโดยไม่กระทบต่อผู้อื่น

ในที่สุดแผนที่F: C ↦ (T (C) - D (C)) / 3แปลงสตริงSดังนี้:

[-17   2  2  2   3  3  3   4  4  4   5  5  5   6  6  6   7  7  7  7   8  8  8   9  9  9  9]

สิ่งที่เหลืออยู่ก็คือการเปรียบเทียบตัวละครที่ต่อเนื่องกัน เพื่อจุดประสงค์นั้นเรา XOR F (C) ที่มีภาพของตัวละครก่อนหน้า - สำหรับคนแรกเรา XOR F (C) ที่มี1 (ค่าเริ่มต้นของตัวแปรX ) ซึ่งไม่มี preimage - และคูณผลลัพธ์ทั้งหมด

ผลิตภัณฑ์ที่จะ falsy ถ้าหากหนึ่งในปัจจัยที่เป็นศูนย์คือถ้าหากตัวละครทั้งสองติดต่อกันมีภาพเดียวกันโดยเรนไฮน์


ฉันคิดว่าไบต์ (ไม่ใช่ตัวอักษร) นับสำหรับอันนี้คือ 54

@Optimizer ฉันคิดว่าcode-golf tag wiki บอกว่า bytes

คำตอบนี้ไม่มีอักขระที่ไม่ใช่ ASCII อีกต่อไป
Dennis

@professorfish แท็ก wiki เป็นเพียงค่าเริ่มต้น หากความท้าทายระบุตัวอักษรมันเป็นตัวละคร
Martin Ender

27

Python 2 - 80, 68, 64, 61, 58, 50, 48, 45, 44 42

แม้ว่าตอนนี้มันจะไร้สาระนิดหน่อย แต่ฉันก็ยังคงใช้ประโยชน์จากการนำเข้าห้องสมุดฟรีแม้กระทั่ง__builtin__ห้องสมุด:

from numpy import diff as D
from pprint import pprint as P
from __builtin__ import all as A
from __builtin__ import raw_input as I
from __builtin__ import bytearray as B

ดังนั้นบรรทัดสั้น ๆ ดังต่อไปนี้เท่านั้นที่นับรวมกับความยาวโค้ด:

P(A(D([(o-o/112-o/59)/3for o in B(I())])))

ให้เครดิตกับ Markuz สำหรับแนวคิดที่เกี่ยวข้องinput()! ความท้าทายในการนำเข้าฟรีเหล่านี้มักจะแนะนำให้คุณรู้จักกับห้องสมุดที่รู้จักน้อยกว่า ;)


ทางเลือกที่ใช้เฉพาะoperatorห้องสมุด ( 98, 83 79):

from operator import ne as n
K=[(ord(c)-1-(c>'p')-(c>'w'))/3for c in input()]
print all(map(n,K[1:],K[:-1]))

ฉันจะหยุดที่นี่ แต่คุณสามารถเล่นกอล์ฟรุ่นนี้ต่อไปได้sys , pprintและห้องสมุดอื่น ๆ ...


ทางเลือกที่ไม่มีห้องสมุด (105):

s=input()
n=lambda c:(ord(c)-1-(c>'p')-(c>'w'))/3
print all([n(s[i])!=n(s[i+1])for i in range(len(s)-1)])

และอีกครั้งเราโพสต์โซลูชั่นเดียวกันใน Ruby และ Python อย่างอิสระ ดูเหมือนว่าเวลานี้คุณจะชนะ ;) ... คุณไม่สามารถบันทึก 4 ไบต์ด้วยการกำหนดord(c)ตัวแปร (พูดo) แล้วลบออกc/112และc/119แทนที่จะเป็นบูลีนหรือไม่?
Martin Ender

@ MartinBüttner: ใช่นาน ๆ ครั้ง Python สามารถเอาชนะ Ruby ได้ น่าเสียดายที่ฉันไม่สามารถกำหนดตัวแปรภายในlambdaนิพจน์ที่ง่ายดาย เมื่อ[(o-1-o/112-o/119)/3for o in map(ord,s)]ฉันลงเอยด้วย 80 ไบต์อีกครั้ง
Falko

ฉันเข้าใจแล้ว ป่วยปรับปรุงใหม่ว่า! : D
Martin Ender

ที่น่าประทับใจมาก. และคุณยังสามารถบันทึกได้ 3 ไบต์ด้วยfrom sys import argv as sโดยใช้s[1]แทนinput()
Markuz

การนำเข้าinputจาก__builtin__นั้นก็ดีกว่า: D ประหยัดอีก Byte
Markuz

20

Ruby Regex (รสชาติยอดนิยม) 106 83 ไบต์

เพราะ regex

^(?!.*(  |[abc]{2}|[def]{2}|[ghi]{2}|[jkl]{2}|[mno]{2}|[p-s]{2}|[tuv]{2}|[w-z]{2}))

ฉันเพิ่งตัดพ่อค้าคนกลาง (Ruby) และทำให้นี่เป็นวิธีการแก้ปัญหา regex บริสุทธิ์ ใช้งานได้หลากหลายรสชาติและค้นหาการจับคู่ได้หากสตริงไม่มีอักขระต่อเนื่องสองตัวบนปุ่มเดียวกัน


คุณไม่สามารถวางสิ่งนั้นไว้{2}ด้านนอกตัวสำรองได้โดยประหยัด 22 ไบต์ใช่ไหม
Niet the Dark Absolute

1
@NiettheDarkAbsol แต่น่าเสียดายที่ไม่ใช่เพราะมันสามารถเลือกทางเลือกที่แตกต่างกันสำหรับการทำซ้ำสองครั้ง
Martin Ender

อ่าแน่นอน ฉันรู้ว่ามีเหตุผล XD
Niet the Dark Absolute

ความรุ่งโรจน์สำหรับวิธีการแก้ปัญหาที่อ่านได้เข้าใจกอล์ฟ!
GreenAsJade

12

Bash + coreutils, 49

tr a-z $[36#8g7e9m4ddqd6]7778888|grep -Pq '(.)\1'

ส่งคืนโค้ดออก 1 สำหรับ TRUE และ 0 สำหรับ FALSE:

$ for s in "x" "aardvark" "ardvark" "flonk" "im codegolfing all day long" "i indulge in minimizing bytecount" "havent heard from you in a long time" "your silence was of undue permanence" "how are  you" "how are you"; do echo "./3310.sh <<< \"$s\" returns $(./3310.sh <<< "$s"; echo $?)"; done
./3310.sh <<< "x" returns 1
./3310.sh <<< "aardvark" returns 0
./3310.sh <<< "ardvark" returns 1
./3310.sh <<< "flonk" returns 0
./3310.sh <<< "im codegolfing all day long" returns 0
./3310.sh <<< "i indulge in minimizing bytecount" returns 1
./3310.sh <<< "havent heard from you in a long time" returns 0
./3310.sh <<< "your silence was of undue permanence" returns 1
./3310.sh <<< "how are  you" returns 0
./3310.sh <<< "how are you" returns 1
$ 

ดีมาก! นี่จะเป็น 46 ตัวอักษรใน Perl: perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")มันพิมพ์ 1 สำหรับจริงและไม่มีอะไรที่เป็นเท็จ
hmatt1

@chilemagic ไปข้างหน้าและโพสต์คำตอบ perl :) อย่าลืมที่จะเพิ่มหนึ่งคะแนนสำหรับการใช้พารามิเตอร์บรรทัดคำสั่ง -p (ตามระเบียบของ code-golf)
Digital Trauma

ฉันคิดว่าฉันสามารถหาทางที่จะทำให้สั้นลงaaadddgggjjjmmmpppptttwwwwแต่ฉันก็ยอมแพ้
Ben Jackson

2
@ BenJackson ฉันคิดออกวิธี เราสามารถใช้สตริงของอักขระที่แตกต่างกันได้ - 11122233344455566667778888จะทำ โดยเบส 36 เข้ารหัส 19 หลักแรกของหมายเลขนี้เราสามารถบันทึก 1 อักขระ!
Digital Trauma

9

APL (Dyalog), 24 23

~∨/2=/⌊¯13⌈.21-.31×⎕AV⍳⍞

∧/2≠/⌊¯13⌈.21-.31×⎕AV⍳⍞

คำอธิบาย

: ใช้อินพุตสตริงจากหน้าจอ
⎕AV: นี่คือเวกเตอร์อะตอมซึ่งเป็นสตริงพื้นฐานของอักขระทั้งหมดที่ APL รู้จักซึ่งแน่นอนรวมถึงตัวอักษรตัวเล็กทั้งหมด (ดัชนี 18 ~ 43) และช่องว่าง (ดัชนี 5)
: IndexOfฟังก์ชัน สำหรับฟังก์ชั่นมากมายใน APL ที่รับอาร์กิวเมนต์สเกลาร์หนึ่งหรือสองตัวคุณสามารถป้อนอาเรย์แทนสเกลาร์ได้ - APL จะทำการวนซ้ำให้คุณ ดังนั้นส่งกลับอาร์เรย์ของดัชนีที่เป็นตัวเลข .21-.31×: ครั้งที่ 0.31 แล้วลบออกจาก 0.21 นี่คือเคล็ดลับเล็ก ๆ น้อย ๆ ที่แผนที่ตัวอักษรบนคีย์เดียวกัน (โดยเฉพาะ PQRS) ไปยังหมายเลขเดียวกัน (เมื่อกลมลงไปจำนวนเต็ม) ยกเว้น Z ซึ่งได้รับการแมปไปยังกลุ่มของตัวเอง
¯13⌈: maxมี -13 นี่จะนำ Z กลับมาที่กลุ่มด้วย WXY
: ปัดเศษลงเป็นจำนวนเต็ม
2≠/: Pairwise-. ส่งกลับอาร์เรย์แบบบูลสำหรับแต่ละคู่ที่ต่อเนื่องกัน
∧/: และรวมรายการทั้งหมดของอาร์เรย์ผลลัพธ์


ฉันกำลังจะโพสต์สิ่งนี้ แต่คุณเอาชนะฉันได้ กุญแจประณาม Z! คุณยังสามารถโกน 1 ถ่านโดยการพูด∧/2≠/(ทุกคู่ที่ต่อเนื่องกันจะพิมพ์ด้วยปุ่มที่แตกต่างกัน) แทน~∨/2=/(ไม่มีการพิมพ์คู่ที่ต่อเนื่องกันบนคีย์เดียวกัน) APL FTW !!!
Tobia

ใช่ tkx ฉันคิดว่า "ฉันควรจะสามารถกำจัด 1 ถ่านที่นี่ทำไมฉันทำมันไม่ได้ OMGGGG !!!" แต่ฉันต้องไปเรียนดังนั้นฉันจะโพสต์สิ่งที่ฉันมี และใช่คำสาปแช่ง Z น่าเสียดายที่ฉันอยู่ในโทรศัพท์ของฉันดังนั้นฉันจึงไม่สามารถแก้ไขได้จนกระทั่งในภายหลัง
TwiNight

และฉันคิดอย่างมีสติเกี่ยวกับกฎของ De Morgan และยังไม่สามารถเข้าใจได้ ... How dumb
TwiNight

1
โชคดีที่ส่งข้อความนี้ให้เพื่อนของคุณ ;)
Thane Brimhall

มันดูน่าสนใจมาก มีวิธีใดบ้างที่จะลองใช้รหัสนี้โดยไม่ต้องซื้อ Dyalog APL interpreter? ล่ามออนไลน์ฉันมักจะใช้ดูเหมือนจะไม่เข้าใจภาษา ...
เดนนิส

7

Perl - 44

นี่คือการดัดแปลง Perl ของคำตอบ @ DigitalTrauma ที่โพสต์เมื่อได้รับอนุญาต ลบออก 2 ตัวละครด้วย @KyleStrand

y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/

43 ตัวอักษร + 1 สำหรับการ-pตั้งค่าสถานะ เป็นเช่นเดียวกับy/// tr///มันพิมพ์1จริงและไม่มีอะไรที่เป็นเท็จ ฉันสามารถโพสต์คำอธิบายโดยละเอียดหากมีการร้องขอ

ตัวอย่างการเรียกใช้:

perl -pE'y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/' <(echo "x")

Perl - 81

$s=join"]{2}|[",qw(abc def ghi jkl mno p-s tuv w-z);say/^(?!.*(  |[$s]{2}))/?1:0

+1 สำหรับการ-nตั้งค่าสถานะ มันทำงานโดยใช้joinเพื่อสร้าง regex (เช่นเดียวกับมาร์ติน ) ซึ่งโกนของไม่กี่ไบต์

ตัวอย่างการเรียกใช้:

perl -nE'$s=join"]{2}|[",qw(abc def ghi jkl mno p-s tuv w-z);say/^(?!.*(  |[$s]{2}))/?1:0' <(echo "your silence was of undue permanence")

คุณไม่สามารถโกนอักขระสองตัวออกจากโซลูชัน Perl ได้โดยการปล่อยaและzไม่ถูกแปลหรือไม่? y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/นอกจากนี้สิ่งนี้จะไม่จัดการช่องว่างใช่ไหม
Kyle Strand

... โอ้ถูกต้องสองช่องว่างในแถวเป็นอักขระที่เหมือนกันสองตัวในแถว ความผิดฉันเอง.
Kyle Strand

@ KyleStrand โทรที่ดีในการปล่อยaและzยังคงเหมือนเดิม อัปเดตคำตอบ!
hmatt1

4

JavaScript - 159 156 ไบต์

function g(s){p=n=-1;for(i=0;i!=s.length;i++){p=n;n=s.charCodeAt(i);n-=97;if(n>17)n--;if(n>23)n--;if(p==-1)continue;if(~~(p/3)==~~(n/3))return 0;}return 1;}

ส่งคืน 1 สำหรับความจริงและ 0 สำหรับความเท็จ

ถ้าเพียงฉันจะกำจัดคำหลัก


อย่างน้อยคุณสามารถกำจัดพื้นที่ว่างบางส่วนและถ้าเป็นเช่นนั้น :) 141:function g(s){p=n=-1;for(i=0;i<s.length;i++){p=n;n=s.charCodeAt(i)-97;n>17&&n--;n>23&&n--;if(~p)continue;if(~(p/3)==~(n/3))return 0}return 1}
เครื่องมือเพิ่มประสิทธิภาพ

คุณใช้สิ่งที่น่าสนใจมากมายในคำตอบของคุณซึ่งฉันไม่เคยเห็นมาก่อน ฉันมักจะเขียนด้วยภาษาซีพลัสพลัส แต่ฉันคิดว่าฉันจะให้ช็อตเด็ด JS เพื่อทดสอบออนไลน์ได้เร็วขึ้น
Lozzaaa

ฉันพบที่นี่วันนี้และคิดว่าฉันจะให้มันยิง ความพยายามครั้งต่อไปของฉันจะดีกว่า: D
Lozzaaa

คุณสามารถทำให้รหัสตัวละครของคุณสั้นโดยการแทนที่ในสำหรับวงด้วย!= <
ProgramFOX

ใช่นั่นคือการเพิ่มประสิทธิภาพของเครื่องมือเพิ่มประสิทธิภาพ :) มารยาทในการใช้คำแนะนำของผู้คนในคำตอบของฉันคืออะไร ตอนนี้มีรายการ JavaScript อื่นที่ฉันสามารถเอาชนะได้โดยยอมรับการแก้ไขเหล่านั้น
Lozzaaa

4

c, 74 ไบต์

main(c,d,r){for(;~(c=getchar());r*=d!=c/3,d=c/3)c-=--c/'p'*(c-'k')/7;c=r;}

ส่งคืนสถานะทางออกที่ไม่ใช่ศูนย์สำหรับ TRUE และ 0 สำหรับ FALSE:

$ for s in "x" "aardvark" "ardvark" "flonk" "im codegolfing all day long" "i indulge in minimizing bytecount" "havent heard from you in a long time" "your silence was of undue permanence" "how are  you" "how are you"; do echo "./3310 <<< \"$s\" returns $(./3310 <<< "$s"; echo $?)"; done
./3310 <<< "x" returns 40
./3310 <<< "aardvark" returns 0
./3310 <<< "ardvark" returns 216
./3310 <<< "flonk" returns 0
./3310 <<< "im codegolfing all day long" returns 0
./3310 <<< "i indulge in minimizing bytecount" returns 72
./3310 <<< "havent heard from you in a long time" returns 0
./3310 <<< "your silence was of undue permanence" returns 232
./3310 <<< "how are  you" returns 0
./3310 <<< "how are you" returns 8
$ 

คุณสามารถบันทึก 3 ไบต์โดยเปลี่ยนwhileเป็นfor(;c=~getchar();d=c/3)และอีกหนึ่งไบต์โดยเปลี่ยนชื่อแรกifเป็น?:โอเปอเรเตอร์
Allbeert

@Allbeert - ขอบคุณ วงเล็บรอบc=getchar()จะต้อง แต่เพราะมีความสำคัญสูงกว่า~ =ยังฉันจะใช้อีกสองไบต์ :)
บาดเจ็บทางดิจิตอล

สำหรับบิตสุดท้ายสิ่งที่ไม่ชอบexit(d!=c/3);แทนที่จะif(d==c/3)exit(0);ทำงานหรือไม่

@professorfish ที่จะทำให้ออกจากจุดนั้นโดยไม่มีเงื่อนไขซึ่งฉันไม่ต้องการ
Digital Trauma

คุณสามารถบันทึกอักขระหนึ่งตัวด้วย r * = d ^ c / 3
เล่นแร่แปรธาตุ

3

Ruby 1.8, 89 83 81 78 ไบต์

p$*[0].chars.map{|c|c=c[0];(c-c/?p-c/?w-1)/3}.each_cons(2).map{|a,b|a!=b}.all?

นี่คือการส่งอีก สำหรับความอัปยศของฉันมันเป็น regex :(

สิ่งนี้ใช้สตริงผ่านอาร์กิวเมนต์บรรทัดคำสั่งและพิมพ์บูลีน

สำหรับอัลกอริทึมฉันกำลังเลื่อนตัวอักษรทีpละหนึ่งและzสองและจากนั้นฉันตรวจสอบว่าไม่มีการชนกันหลังจากการหารจำนวนเต็มด้วย 3

PS: นี่เป็นครั้งแรกที่การใช้ Ruby 1.8 ทำให้โค้ดสั้นลง (เนื่องจากวิธีที่สั้นกว่าในการรับรหัสอักขระ)



3

JavaScript (ES6) 66 74

F=s=>[...s].every(c=>[...' adgjmptw'].map(x=>s+=c<x,w=s,s=0)|s!=w)

วงด้านในจะค้นหากลุ่มของตัวละครแต่ละตัว แนวคิดคือ 'ลด' แต่ 'แผนที่' สั้นกว่า ลูปด้านนอกเปรียบเทียบกลุ่มของตัวอักษรต่อเนื่องและออกด้วยเท็จหากพวกเขาเท่ากัน

ทดสอบในคอนโซล Firefox / Firebug

;["x","aardvark","ardvark","flonk","im codegolfing all day long",
"i indulge in minimizing bytecount","havent heard from you in a long time",
"your silence was of undue permanence","how are  you","how are you"]
.forEach(x=>console.log(x + ' -> ' + F(x)))

เอาท์พุต

x -> true
aardvark -> false
ardvark -> true
flonk -> false
im codegolfing all day long -> false
i indulge in minimizing bytecount -> true
havent heard from you in a long time -> false
your silence was of undue permanence -> true
how are  you -> false
how are you -> true

คุณสามารถทำได้.someแทนทุก ๆ เพราะแม้ว่ามันจะล้มเหลวเพียงครั้งเดียวคำตอบก็เป็นเท็จ
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer someและeveryเป็นที่แลกเปลี่ยนกันเล่นซอกับเงื่อนไข แต่ที่นี่เพียงแค่ใส่someแทนeveryจะไม่ทำงานลอง
edc65

อืมคุณพูดถูก ฉันต้องเข้าใจตรรกะของคุณก่อน
เครื่องมือเพิ่มประสิทธิภาพ

โปรดอย่า[...s].everyกังวลถ้าฉันเริ่มใช้เคล็ดลับนี้ในสนามกอล์ฟของฉัน :)
เครื่องมือเพิ่มประสิทธิภาพ

2

Perl, 83 ไบต์

$_=<>;chop;map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}split//;die 1

การละเมิดอย่างมากของ $ _ ใน Perl


1
ในขณะที่คุณสามารถสังเกตเห็นได้รับอนุญาตให้ส่งพารามิเตอร์บรรทัดคำสั่งไปยังล่ามเพียงคุณต้องนับพารามิเตอร์พิเศษ (ขั้นต่ำเปลือยจำเป็นในการเข้าถึงรหัส-eใน Perl เป็นฟรี.) 71 perl -nlaF -e 'map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}@F;die 1'ตัวละครทางเลือกที่มีพารามิเตอร์บรรทัดคำสั่ง:
จัดการ

@ ทำงานที่คุณไม่ต้องการ-lแต่มันดูดี!
hmatt1

@chilemagic ผมก็พยายามที่จะทำซ้ำเทียบเท่ารหัสต้นฉบับดังนั้นฉันเพิ่มแทน-l chopแต่แน่นอนคุณพูดถูก
จัดการ

ขอบคุณ @ manatwork ฉันไม่ได้คิดที่จะใช้ประโยชน์จากตัวเลือกบรรทัดคำสั่งสำหรับ Perl
mcreenan

2

สองงานมีความยุ่งยากใน Python การตรวจจับโซ่และการกำหนดกลุ่ม ทั้งสองสามารถได้รับความช่วยเหลือโดยใช้ numpy แต่มันไม่ได้อยู่ในห้องสมุดมาตรฐาน

Python 2 (เฉพาะไลบรารีมาตรฐาน) - ฟังก์ชัน 59 ตัวอักษร

from itertools import imap as M
from __builtin__ import bytearray as A, all as E
from operator import ne as D, not_ as N
from re import S, sub as X, search as F

# 68
#def f(s):
# g=[(n-n/115-n/61)/3for n in A(s)]
# return E(M(D,g,g[1:]))

# 67 with regex via regex
#f=lambda s:N(F(X('(\S)(.)',r'|[\1-\2]{2}','  acdfgijlmopstvwz'),s))

# 59 slightly optimized ordinal classifier and regex sequence detector
f=lambda s:N(F(r'(.)\1',A((n-n/23-n/30)/3for n in A(s)),S))

# 69 using itertools.groupby
#from itertools import groupby as G
#from __builtin__ import sum as S, len as L
#f=lambda s:N(S(L(A(g))-1for _,g in G((n-n/115-n/61)/3for n in A(s))))

Python 2 (เฉพาะไลบรารีมาตรฐาน) - 53 chars stdin เพื่อออกจากค่า

ที่นี่ฉันดูถูกความจริงที่ว่าissubclass(bool,int)ดังนั้นการเปลี่ยนall()เพื่อให้any()ฉันได้รับค่าทางออกที่ถูกต้องโกนออกnot()จากค่าตอบแทน การลบค่าใช้จ่ายของฟังก์ชันทำให้เวอร์ชันของ regex มีขนาดล้าหลัง

from itertools import groupby as G, imap as M
from __builtin__ import bytearray as A, any as E
from __builtin__ import raw_input as I
from sys import exit as Q
from operator import eq as S

g=[(n-n/23-n/30)/3for n in A(I())]
Q(E(M(S,g,g[1:])))

2

J - 42 ตัวอักษร

ฟังก์ชั่นการรับสายด้านขวา

*/@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)

ก่อนอื่นเราจะแมปตัวอักษร ( u:97+i.26) เป็นตัวเลข 0 ถึง 25 ตัวละครอื่น ๆ ทั้งหมด (รวมถึงช่องว่าง) ไปที่ 26 ( i.) จากนั้นเราแมป ( {~) องค์ประกอบสามรายการแรกจับคู่กับคีย์แรกสามต่อไปถึงคีย์ถัดไปและอื่น ๆ ผ่านปุ่มของแผ่นโทรศัพท์ทำให้แน่ใจว่าได้แมปพื้นที่ / เครื่องหมายวรรคตอนอื่น ๆ ไปยังคีย์แยกในตอนท้าย . ( 4 3 4 1,~5#3เท่ากับ3 3 3 3 3 4 3 4 1และI.เปลี่ยนให้เป็นอาเรย์ 27 รายการโดยที่สามตัวแรกเป็นคีย์ 1 ฯลฯ ) จากนั้นเราตรวจสอบความไม่เท่าเทียมกันแบบคู่ ( 2~:/\) และผลลัพธ์ทั้งหมดเข้าด้วยกัน ( */)

   */@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.) 'i indulge in minimizing bytecount'
1
   f =: */@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)
   f 'im codegolfing all day long'
0
   f '*/@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)'  NB. no -3 bonus :(
0

2

แร็กเก็ต, 119

(define(f t)(for*/and([s(map ~a'(abc def ghi jkl mno pqrs tuv wxyz))][i s][j s])(not(regexp-match(format"~a~a"i j)t))))

Ungolfed (combinatoric regexing):

(define(f t)
  (for*/and([s (map ~a '(abc def ghi jkl mno pqrs tuv wxyz))]
            [i s]
            [j s])
    (not (regexp-match (format "~a~a" i j) t))))

1

JavaScript - 152

ไม่ใช่ผู้ชนะ แต่ฉันให้มันเป็นนัด Beats @Lozzaaa 4 ไบต์ ณ เวลาที่โพสต์ :)

function m(a){c="abc-def-ghi-jkl-mno-pqrstuv-wxyz";j=a.split("");for(z in j)if(j[z]=Math.floor(c.indexOf(j[z])/4),0!=z&&j[z-1]==j[z])return 0;return 1};

ผ่านการทดสอบทั้งหมด
ใช้ประโยชน์จากการที่ JS ขาดการพิมพ์เพื่อสร้างอาเรย์หลายประเภทและใช้ประโยชน์จาก indexOf ที่ส่งคืน -1 เพื่อสนับสนุนพื้นที่

การใช้งาน:

m("string here")

ถือว่าตัวอักษรและช่องว่างเล็กและใหญ่เท่านั้น ส่งคืน 1 สำหรับจริง, 0 สำหรับเท็จ

บางทีถ้าฉันรู้ ES6 ฉันสามารถลองท้าทายที่สอง ...


"ถ้าเพียง ... " - คุณเห็นคำตอบของฉันหรือไม่ : P
เครื่องมือเพิ่มประสิทธิภาพ

ใช่ฉันทำ. ฉันยังไม่รู้ ES6 (ยัง) เศร้า อย่างไรก็ตามสิ่งนี้น่าสนใจที่จะทำ
DankMemes

ใช่วิธีแก้ปัญหาของคุณใช้วิธีการที่น่าสนใจ
เครื่องมือเพิ่มประสิทธิภาพ

1

ES6, JavaScript 89 70 ตัวอักษร

ฉันรู้ว่ามันไม่ได้เป็นผู้ชนะเพราะเมื่อมาถึงการดำเนินการที่สะดวกสบายเช่นการรับค่า ASCII ของตัวละคร JS ทำให้มีจำนวนมาก bloat ( .charCodeAt())

N=s=>[...s].every(c=>l-(l=(c.charCodeAt()-(c>"r")-(c>"y")-1)/3|0),l=1)

เปิดใช้งานใน Web Console ของ Firefox ล่าสุด

การใช้งาน:

N("testing if this works")

ฟังก์ชั่นส่งกลับทั้งจริงหรือเท็จ

แก้ไข : Golfed มากโดยใช้[...x].everyเคล็ดลับที่ได้เรียนรู้จาก @ edc65 (ขอบคุณ!)

ฉันจะลองเล่นกอล์ฟให้มากขึ้น :)


0

GML (ภาษาของผู้สร้างเกม), 149

s=argument0p=n=-1for(i=0;i<string_length(s);i++){p=n;n=string_char_at(s,i)-97;x=n>17&&n--;x=n>23&&n--‌​;if(!p)x=1if(!(p/3)=!(n/3))x=0}show_message(x)

0

Python 3 - 152 ตัวอักษร

ไม่ใช่ที่สั้นที่สุดที่ฉันสามารถไปได้ แต่ตอนนี้จะทำ

k=['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz',' ']
x=input()
l=2>1
for i in range(len(x)-1):
 for j in k:
  if x[i+1] in j and x[i] in j:l=1>2
print(l)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.