ตรวจสอบว่าตัวอักษรของคำตามลำดับตัวอักษร


37

เขียนฟังก์ชั่น / โปรแกรมที่รับสายอักขระตัวพิมพ์เล็ก / ตัวพิมพ์ใหญ่ [A-Za-z] เป็นอินพุตเพื่อตรวจสอบว่าตัวอักษรที่ปรากฏขึ้นนั้นไม่ซ้ำกันและเรียงตามตัวอักษร (ไม่สนใจตัวพิมพ์เล็กและใหญ่) เอาท์พุทจะต้องเป็นจริงถ้าพวกเขาเป็นเอกลักษณ์และตามลำดับตัวอักษรและเท็จถ้าไม่

ที่นี่มีตัวอย่างบางส่วน

a                           true
abcdefGHIjklmnopqrSTUVWXyz  true     
aa                          false
puz                         true
puzz                        false
puzZ                        false
puZ                         true
PuZ                         true
pzu                         false
pzU                         false
abcdABCD                    false
dcba                        false

หากคุณต้องการให้เรียกใช้โปรแกรมของคุณในทุกคำของ wordlist เช่นนี้และโพสต์คำที่น่าสนใจ =)

คะแนน

จำนวนไบต์ต่ำสุดชนะ


3
กรณีทดสอบที่อ่อนแอ (ดูความคิดเห็นของฉันเกี่ยวกับคำตอบ PHPของRichard A )
manatwork

ตัวอักษรวนซ้ำหรือไม่ ควรzaเป็นคุณค่าจริงหรือไม่
MayorMonty

ไม่มีตัวอักษรเริ่มต้นด้วยและจบลงด้วยa z
ข้อบกพร่อง

คุณควรมีกรณีทดสอบบางอย่างที่ไม่เรียงตามตัวอักษร
โจคิง

1
@JoKing ฉันเพิ่มบางอย่าง
ข้อบกพร่อง

คำตอบ:


28

CJam, 8 ไบต์

lel_$_&=

นี่คือชุดทดสอบสำหรับทุกตัวอย่างในการทดสอบ ผลตอบแทน0หรือ1(ซึ่งเป็นเท็จและความจริงตามลำดับใน CJam)

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

คำอธิบาย

l        "Read input.";
 el      "Convert to lower case.";
   _$    "Get a copy and sort it.";
     _&  "Remove duplicates (by computing the set intersection with itself).";
       = "Check for equality with original (lower case) word.";

21

Regex (ทุกรส), 55 ไบต์

บางคนไม่คิดว่า regex เป็นภาษาโปรแกรม แต่มันถูกใช้มาก่อนและไม่ใกล้เคียงที่จะสั้นที่สุด

^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$

ฉันได้เพิ่มหนึ่งไบต์สำหรับการiตั้งค่าสถานะ (case-insensitive) สิ่งนี้ตรงไปตรงมามากและอาจสั้นลงกว่าเดิม

หากไม่อนุญาตให้ใช้ regex เพียงอย่างเดียวคุณสามารถใช้โปรแกรมRetinaขนาด 56 ไบต์ที่Martin Büttnerแนะนำ:

i`^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$

การทำเช่นนี้ในรายการคำที่ลิงก์ด้านบนให้ผล 10 6 ตัวอักษรคำตามลำดับตัวอักษร

["ผู้แต่ง", "เกือบ", "เริ่มต้น", "ต้นกำเนิด", "bijoux", "การตรวจชิ้นเนื้อ", "ชิมแปนซี", "chinos", "chintz", "ผี"]


2
คุณสามารถใช้Retinaแทน ES6 ถ้ามีคนบ่นว่า regex ไม่ใช่ภาษา:i`^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$
Martin Ender

@ MartinBüttnerฉันลืมเรื่องเรตินา ขอบคุณ!
NinjaBearMonkey

@ MartinBüttnerตาม META ( meta.codegolf.stackexchange.com/questions/2028/… ) Regexesสามารถ 'มองเห็น' ได้ค่อนข้างจะเป็นภาษาโปรแกรม
Ismael Miguel

@IsmaelMiguel ฉันรู้ และในความเป็นจริงแล้วคำจำกัดความนั้นถูกเลือกมาโดยเฉพาะเพื่อให้แน่ใจว่ามันจะไม่ออกกฎ แต่บางคนก็ยังบ่นอยู่เสมอเพราะคุณไม่สามารถใช้ regex เหมือนภาษาอื่นได้
Martin Ender

@ MartinBüttnerผู้ที่บ่นสามารถไปที่ที่เรียกว่า META แล้วมองหามันได้ ทำไมไม่มีใครไปเยี่ยมชมสถานที่สวยงามที่เต็มไปด้วยคำถามที่แก้ปัญหาส่วนใหญ่
Ismael Miguel

19

Python 3, 44 ไบต์

*s,=input().lower()
print(sorted(set(s))==s)

วิธีการง่ายๆ - ตรวจสอบความเป็นเอกลักษณ์ตรวจสอบความเรียง


คุณช่วยอธิบายอะไรได้*s,=...บ้าง?
ข้อบกพร่อง

@flawr สิ่งนี้เรียกว่า 'การมอบหมายที่ติดดาว' ในรหัสนี้มันเพียงแค่แปลงทางด้านขวาลงในรายการ s=list(input().lower())มันเป็นเช่นเดียวกับ
Jakube

1
@flawr ดังที่ Jakube กล่าวที่นี่เป็นเพียงการแปลงอินพุตเป็นรายการตัวอักษร โดยทั่วไปจะเป็นไวยากรณ์ที่ได้รับมอบหมายเป็นพิเศษซึ่งช่วยให้คุณทำสิ่งที่ต้องการx,*y = [1, 2, 3, 4]ซึ่งกำหนด 1 ถึงxและเพื่อ[2, 3, 4] y
Sp3000

@ mbomb007 *s,= is list(s) ... link
Sp3000

คุณสามารถทำได้{*s}แทนที่จะset(s)บันทึก 2 ไบต์
mbomb007

12

> <> , 52 42 39 ไบต์

0>i:1+?v1n;
? )'`':/'@'v
0v?){:-<'`'/;n

คำถามประเภทนี้เป็นหนึ่งในไม่กี่ประเภทที่> <> ค่อนข้างสบายใจเนื่องจากเราต้องจัดการกับตัวอักษรละหนึ่งตัวเท่านั้น

คำอธิบาย

อย่าหลงทาง! มีห่อมากมายที่นี่

0            Push 0. We'll be mapping a-z to 1-26, so 0 will be smaller than everything

(loop)
i            Read a char of input
:1+? 1n;     If there's no more input, print 1
:'`')?       If the char is bigger than backtick...
  '`'          Push backtick  (which is one before 'a'), else...
  '@'          Push an @ sign (which is one before 'A')
-            Subtract, mapping a-z to 1-26
:{)?         If the new char is bigger than the previous char...
               Repeat from the beginning of the loop, else...
  0n;          Print 0

โซลูชันก่อนหน้า 42 ไบต์

0i:1+?v1n;n0/\!
?)'`':/'@'v
? ){:-<'`'/ vv

สิ่งที่น่าสนใจคือแม้ว่าจะมีฟังก์ชั่นเหมือนกัน แต่เป็นทางเลือก

0i:1+?v1n;n0\/!
?)'`':/'@'v
? ){:-<'`'/ ^^

(การเปลี่ยนแปลงอยู่ในลูกศรและกระจกทางด้านขวาสุด)

ให้ผลลัพธ์ที่ไม่ถูกต้องเนื่องจากล่ามของ> <> ใช้ Python defaultdict สิ่งที่เกิดขึ้นคือการข้ามผ่านช่องว่างในตอนท้ายของแถวที่สองจะมีการวาง 0s ลงในช่องว่างโดยปริยายเมื่อ> <> พยายามเข้าถึงเซลล์ สิ่งนี้จะยุ่งกับ?แทรมโพลีนแบบมีเงื่อนไขที่จุดเริ่มต้นของแถวเดียวกันเนื่องจาก 0s ที่เพิ่งวางใหม่ถูกข้ามไปแทนที่จะvเป็นตอนท้าย


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

9

Haskell, 52 ไบต์

import Data.Char
and.(zipWith(>)=<<tail).map toLower

การใช้งาน: (and.(zipWith(>)=<<tail).map toLower) "abcd"ผลลัพธ์Trueใด


9

C, 67 65 57 54 (52) ตัวอักษร

f(char*s){int c,d=0;for(;(c=*s++)&&(c&~32)>(d&~32);d=c);return!c;}

สั้นกว่าเล็กน้อย:

f(char*s){int c,d=0;for(;(c=*s++)&&(c&~32)>d;d=c&~32);return!c;}

และสั้นกว่า:

f(char*s){int d=32;for(;(*s|32)>d;d=*s++|32);return!*s;}

นี่คือการทดสอบเล็กน้อย: http://ideone.com/ZHd0xl

หลังจากคำแนะนำล่าสุดที่นี่ยังคงเป็นรุ่นที่สั้นกว่าสองรุ่น:

// 54 bytes
f(char*s){int d=1;for(;(*s&=95)>d;d=*s++);return!*s;}

// 52, though not sure if valid because of global variable
d;f(char*s){d=1;for(;(*s&=95)>d;d=*s++);return!*s;}

รหัสนี้ขึ้นอยู่กับความจริงว่าใน ASCII ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แตกต่างกันเพียงบิตที่ 5 (32) ซึ่งฉันกรองออก ดังนั้นนี่อาจไม่ทำงานกับการเข้ารหัสอื่น ๆ อย่างเห็นได้ชัด

แก้ไข: รุ่นล่าสุดตั้งบิตที่ 5 ให้|32สั้นกว่า&~32เสมอ


ใช้ความรู้ด้านโดเมนเพื่อจัดการปัญหาเรื่องความไวของตัวเคส
RomSteady

บันทึก 2 for(;(*s&=95)>d;d=*s++);โดยการเปลี่ยนสำหรับวงด้วย และคุณสามารถเริ่มต้นdที่จะ1ได้โดยไม่ต้องเปลี่ยนแปลงผลการประหยัดอีก 1 ดู.
AShelly

1
ฉันไม่แน่ใจว่าสิ่งนี้ถือว่าถูกต้องตามกฎหมายในการเล่นกอล์ฟหรือไม่ แต่ใช้d;f(char*s){d=32;for...}งานได้ประกาศdโดยนัยว่าเป็น int ระดับโลก (ซึ่งใน GCC เป็นคำเตือน - "คำจำกัดความข้อมูลไม่มีประเภทหรือประเภทการจัดเก็บ" - แต่ไม่ใช่ข้อผิดพลาด) วิธีนี้ช่วยประหยัดสองไบต์
wchargin

อืมหืมไม่ได้คิดอย่างนั้น คำแนะนำของคุณเปลี่ยนสตริงเดิมแม้ว่า แต่อะไรก็ตามมันคือรหัสกอล์ฟ: D นอกจากนี้ฉันไม่แน่ใจเกี่ยวกับคำใบ้ของ WChargin ว่าเป็นตัวแปรระดับโลกจะไม่ได้เป็นส่วนหนึ่งของฟังก์ชั่น
เฟลิกซ์ Bytow

1
ทำไมไม่เริ่มต้นdในforลูปแทนคำสั่งของตัวเอง? ;วิธีการที่คุณบันทึก
Josh

6

ทับทิม, 33

->s{c=s.upcase.chars
c==c.sort|c}

ตรวจสอบเพื่อดูว่าอักขระเฉพาะที่เรียงลำดับนั้นเหมือนกันกับอักขระทั้งหมดหรือไม่


1
คิดว่าคุณสามารถทำให้สั้นลงได้อีกสักนิดด้วยc==c.sort|c
ประวัติศาสตร์

โอ้ฉันชอบสิ่งนี้มันฉลาด ขอบคุณ
britishtea

5

Javascript (ES5), 101

function i(s){b=0;l=''.a
s.toUpperCase().split('').forEach(function(c){if(c<=l)b=1
l=c})
return!b}

ปรับปรุงเป็น 87 โดย edc95:

โหวตขึ้นความคิดเห็นของเขา :)

function i(s){return!s.toUpperCase().split(l='').some(function(c){return(u=l,l=c)<=u})}

Btw กรณีทดสอบใน OP ปัจจุบันเป็นจริงถ้าโปรแกรมตรวจสอบเฉพาะคำสั่งโดยไม่สนใจ


ฉันยังไม่สามารถเขียนความเห็นได้ดังนั้นฉันจะตอบข้อสังเกตที่นี่:

@ edc65:ขอบคุณ! ฉันพยายามเขียนใหม่โดยใช้some()แต่ฉันไม่สามารถหาวิธีแก้ปัญหาที่สั้นกว่านี้ได้แม้ว่ามันจะดูเหมือนว่ามันจะช่วยให้ฉันสามารถกำจัดตัวแปร superflous b คุณต้องพิมพ์ "return" สองครั้ง (เช่นเดียวกันreduce()) และคุณ ไม่สามารถส่งกลับผลลัพธ์ของการเปรียบเทียบโดยตรงได้เนื่องจากอักขระตัวสุดท้ายต้องได้รับการบันทึกหลังจากการเปรียบเทียบกับมัน

@ edc65:นั่นเป็นการใช้ประโยชน์จากเครื่องหมายคอมม่าสำหรับ 87! ฉันแก้ไขมันเป็นคำตอบเพื่อให้มองเห็นได้ชัดเจนขึ้น


นั่นเป็นความคิดที่ดีกว่าของฉัน การใช้. some อาจดียิ่งขึ้น (52 กับ ES6)
edc65

คุณสามารถลบช่องว่างระหว่างreturnและ!bเพื่อบันทึกอักขระ
ProgramFOX

เช่นเดียวกับการดูแลพื้นที่สีขาว 96:function i(s){b=0;l='';s.toUpperCase().split('').forEach(function(c){if(c<=l)b=1;l=c});return!b}
edc65

เช่นเดียวกันกับนักกอล์ฟมากขึ้น 92:function i(s){s.toUpperCase(b=0).split(l='').forEach(function(c){if(c<=l)b=1;l=c});return!b}
edc65

1
ใช้บางส่วน (หรือทุกคะแนนเท่ากัน), 87:function i(s){return!s.toUpperCase().split(l='').some(function(c){return(u=l,l=c)<=u})}
edc65

4

Haskell, 90 ไบต์

จัดหาฟังก์ชั่น f :: String -> Bool

import Data.List
import Distribution.Simple.Utils
f l=g$lowercase l
g l=sort l==l&&l==nub l

การใช้งาน (สมมติว่ามันถูกบันทึกเป็น golf.hs) ...ใช้เพื่อแทนที่ghciข้อความโหลดอย่างละเอียด

$ ghci golf.hs
...
*Main> f "as"
...
True
*Main> f "aa"
False

หากใครบางคนมีlowercaseวิธีการที่สั้นกว่านี้import Distribution.Simple.Utilsโปรดแสดงความคิดเห็น


1
ใช้map toLowerจากData.Charแทนlowercase
nimi

1
นอกจากนี้: คุณสามารถลบพารามิเตอร์lที่fได้เช่นf=g.lowercase(หรือf=g.map toLowerหากคุณเปลี่ยนเป็นtoLower) ภายในgหนึ่งการเปรียบเทียบก็เพียงพอแล้ว: g l=nub(sort l)==l.
nimi

4

Wolfram Mathematica, 49 37 ไบต์

f[x_]:=(l=Characters[ToLowerCase[x]];Union[l]==l)

วิธีแก้ปัญหา PS Shorter โดย Martin Büttner:

Union[l=Characters@ToLowerCase@#]==l&

2
#⋃#==#&@*Characters@*ToLowerCase
alephalpha

1
@alephalpha นั่นสวยมาก!
Martin Ender

4

J, 17 ไบต์

ตรวจสอบว่า/:~สตริงที่เรียงตัวพิมพ์เล็กเท่ากับสตริง-:nub ตัวพิมพ์เล็ก~.

   (/:~-:~.)@tolower

   NB. testing with the example inputs
   ((/:~-:~.)@tolower) every (1$'a');'abcdefGHIjklmnopqrSTUVWXyz';'aa';'puz';'puzz';'puzZ';'puZ';'PuZ'
1 1 0 1 0 0 1 1

ดังที่ใน J สตริง "ยาว" 1 อักขระที่แสดงเป็นสตริงปกติ (พร้อมเครื่องหมายคำพูด) เป็นเพียงอะตอมตัวละครไม่ใช่สตริงจริงที่ฉันจัดรูปแบบอินพุตให้เหมาะสมดังนั้นอินพุตทั้งหมดจะเป็นสตริงจริง (ในตัวอย่างด้านบนที่ฉันใช้1$'a')


4

MATLAB, 29 27 ไบต์

ตอนนี้สำหรับหนึ่งซับซึ่งยังทำให้รู้สึกนอกรหัสกอล์ฟ

เป็นฟังก์ชั่นที่ไม่ระบุชื่อ (ใช้เป็นo('yourstring'))

o=@(s)all(diff(lower(s))>0)

ฉันคิดว่าฟังก์ชั่นนี้อธิบายตัวเองได้ดีเพราะมันอ่านเหมือนโฆษณาในหนังสือพิมพ์

รุ่นก่อนหน้า (29 ไบต์):

all(diff(lower(input('')))>0)

การป้อนข้อมูลจะต้องแสดงระหว่างเครื่องหมายเช่น''Potato'


4

Brachylogขนาด 3 ไบต์

ḷ⊆Ạ

ลองออนไลน์!

เพรดิเคตสำเร็จหากอินพุตตรงตามข้อกำหนดที่ระบุไว้และล้มเหลวหากไม่ได้พิมพ์true.หรือfalse.รันเป็นโปรแกรม

       The input,
ḷ      lowercased,
 ⊆     is a not-necessarily-contiguous sub-list of
  Ạ    "abcdefghijklmnopqrstuvwxyz".

รุ่นแรกที่ฉันสร้างขึ้นโดยไม่อ้างอิงตัวอักษรอย่างชัดเจน:

Brachylogขนาด 4 ไบต์

ḷ≠.o

ลองออนไลน์!

        The input,
ḷ       lowercased,
 ≠      in which every character is distinct,
  .     is the output variable,
   o    which sorted,
        is still the output variable.

3

J, 21 ตัวอักษร

ยาวเกินไป อาร์กิวเมนต์ต้องมีอันดับ1กล่าวคือต้องเป็นสตริงหรือเวกเตอร์

*/@(<=~.;/:~)@tolower
  • tolower y- yในกรณีที่ต่ำกว่า
  • /:~ y- yเรียงตามคำศัพท์
  • ~. y- จำนวนของyนั่นคือyด้วยการลบรายการที่ซ้ำกัน
  • x ; y- xและyใส่ลงในกล่องแล้วตัดแบ่ง
  • < y- yใส่ลงในกล่อง
  • x = y- เมื่อเทียบกับองค์ประกอบที่ชาญฉลาดด้วยx y
  • (< y) = (~. y) ; (/:~ y)- เวกเตอร์ที่ระบุว่าyเท่ากับ nub และจัดเรียงเอง
  • */ y- ผลิตภัณฑ์ของรายการของyหรือตรรกะและถ้ารายการนั้นเป็นบูลีน
  • */ (< y) = (~. y) ; (/:~ y)- yบูลีนแสดงให้เห็นคุณสมบัติที่ต้องการสำหรับตัวพิมพ์เล็ก

3

จูเลีย 44 ไบต์

s->(l=lowercase(s);l==join(sort(unique(l))))

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่ระบุชื่อซึ่งใช้อาร์กิวเมนต์ตัวเดียวsแปลงเป็นตัวพิมพ์เล็กและเปรียบเทียบกับรุ่นที่เรียงลำดับเฉพาะของสตริง ก็จะส่งกลับแบบบูลคือหรือtrue falseหากคุณต้องการที่จะทดสอบออกกำหนดมันเช่นf=s->...แล้วโทรf("PuZ")ฯลฯ


แก้ไขสิ่งนั้น @flawr ขอบคุณสำหรับการสนับสนุน.
Alex A.

3

Pure Bash 4.x, 37

[[ ${1,,} =~ ^`printf %s? {a..z}`$ ]]

อินพุตนำมาเป็นพารามิเตอร์บรรทัดคำสั่ง ตามความหมายของเชลล์มาตรฐานรหัสออก 0 หมายถึงจริง (ตัวอักษร) และรหัสออก! = 0 หมายถึงเท็จ (ไม่ใช่ตัวอักษร)

printf สร้าง regex กับใน@ วิธีการแก้ปัญหาของ สตริงอินพุตถูกขยายเป็นตัวพิมพ์เล็กและเปรียบเทียบกับ regex


คำตอบก่อนหน้า:

Bash + coreutils, 52

ทางออกที่ตรงไปตรงมา:

a=`fold -1<<<${1,,}`
cmp -s <(sort -u<<<"$a")<<<"$a"

โปรดทราบว่านี่ต้องใช้ bash 4.x
Mark Reed

@ MarkReed ใช่ ข้อสังเกต.
Digital Trauma

3

C # 6, 18 + 82 76 = 94 ไบต์

ต้องการ (18 ไบต์):

using System.Linq;

รหัส (76 ไบต์):

bool a(string s)=>(s=s.ToLower()).Distinct().OrderBy(x=>x).SequenceEqual(s);

C # 6 รองรับ lambdas เพื่อกำหนดฟังก์ชั่นซึ่งมีประโยชน์สำหรับการเล่นกอล์ฟ

รุ่นที่ไม่ใช่ C # 6:

bool a(string s){return (s=s.ToLower()).Distinct().OrderBy(x=>x).SequenceEqual(s);}

รหัสไม่ได้รับการตอบกลับ:

bool IsInAlphabeticalOrder(string s)
{
    s = s.ToLower();
    return s.Distinct()
            .OrderBy(x => x)
            .SequenceEqual(s);
}

3

JavaScript (ES6) 54

แปลงเป็นตัวพิมพ์ใหญ่จากนั้นเรียงเป็นอาร์เรย์และเรียงลำดับ ถ้าในระหว่างการเรียงลำดับสององค์ประกอบอยู่ในลำดับที่ไม่ถูกต้องหรือเท่ากับส่งคืน 0 (เท็จ) อื่น 1 (ความจริง)

แก้ไขสั้นลงเพื่อขอบคุณ @Optimizer (2 แต่ยังคงมากกว่าการแก้ปัญหา @Tamas ดำเนินการใน ES6: F=s=>[...s.toUpperCase()].every(c=>(u=l,l=c)>u,l=''))

F=s=>[...s.toUpperCase(x=1)].sort((a,b)=>a<b?1:x=0)&&x

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

;['a','abcdefGHIjklmnopqrSTUVWXyz','aa','puz','puzz','puzZ','puZ','PuZ']
.map(w=>w+' '+F(w))

["a 1", "abcdefGHIjklmnopqrSTUVWXyz 1", "aa 0", "puz 1", "puzz 1", "puzZ 0", "puZ 1", "PuZ 1"]


1
s=ดูเหมือนจะไม่จำเป็นต้องใช้ ...
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ถูกต้องมันเป็นความพยายามครั้งแรกเมื่อในที่สุด i เปรียบเทียบกับต้นฉบับ (ตัวพิมพ์ใหญ่) และเรียงลำดับ
edc65

3

C (44 ไบต์)

f(char*s){return(*s&=95)?f(s+1)>*s?*s:0:96;}

ทดสอบที่นี่: http://ideone.com/q1LL3E

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

ส่งคืน 0 ถ้าไม่ได้สั่งสตริงและค่าที่ไม่ใช่ศูนย์ถ้าสั่ง


3

Golang (65 ไบต์)

Go ไม่ใช่ภาษาที่เป็นมิตรกับกอล์ฟ แต่ฉันดูดที่สนามกอล์ฟ ...

func a(s[]byte)(bool){return len(s)<2||s[0]|32<s[1]|32&&a(s[1:])}

เรียกใช้ที่นี่: http://play.golang.org/p/xXJX8GjDvr

แก้ไข 106-> 102

แก้ไข 102-> 96

แก้ไข 96-> 91

แก้ไข 91-> 87

แก้ไข 87-> 65

ฉันชนะรุ่น java ฉันสามารถหยุดได้ในวันนี้


3

Java 8 - 90 89 87 85 ตัวอักษร

ความคิดที่นี่คือการใช้ฟังก์ชั่น 'ลด' ที่ติดตามถ่านตัวสุดท้ายและ "ยอมแพ้" เมื่อตรวจพบลำดับไม่ได้ขึ้นอย่างเคร่งครัด

แข็งแรงเล่นกอล์ฟ:

int f(String s){return s.toLowerCase().chars().reduce(0,(v,c)->(v<0)?v:(c>v)?c:-1);}

ungolfed:

int f(String s){
    return s.toLowerCase()
            .chars()
            .reduce(0, (v,c) -> (v<0)? v : (c>v)?c:-1);
}

ตัวอย่าง:

System.out.println(new Quick().f("abc"));
System.out.println(new Quick().f("aa"));
System.out.println(new Quick().f("abcdefGHIjklmnopqrSTUVWXyz"));
System.out.println(new Quick().f("puZ"));
System.out.println(new Quick().f("Puz"));
System.out.println(new Quick().f("cba"));

เอาท์พุท:

99
-1
122
122
122
-1

3

Perl 6, 35 ไบต์

{my@c=.uc.comb;@c eq@c.sort.unique}

สิ่งนี้สร้างบล็อก callable; หากฉันสามารถสันนิษฐานได้ว่า$_ตั้งค่าไว้เป็นคำที่ต้องการฉันสามารถลบเครื่องหมายปีกกาที่ล้อมรอบและสูญเสียอีกสองไบต์ แต่อาจเป็นวิธีเดียวที่สมเหตุสมผลในการทำให้สมมติฐานนั้นคือการรันด้วย-nและป้อนคำเป็นอินพุตมาตรฐาน ซึ่งจะเพิ่มสองไบต์ทันที


แน่นอนมันทำ .uc.combไม่ได้จัดเรียงอะไรใหม่ดังนั้นถ้าอาร์เรย์ตัวพิมพ์ใหญ่และหวีรวมเท่ากับอาร์เรย์ตัวพิมพ์ใหญ่และตัวเรียงซึ่งหมายความว่ามันเริ่มเรียงตามลำดับ
Mark Reed

มันตรวจสอบขนาดของสี่แยกที่ไม่สนใจคำสั่ง ตกลงอัปเดตแล้ว
Mark Reed

3

R , 37 ไบต์

all(diff(utf8ToInt(scan(,''))%%32)>0)

ลองออนไลน์!

โพสต์ตั้งแต่นี้เป็นอย่างมากที่แตกต่างกันและสั้นกว่าคำตอบ R คาล

แปลงตัวอักษรเป็น ASCII codepoints ด้วยutf8ToIntจากนั้นใช้ modulo 32 เพื่อให้ตัวอักษรล่างและบนถูกแปลงเป็นตัวเลขเดียวกัน 1 ... 26 คำนวณความแตกต่างของจำนวนคู่และตรวจสอบว่าเป็นผลบวกทั้งหมด


2

Perl, 27

การสร้าง regexp ของ @ hsl แบบไดนามิก

#!perl -p
$"="?";@x=a..z;$_=/^@x?$/i

นอกจากนี้เรายังสามารถทำการจับคู่ย้อนกลับ: แปลงอินพุตเป็น regexp: PuZ=> .*p.*u.*z.*แล้วจับคู่สิ่งนี้กับสตริงของตัวอักษรตามลำดับตัวอักษร ผลลัพธ์ - เช่นกัน 27 ตัวอักษร

#!perl -lp
$_=join(s//.*/g,a..z)=~lc

2

k (6 ไบต์)

&/>':_

& ผลตอบแทนจริงถ้าทั้งสองเป็นจริง

/แก้ไข&เพื่อใช้รายการ "เหนือ" เช่นการพับในภาษาที่ใช้งานได้

> มากกว่า

':ปรับเปลี่ยน>เพื่อใช้ "แต่ละก่อน" ดังนั้นส่งคืนเวกเตอร์ของบูลีนที่ระบุว่าองค์ประกอบใดมีค่ามากกว่ารุ่นก่อน

_ ทำให้มันเป็นตัวพิมพ์เล็ก

  _"puzZ"
"puzz"
  >':_"puzZ"
1110b
  &/>':_"puzZ"
0b

( 0bหมายถึงบูลีนเท็จ)

q (13 ไบต์)

all(>':)lower

q เป็นเพียงน้ำตาลเชิงซ้อนใน k allถูกกำหนดให้เป็น&/และต่ำกว่าคือ_


4
คุณอธิบายได้ไหมว่ามันทำงานอย่างไร
ข้อบกพร่อง

นี่เกือบจะรู้สึกเหมือนการโกงในภาษาอื่น ๆ ... ใครต้องการชื่อฟังก์ชั่นวงเล็บและอัฒภาค? :)
Sanchises

@sanchises k มีทุกสิ่งเหล่านั้นและพวกเขาก็ทำงานแบบเดียวกับในภาษาสไตล์ C เป็นเพียงว่าปัญหานี้เกิดขึ้นเพื่อแสดงเป็นคำสั่งเดียว
mollmerx


2

VBA (161 ไบต์)

Function t(s As String)
t = 0
For i = 2 To Len(s)
a = Left(LCase(s), i)
    If Asc(Right(a, 1)) <= Asc(Right(a, 2)) Then Exit Function
Next
t = 1
End Function  

เปรียบเทียบค่า ascii กับตัวอักษรก่อนหน้าในตัวพิมพ์เล็กส่งคืน 0 (เท็จ) เมื่อค่ามีขนาดเล็กกว่า / เท่ากันและฟังก์ชั่นออก


2

Python 2 , 43 ไบต์

lambda s:eval('"%s"'%'"<"'.join(s.lower()))

ลองออนไลน์!

วาง<สัญลักษณ์ระหว่างตัวอักษรทั้งหมด (แปลงเป็นตัวพิมพ์เล็ก) แล้วevalเลือก ตัวดำเนินการเปรียบเทียบที่ถูกล่ามโซ่ของงูหลามมีความสุขอย่างสมบูรณ์แบบในการประเมินสิ่งทั้งปวงเป็นนิพจน์บูลีนขนาดใหญ่


1

แอร์ลัง, 51

f(S)->G=string:to_lower(S),ordsets:from_list(G)==G.

ใช้ชุดที่สั่ง (คล้ายกับjava.util.TreeSet) เพื่อเรียงลำดับอักขระและละทิ้งรายการที่ซ้ำกัน รายการใหม่จะถูกเปรียบเทียบกับสตริงอินพุต

ฟังก์ชั่นการทดสอบ:

test() ->
    [io:format("~p ~p~n", [S, f(S)]) || S <- ["a","abcdefGHIjklmnopqrSTUVWXyz","aa","puz","puzz","puzZ","puZ","PuZ"]].

1

Java, 96

boolean a(char[]a){int i=-1,l=0;for(;++i<a.length;l+=i>0&&a[i]<=a[i-1]?1:0)a[i]|=32;return l<1;}

ตรงไปตรงมาสวยที่นี่ เพียงแปลงทั้งหมดเป็นต่ำลงและเปรียบเทียบแต่ละอักขระก่อนหน้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.