ตัวย่อแบบเรียกซ้ำ


31

วัตถุประสงค์

จากวิกิพีเดีย :

ตัวย่อแบบเรียกซ้ำเป็นตัวย่อที่อ้างถึงตัวเองในการแสดงออกซึ่งมันยืน

เป้าหมายของคุณคือการตรวจสอบว่าสตริงเป็นตัวย่อซ้ำหรือไม่

  • คำย่อเป็นคำแรก
  • คำไม่ได้ตรงตามตัวพิมพ์ใหญ่ - เล็กคั่นด้วยช่องว่างเดียว
  • สตริงที่ระบุไม่มีเครื่องหมายวรรคตอนและเครื่องหมายอัญประกาศ
  • เฉพาะอักษรตัวแรกของแต่ละคำเท่านั้นที่สามารถเป็นส่วนหนึ่งของตัวย่อ

นอกจากนี้คุณยังจะต้องให้คำฟังก์ชั่น เพื่อความเรียบง่ายทุกคำถือได้ว่าเป็นคำฟังก์ชั่น

ตัวอย่าง

f("RPM Package Manager")         =>     { true, [] }
f("Wine is not an emulator")     =>     { true, ["an"] }
f("GNU is not Unix")             =>     { true, ["is"] }
f("Golf is not an acronym")      =>     { false }  
f("X is a valid acronym")        =>     { true, ["is","a","valid","acronym"] }  

คุณสามารถให้โปรแกรมเต็มหรือฟังก์ชั่น
สตริงอินพุตสามารถนำมาจาก STDIN หรือเป็นอาร์กิวเมนต์ของฟังก์ชัน
ผลลัพธ์เอาต์พุตสามารถเป็นจริง / เท็จ, 0/1, ใช่ / ไม่ใช่ ...
รายการคำฟังก์ชัน (รูปแบบของรายการใด ๆ ที่ถูกต้อง) จะต้องได้รับหากว่าเป็นตัวย่อแบบเรียกซ้ำ (แม้ว่ารายการนั้นจะว่างเปล่า) . คุณไม่จำเป็นต้องรักษาการใช้อักษรตัวพิมพ์ใหญ่ของฟังก์ชันคำ

เกณฑ์การชนะ

นี่คือการเขียนรหัสที่สั้นที่สุดชนะ


4
เราจำเป็นต้องรักษาตัวพิมพ์ใหญ่ของคำฟังก์ชันหรือไม่?
algorithmshark

1
เป็นที่ยอมรับหรือไม่ที่จะมีรายการสตริงที่มาพร้อมกับค่าเท็จหรือไม่?
undergroundmonorail

1
เนื่องจากรายการคำนั้นเข้ารหัสค่าบูลีนด้วยการมีอยู่เราอาจละเว้นบูลีนได้หรือไม่
John Dvorak

5
Hurd ย่อมาจาก Hird of Unix-การเปลี่ยน Daemons Hird ย่อมาจาก Hurd of Interfaces ที่แสดงถึงความลึก ทำไมตัวอย่างที่นี่ไม่เข้าใจและเรียกร้องตัวย่อเหล่านั้นไม่ใช่คำย่อซ้ำ
Konrad Borowski

3
@ xfix วิกิพีเดียระบุว่าตัวย่อเหล่านี้ซ้ำซึ่งกันและกัน
Michael M.

คำตอบ:


7

GolfScript, 51 50 ตัวอักษร

{32|}%" "/(1>\{.1<2$1<={;1>}{\}if}/{]!}{]`1" "@}if

มันอาจจะสามารถเล่นกอล์ฟต่อไปได้ ใช้อินพุตบน STDIN บูลีนคือ 0/1

ทดสอบออนไลน์


คำอธิบาย:

{32|}%      # change everything to lower-case
" "/        # splits the string by spaces
(1>         # takes the first word out and removes the first letter
\           # moves the list of remaining words in front of the acronym word
{           # for every word:
  .1<2$1<=    # compares the first letter of the word with
              # the next unmatched letter of the acronym
  {;1>}       # if they are the same, discard the word and the now-matched letter
  {\}         # otherwise store the word in the stack
  if          # NB. if all letters have been matched, the comparison comes out as false
}/
{]!}        # if there are still unmatched letters, return 0 (`!` non-empty list)
{]`1" "@}   # otherwise, return 1, and display the list of function words
if

22

Regex,. NET รส 62 ไบต์

(?i)(?<=^\w(?<c>\w)*)( \k<c>(?<-c>)\w+| (?<w>\w+))*$(?(c)(?!))

คุณสามารถทดสอบได้ที่นี่ หากอินพุตเป็นตัวย่อแบบเรียกซ้ำสิ่งนี้จะให้ผลลัพธ์ที่ตรงกันและกลุ่มที่จับภาพwจะมีคำฟังก์ชันทั้งหมด หากไม่เป็นเช่นนั้นจะไม่มีการแข่งขัน

นี่จะรักษาตัวพิมพ์ใหญ่ของคำฟังก์ชัน (แต่ตรงกับตัวพิมพ์ใหญ่ - เล็ก)

น่าเสียดายที่ผู้ทดสอบไม่แสดงสแต็กทั้งหมดของกลุ่มการจับภาพที่ระบุชื่อ แต่ถ้าคุณใช้ที่ใดก็ได้ใน. NET wกลุ่มจะมีคำฟังก์ชันทั้งหมดตามลำดับ

นี่คือตัวอย่าง C # เพื่อพิสูจน์ว่า:

var pattern = @"(?i)(?<=^\w(?<c>\w)*)( \k<c>(?<-c>)\w+| (?<w>\w+))*$(?(c)(?!))";
var input = new string[] {
    "RPM Package Manager",
    "Wine is not an emulator",
    "GNU is not Unix",
    "Golf is not an acronym",
    "X is a valid acronym"
};

var r = new Regex(pattern);
foreach (var str in input)
{
    var m = r.Match(str);
    Console.WriteLine(m.Success);
    for (int i = 0; i < m.Groups["w"].Captures.Count; ++i)
        Console.WriteLine(m.Groups["w"].Captures[i].Value);
}

นี่คือคำอธิบายอย่างรวดเร็ว ฉันใช้กลุ่มสร้างสมดุลของ. NET เพื่อสร้างตัวอักษรย่อของกลุ่มที่มีชื่อcพร้อมกับข้อมูลโค้ดนี้

^\w(?<c>\w)*

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

เมื่อฉันได้สแต็คนั้นฉันก็จับคู่คำสตริงที่เหลือสำหรับคำ ทั้งคำเริ่มต้นด้วยตัวอักษรที่ด้านบนของสแต็คตัวย่อ ในกรณีที่ฉันปรากฏจดหมายนั้นจากกอง:

 \k<c>(?<-c>)\w+

มิฉะนั้นฉันจับคู่คำต่อไปแล้วกดลงบนwสแต็กซึ่งจะมีคำฟังก์ชันทั้งหมด:

 (?<w>\w+)

ในตอนท้ายฉันแน่ใจว่าฉันไปถึงจุดสิ้นสุดของสตริงด้วย$และตรวจสอบให้แน่ใจว่าฉันใช้ตัวอักษรทั้งหมดจากคำย่อโดยตรวจสอบว่าสแต็กว่างเปล่า:

(?(c)(?!))

ทดสอบบน ideone


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

4
@toothbrush หาก OP ตัดสินใจตัดสิทธิ์คำตอบของฉันตามนั้น แต่ฉันคิดว่าฉันสามารถชี้ให้เห็นว่านี่เป็นโปรแกรมแบบเต็มในภาษาซึ่งเป็นภาษาที่ใช้ในการแสดงออกปกติของ. NET (ไม่ใช่ภาษาทัวริงที่สมบูรณ์และเป็นภาษาที่ค่อนข้างยุ่งยากในการทำงาน ไม่ว่าในกรณีใดฉันชอบความจริงที่ว่าฉันแก้ไขมันด้วยวิธีบริสุทธิ์ - regex และฉันต้องการคำตอบที่ถูกตัดสิทธิ์มากกว่าทำลาย "สง่างาม" (ถ้าคุณจะ) โดยทำให้ "เพียง C # -answer ใช้ regex "
Martin Ender

นั่นโอเคสำหรับฉัน. ฉันแค่ต้องการชี้ให้เห็นในกรณีที่คุณพลาด
แปรงสีฟัน

1
ฉันชอบมัน. Regexes อาจไม่ใช่ภาษาโปรแกรมทัวริงที่สมบูรณ์ แต่ฉันคิดว่านี่ควรนับ
พอลเดรเปอร์

@ PaulDraper ในความเป็นจริงฉันไม่แม้แต่จะวางเดิมพัน regex ของ. NET รสชาดไม่สมบูรณ์ ... กลุ่มที่สมดุลและลุคที่ดูจากขวาไปซ้ายนั้นดูทรงพลัง และ PCRE นั้นเป็นที่รู้จักกันว่าทัวริงสมบูรณ์ (ที่มีการเรียกซ้ำฉันไม่แน่ใจว่าสแต็คใน. NET เพียงพอที่จะเลียนแบบการทำซ้ำโดยพลการ)
Martin Ender

11

Python (158 โดยไม่มี regex)

ไม่ใช่ว่าฉันไม่ชอบ regexes มันเป็นสิ่งที่ฉันไม่รู้

def f(x):
 s=x.lower().split();w=list(s[0][1:]);s=s[1:];o=[]
 if not w:return 1,s
 [w.pop(0)if i[0]==w[0]else o.append(i)for i in s]
 return(0,)if w else(1,o)

โอ้ฉันยังมีรุ่นที่ไม่น่ารังเกียจ:

def acronym(string):
    scentence = string.lower().split()
    word = scentence[0][1:]
    scentence = scentence[1:]
    over = []
    if not word: return 1, scentence
    for item in scentence:
        if item[0] == word[0]:
            word = word[1:]
        else:
            over.append(item)
    if word:
        return 0,
    return 1,over

5

Python 2.7 - 131 126 ไบต์

def f(s):
 s=s.lower().split();a,f=list(s[0]),[]
 for w in s:f+=0*a.pop(0)if a and w[0]==a[0]else[w]
 return(0,)if a else(1,f)

สร้างรายการตัวอักษรในคำแรกของคำย่อ จากนั้นสำหรับแต่ละคำในสตริงเต็มกำจัดองค์ประกอบแรกของรายการนั้นที่เราทำถ้ามันเหมือนกับตัวอักษรตัวแรกของคำนั้น มิฉะนั้นให้เพิ่มคำนั้นลงในรายการคำฟังก์ชัน เพื่อส่งออกกลับnot a (ในหลามรายการอื่นใดนอกเหนือจากรายการที่ว่างเปล่าเป็นTrue-y และรายการเป็นที่ว่างเปล่าถ้ามันเป็น recursive ย่อ) not aและรายชื่อถ้า

ขอบคุณ @ace ที่ช่วยฉันแก้ไขข้อผิดพลาด / บันทึกบางไบต์


ใน Python 2.7.3 ฉันSyntaxError: invalid syntaxไปถึงจุดสิ้นสุดของreturnบรรทัด
pastebin.com slash 0mr8spkT

@ace Huh ฉันจะได้สาบานมันทำงานเมื่อฉันทดสอบมัน ฉันต้องเปลี่ยนบางอย่างแล้วลืมทดสอบอีกครั้ง ฉันจะแก้ไขข้อผิดพลาด!
undergroundmonorail

คุณสามารถใช้for w in s:f+=0*a.pop(0)if a and w[0]==a[0]else[w]อันที่สั้นกว่าและไม่พึ่งพาแท็บ สำหรับreturnคำสั่งฉันพบว่า0if a else(1,f)สั้นกว่าต้นฉบับของคุณ
pastebin.com slash 0mr8spkT

โอ้และถ้าคุณใช้เครื่องหมายอัฒภาคเพื่อวางสองคำสั่งแรกในบรรทัดเดียวกันคุณบันทึกหนึ่งไบต์ของการเยื้อง
pastebin.com slash 0mr8spkT

1
ฉันคิดหาวิธีแก้ไขข้อผิดพลาด แต่เมื่อฉันกลับมาที่นี่เพื่อโพสต์ข้อผิดพลาดนั้นคุณตีกอล์ฟมากขึ้นในความคิดเห็น: P
undergroundmonorail

3

Python - 154 ตัวอักษร

ครั้งแรกที่เคยลองเล่นกอล์ฟ ฉันคิดว่าหลามไม่ได้เป็นภาษาที่ดีที่สุดสำหรับคำหลักที่มีความยาวทั้งหมด นอกจากนี้ฉันไม่คิดว่าฟังก์ชั่นนี้จะเข้าใจผิดได้ มันใช้งานได้กับอินพุตของ OP แต่ฉันแน่ใจว่าฉันสามารถคิดข้อยกเว้นได้

def f(s):
    w=s.lower().split();r=list(w[0]);return(True,[x for x in w if x[0]not in r])if len(r)==1 or[x for x in[y[0]for y in w]if x in r]==r else False

ฉันนับ 156 อักขระ (ขึ้นบรรทัดใหม่และอักขระแท็บนับรวมกัน) แต่คุณสามารถลดได้ถึง 154 ถูกต้องตามกฎหมายด้วยการลบอักขระสองตัวเหล่านี้เนื่องจากไม่จำเป็นจริงๆ ยินดีต้อนรับสู่ PPCG, btw :)
undergroundmonorail

3

ECMAScript 6 (105 ไบต์):

f=s=>(r=(a=s.toUpperCase(i=1).split(' ')).map((w,c)=>c?a[0][i]==w[0]?(i++,''):w:''),a[0].length==i?1+r:0)

เข้าสู่ฟังก์ชั่นในคอนโซลเบราว์เซอร์ของ Firefox จากนั้นเพียงเรียกใช้ฟังก์ชั่นเช่นนี้

f('ABC Black Cats')     // 1,,
f('ABC is Black Cats')  // 1,IS,,
f('ABC Clapping Cats')  // 0

The function words list ... must be given if and only if this is a recursive acronymไม่ค่อยสอดคล้องกับกฎ: สิ่งนี้จะเตือนพวกเขาไม่ว่า
MT0

@ MT0 ตกลง ฉันไม่ได้สังเกตเห็นความต้องการนั้น ฉันจะดูว่าฉันสามารถเขียนได้หรือไม่
แปรงสีฟัน

@ MT0 ฉันได้อัปเดตรหัสตอนนี้
แปรงสีฟัน

2

Haskell - 287 ไบต์

ไม่ใช่รายการที่สั้นที่สุด (เฮ้นี่คือ Haskell คุณคาดหวังอะไร) แต่ก็ยังมีความสนุกในการเขียนอีกมาก

import Data.Char
import Data.List
f""w=map((,)False)w
f _[]=[]
f(a:as)(cs@(c:_):w) 
 |toLower a==toLower c=(True,cs):f as w
 |True=(False,cs):f(a:as)w
g s=if(length$filter(fst)d)==length v
  then Just$map(snd)$snd$partition(fst)d 
  else Nothing
 where 
  w=words s
  v=head w
  d=f v w

ทดสอบกับ

map (g) ["RPM Package Manager","Wine is not an emulator","GNU is not Unix","Golf is not an acronym","X is a valid acronym"]

ผลลัพธ์ที่คาดหวัง

[Just [],Just ["an"],Just ["is"],Nothing,Just ["is","a","valid","acronym"]]

Ungolfed

import Data.Char
import Data.List

f :: String -> [String] -> [(Bool, String)]
f "" w = map ((,) False) w
f _ [] = []
f (a:as) ((c:cs):w) | toLower a == toLower c = (True, c:cs) : f as w
                    | otherwise = (False, c:cs) : f (a:as) w

g :: String -> Maybe [String]
g s = if (length $ filter (fst) d) == (length v)
          then Just $ map (snd) $ snd $ partition (fst) d 
          else Nothing
  where w = words s
        v = head w
        d = f v w

2

JavaScript (ECMAScript 6) - 97 ตัวอักษร

f=x=>(r=(a=x.toLowerCase(i=0).split(' ')).filter(y=>y[0]!=a[0][i]||i-i++),i==a[0].length?[1,r]:0)

แบบทดสอบ:

f("RPM Package Manager")
[1, []]

f("GNU is not Unix")
[1, ["is"]]

f("X is an acronym")
[1, ["is", "an", "acronym"]]

f("Golf is not an acronym")
0

f("Wine is not an emulator")
[1, ["an"]]

1

Rebol - 133

f: func[s][w: next take s: split s" "y: collect[foreach n s[either n/1 = w/1[take w][keep n]]]reduce either/only w: empty? w[w y][w]]

Ungolfed:

f: func [s] [
    w: next take s: split s " "
    y: collect [
        foreach n s [
            either n/1 = w/1 [take w][keep n]
        ]
    ]
    reduce either/only w: empty? w [w y][w]
]

ทดสอบกับ:

foreach t [
    "RPM Package Manager"  "Wine is not an emulator"  
    "GNU is not Unix"      "Golf is not an acronym"  
    "X is a valid acronym"
][probe f t]

เอาท์พุท:

[true []]
[true ["an"]]
[true ["is"]]
[false]
[true ["is" "a" "valid" "acronym"]]

1

จูเลีย - 116 ไบต์

f(w)=(a=split(lowercase(w));L=1;A=a[];while a!=[];a[][1]==A[1]?A=A[2:]:(L=[L,a[]]);a=a[2:];A>""||return [L,a];end;0)

หัก Golfed:

f(w)=(
 a=split(lowercase(w))
 L=1
 A=a[]
 while a!=[]
  if a[][1]==A[1]
   A=A[2:]
  else
   L=[L,a[]]
  end
  a=a[2:]
  if !(A>"")
   return [L,a]
  end
 end
0)

0ในท้ายที่สุดทำให้ผลผลิตมัน 0. มิฉะนั้นมันจะออกผลลัพธ์อาร์เรย์ที่มี1ตามมาด้วยคำพูดที่ฟังก์ชั่น ตัวอย่างเช่น:

julia> f("RPM Package Manager")
1-element Array{Any,1}:
 1

julia> f("Golf is not an acronym")
0

julia> f("GNU is not Unix")
2-element Array{Any,1}:
 1    
  "is"

julia> f("X is a valid acronym")
5-element Array{Any,1}:
 1         
  "is"     
  "a"      
  "valid"  
  "acronym"

1

Brachylogขนาด 29 ไบต์

ḷṇ₁XhY∧X;0zpᵐz{ċ₂ˢ}ᵐZhhᵐcY∧Zt

ลองออนไลน์!

ส่งออกคำฟังก์ชันผ่านตัวแปรเอาต์พุตหากอินพุตเป็นตัวย่อแบบเรียกซ้ำและล้มเหลวหากไม่เป็นเช่นนั้น

   X                             X is
ḷ                                the input lowercased
 ṇ₁                              and split on spaces,
    hY                           the first element of which is Y
      ∧                          (which is not X).
       X  z                      X zipped
        ;0                       with zero,
           pᵐ                    with all pairs permuted (creating a choicepoint),
             z                   zipped back,
              {   }ᵐ             and with both resulting lists
               ċ₂ˢ               losing all non-string elements,
                    Z            is Z.
                      hᵐ         The first elements of the elements of
                    Zh           the first element of Z
                        cY       concatenated are Y
                          ∧      (which is not Z).
                           Zt    The last element of Z is the output.

โดยไม่จำเป็นต้องเอาท์พุทฟังก์ชั่นคำพูด (ถือเป็นบริสุทธิ์) มันออกมาเพียง 12 ไบต์เพราะ∧Ztสามารถลบทิ้งได้เป็น -3 Yสามารถเปลี่ยนได้ด้วย.-1 และที่สำคัญที่สุด;0zpᵐz{ċ₂ˢ}ᵐZhสามารถแทนที่ด้วยสำหรับ มหันต์ -13:ḷṇ₁Xh.∧X⊇hᵐc


0

คอบร้า - 187

def f(s as String)
    l=List<of String>(s.split)
    a=l[0]
    l.reverse
    o=0
    for c in a,for w in l.reversed
        if c==w[0]
            l.pop
            o+=1
            break
    x=o==a.length
    print x,if(x,l,'')

0

ทับทิม - 173

น่าจะดีกว่า ...

 f=->s{a=[];o={};s=s.split;r=true;s[0].each_char{|c|s.each{|w| w[0]=~/#{c}/i?(o[c]=1;a<<w if o[c]):(o[c]=0 if !o[c])}};r,a=false,s if o.values&[0]==[0];!r ?[r]:[r,(s-(a&a))]}

โทรหา func:

p f.call('RPM Package Manager')
p f.call('Wine is not an emulator')
p f.call("GNU is not Unix")
p f.call("Golf is not an acronym")
p f.call("X is a valid acronym")

ผลผลิต:

[true, []]
[true, ["an"]]
[true, ["is"]]
[false]
[true, ["is", "a", "valid", "acronym"]]

0

Java - 195

น่าเสียดายที่ Java ไม่ได้มีการสนับสนุน tuple

ดังนั้นนี่คือคลาสที่เก็บบูลีนใน 'b' และรายการคำฟังก์ชันใน 'x'

ที่นี่ฟังก์ชั่นเป็นตัวสร้างของชั้นเรียน

static class R{boolean b;String[]x;R(String s){String v=" ",i="(?i)",f=s.split(v)[0],r=i+f.replaceAll("(?<=.)",".* ");if(b=(s+=v).matches(r))x=(s.replaceAll(i+"\\b["+f+"]\\S* ","")+v).split(v);}}

ทดสอบ

public class RecursiveAcronyms {
public static void main(String args[]) {
    String[] tests = {
            "RPM Package Manager",
            "Wine is not an emulator",
            "GNU is not Unix",
            "Golf is not an acronym",
            "X is a valid acronym"
        };
    for (String test:tests) {
        R r = new R(test);
        System.out.print(r.b);
        if (r.b) for (String s:r.x) System.out.print(" "+s);
        System.out.print("\n");
    }
}
static class R{boolean b;String[]x;R(String s){String v=" ",i="(?i)",f=s.split(v)[0],r=i+f.replaceAll("(?<=.)",".* ");if(b=(s+=v).matches(r))x=(s.replaceAll(i+"\\b["+f+"]\\S* ","")+v).split(v);}}}

C # มีสิ่งอันดับ แต่ฉันมาด้วยสิ่งนี้ในขณะที่ทำงานในการแก้ปัญหาของฉัน: เพิ่งกลับมาstring[]: nullเพียงแค่หมายถึงเท็จว่างเปล่าหมายถึงความจริงและnองค์ประกอบหมายถึงจริงด้วยnคำพูดของฟังก์ชั่น
Num Lock

ฉันก็อยากจะทำเช่นนั้นเหมือนกัน อย่างไรก็ตาม OP ระบุว่าต้องให้บูลีนโดยไม่คำนึงถึง ดูคำตอบของ Jan Dvorak
Vectorized

ฉันไม่สนใจเกี่ยวกับความคิดเห็นเนื่องจากฉันไม่สามารถมองเห็นการแก้ไขที่เกิดขึ้นในโพสต์ต้นฉบับ และแม้ว่าฉันจะทำอย่างชัดเจนก็แค่บอกว่า " ระบุบูลีน " และแม้กระทั่งในคำตอบของตัวเองก็บอกว่า " ผลการส่งออกอาจเป็นจริง / เท็จ, 0/1, ใช่ / ไม่ใช่ ... +" ซึ่งฉันอาจขยายไปที่จุดไข่ปลาโดย "* null / ไม่เป็นโมฆะ " ...
Num ล็อค

0

Awk - 145

awk -v RS=' ' '{c=tolower($0)};NR==1{w=c};{t=substr(c,1,1)!=substr(w,NR-s,1);if(t){f=f" "c;s++};a=a||t};END{print a&&(s>NR-length(w))?"N":"Y|"f}'

ทดสอบ:

$ cat gcp.sh
#!/bin/sh
f() {
echo "$1:"
echo "$1"|awk -v RS=' ' '{c=tolower($0)};NR==1{w=c};{t=substr(c,1,1)!=substr(w,NR-s,1);if(t){f=f" "c;s++};a=a||t};END{print a&&(s>NR-length(w))?"N":"Y|"f}'
}
f "RPM Package Manager"
f "Wine is not an emulator"
f "Wine is not an appropriate emulator"
f "GNU is not Unix"
f "Golf is not an acronym"
f "Go is not an acronym"
f "Go is a valid acronym OK"
f "X is a valid acronym"
f "YAML Ain't Markup Language"

$ ./gcp.sh
RPM Package Manager:
Y|
Wine is not an emulator:
Y| an
Wine is not an appropriate emulator:
Y| an appropriate
GNU is not Unix:
Y| is
Golf is not an acronym:
N
Go is not an acronym:
N
Go is a valid acronym OK:
Y| is a valid acronym
X is a valid acronym:
Y| is a valid acronym

YAML Ain't Markup Language:
Y|

0

เครื่องชงกาแฟ - 144

z=(a)->g=" ";b=a.split g;c=b[0];d=[];(d.push(e);g++)for e,f in b when e[0].toLowerCase()!=c[f-g].toLowerCase();if(g+c.length==f)then{1,d}else{0}

ยกตัวอย่างเช่น z "GNU is not Unix"

รวบรวม JS:

var z;
z = function(a) {
  var b, c, d, e, f, g, _i, _len;
  g = " ";
  b = a.split(g);
  c = b[0];
  d = [];
  for (f = _i = 0, _len = b.length; _i < _len; f = ++_i) {
    e = b[f];
    if (e[0].toLowerCase() !== c[f - g].toLowerCase()) {
      d.push(e);
      g++;
    }
  }
  if (g + c.length === f) {
    return {
      1: 1,
      d: d
    };
  } else {
    return {
      0: 0
    };
  }
};

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


0

C # - 234

Tuple<bool,string[]> f(string w) {var l=w.ToLower().Split(' ');var o=new List<string>();int n=0;var a=l[0];foreach(var t in l){if(n>=a.Length||a[n]!=t[0])o.Add(t);else n++;}var r=n>=a.Length;return Tuple.Create(r,r?o.ToArray():null);}

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