ค้นหาคำแรกที่เริ่มต้นด้วยตัวอักษรแต่ละตัว


25

ระบุสตริงค้นหาคำแรกที่เริ่มต้นด้วยตัวอักษรแต่ละตัว (ตัวพิมพ์เล็กและใหญ่)

ตัวอย่าง

ใช้Ferulas flourish in gorgeous gardens.เป็นอินพุต:

"Ferulas flourish in gorgeous gardens."
 ^^^^^^^          ^^ ^^^^^^^^
 |                |  |
 |                |  --> is the first word starting with `g`
 |                --> is the first word starting with `i`
 --> is the first word starting with `f`

จากนั้นเอาต์พุตสำหรับตัวอย่างนี้ควรเป็นคำที่จับคู่กันโดยเว้นวรรคหนึ่งช่อง:

"Ferulas in gorgeous"

ท้าทาย

ทั้งอินพุตและเอาต์พุตต้องเป็นการนำเสนอสตริงหรือเป็นทางเลือกที่ใกล้เคียงที่สุดในภาษาของคุณ

อนุญาตให้ใช้โปรแกรมหรือฟังก์ชั่น

lowercase or uppercase letters, digits, underscoreคุณสามารถพิจารณาคำเป็นอย่างน้อยหนึ่ง:

นี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่างอื่น:

input: "Take all first words for each letter... this is a test"
output: "Take all first words each letter is"

input: "Look ^_^ .... There are 3 little dogs :)"
output: "Look _ There are 3 dogs"

input: "...maybe some day 1 plus 2 plus 20 could result in 3"
output: "maybe some day 1 plus 2 could result in 3"

อนุญาตให้ใช้ช่องว่างต่อท้าย / เริ่มต้นได้หรือไม่ <s> ฉันสามารถสมมติว่าคำถูกคั่นด้วยช่องว่างหนึ่งช่องในสตริงเดิมได้ไหม </s>
Qwertiy

ฉันเข้าใจจากตัวอย่างดังนั้นจึงมี <s> </s> ในความคิดเห็น สิ่งที่เกี่ยวกับการตัดแต่งช่องว่าง?
Qwertiy

คำตอบ:


17

เรติน่า 28 ไบต์:

M! i` \ ข (w \) (? <! \ ข \ 1. +) w \ *
¶
 
  • M! - จับคู่แต่ละงานและพิมพ์คำทั้งหมดคั่นด้วยบรรทัดใหม่
  • i - ละเว้นกรณี
  • \b(\w) - จับตัวอักษรตัวแรกของแต่ละคำ
  • (?<!\b\1.+)- หลังจากจับคู่ตัวอักษรให้ตรวจสอบว่าไม่มีคำก่อนหน้านี้ที่เริ่มต้นด้วยตัวอักษรเดียวกัน \1.+ทำให้แน่ใจว่ามีอักขระอย่างน้อยสองตัวดังนั้นเราจึงข้ามคำปัจจุบัน
  • \w*- จับคู่คำที่เหลือ
    คำศัพท์ข้างต้นจับคู่คำเท่านั้น - ตัวละครอื่น ๆ จะถูกลบ
  • ¶\n - แทนที่บรรทัดใหม่ด้วยช่องว่าง

ลองออนไลน์!


9

เรติน่า 45 ไบต์

i` \ ข ((w \) \ W *) \ ข (? <= \ ข \ 2 w \ * \ b. +)

\ W +
 
^ | $

ใช้ regex เพียงคำเดียวเพื่อลบคำในภายหลังที่เริ่มต้นด้วย\wอักขระเดียวกัน(ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่และตัวพิมพ์เล็กi) และแปลง\Wพื้นที่เป็นพื้นที่เดียวจากนั้นจึงลบพื้นที่นำหน้า / ส่วนท้ายออกจากผลลัพธ์

ลองออนไลน์!

แก้ไข: ดูคำตอบของ @ Kobiสำหรับรุ่นที่สั้นกว่าโดยใช้M!`


สาปมันแทบจะไม่ชนะข้าเลย! ฉันไม่สามารถคิดออกว่าอยู่เบื้องหลัง
GamrCorps

3
ฉันได้เพิ่มคำตอบสำหรับจอประสาทตาอีก - ฉันคิดว่ามันไม่เป็นไรถ้าพวกเขาแตกต่างกันพอ (แนวคิดพื้นฐานคล้ายกันแน่นอน)
Kobi

1
@Kobi มันดีกว่ามากฉันดีใจที่เห็นมัน :) ทำให้ฉันรู้ว่าฉันต้องเรียนรู้มากแค่ไหนเกี่ยวกับตัวเลือกเส้นของ Retina และสิ่งที่ไม่
Sp3000

คุณสามารถทำเช่นนี้เพื่อบันทึกไม่กี่ไบต์? i` \b((\w)\w*)\b(?<=\b\2\w*\b.+)(ช่องว่างก่อนก่อน\b) เส้นหลังจำเป็นหรือไม่?
แม่ชีที่รั่ว

@KennyLau น่าเสียดายที่ฉันไม่คิดว่าจะทำงานได้เพราะคำไม่จำเป็นต้องคั่นด้วยช่องว่างเช่นa...a -> a
Sp3000

9

JavaScript (ES6), 73 71 ไบต์

s=>s.match(u=/\w+/g).filter(w=>u[n=parseInt(w[0],36)]?0:u[n]=1).join` `

บันทึก 2 ไบต์ต้องขอบคุณ @ edc65!

ทดสอบ

var solution = s=>s.match(u=/\w+/g).filter(w=>u[n=parseInt(w[0],36)]?0:u[n]=1).join` `;
var testCases = [
  "Ferulas flourish in gorgeous gardens.",
  "Take all first words for each letter... this is a test",
  "Look ^_^ .... There are 3 little dogs :)",
  "...maybe some day 1 plus 2 plus 20 could result in 3"
];
document.write("<pre>"+testCases.map(t=>t+"\n"+solution(t)).join("\n\n")+"</pre>");


ใช้งานparseInt("_",36) = NaNหรือ? ดูหมิ่น!
Sp3000

1
ความจริงก็คือมันใช้งานได้ @ Sp3000
edc65

การใช้ u = regexp นั้นฉลาดจริงๆ บันทึก 2 ไบต์s=>s.match(u=/\w+/g).filter(w=>u[w=parseInt(w[0],36)]?0:u[w]=1).join' '
edc65

@ edc65 ขอบคุณ จริง ๆ แล้วค่อนข้างสะดวกว่ามีเอาต์พุตที่เป็นไปได้ 37 รายการสำหรับฐานเดียว 36 หลัก
user81655

7

Pyth, 23 ไบต์

J:z"\w+"1jdxDJhM.grhk0J

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

J:z"\w+"1พบทุกคำในการป้อนข้อมูลโดยใช้ regex และเก็บไว้ใน\w+J

.grhk0Jจัดกลุ่มคำโดยใช้อักษรตัวพิมพ์เล็กตัวแรกhMใช้คำแรกจากแต่ละกลุ่มxDJเรียงลำดับคำเหล่านี้ตามดัชนีของพวกเขาในสตริงอินพุตและjdวางช่องว่างระหว่างพวกเขา



3

C, 142 132 122 ไบต์

เบาขึ้น 10 ไบต์ด้วย @tucuxi!

b[200],k;main(c){for(;~c;isalnum(c)|c==95?k&2?:(k|=!b[c|32]++?k&1?putchar(32):0,7:2),k&4?putchar(c):0:(k&=1))c=getchar();}

พิมพ์ช่องว่างต่อท้ายหลังจากคำเอาต์พุตสุดท้าย


1
คุณสามารถโกนเช็คc>47และc<58โดยใช้isalnumแทนisalpha
tucuxi

3

MATL , 23 ไบต์

'\w+'XXtck1Z)t!=XRa~)Zc

สิ่งนี้ขอยืมแนวคิดของ Jakube ในการใช้ regexp สำหรับการลบตัวละครที่ไม่ต้องการและแยกออกในเวลาเดียวกัน

อินพุตเป็นสตริงที่อยู่ในเครื่องหมายคำพูดเดี่ยว

ลองออนไลน์!

คำอธิบาย

'\w+'XX  % find words that match this regexp. Gives a cell array
t        % duplicate
c        % convert into 2D char array, right-padded with spaces
k        % make lowercase
1Z)      % get first column (starting letter of each word)
t!=      % duplicate, transpose, test for equality: all combinations  
XR       % set diagonal and below to 0
a~       % true for columns that contain all zeros       
)        % use as a logical index (filter) of words to keep from the original cell array
Zc       % join those words by spaces

2

การกดแป้นจำนวน 57 ครั้ง

:s/[^a-zA-Z_ ]//g<cr>A <cr>ylwv$:s/\%V\c<c-v><c-r>"\h* //eg<c-v><cr>@q<esc>0"qDk@q

คำอธิบาย:

:s/[^a-zA-Z_ ]//g                                 #Remove all invalid chars.
A <cr>                                            #Enter insert mode, and enter 
                                                  #a space and a newline at the end
ylwv$:s/\\c%V<c-v><c-r>"\h* //eg<c-v><cr>@q<esc>  #Enter all of this text on the 
                                                  #next line

0                                                 #Go to the beginning of the line
"qD                                               #Delete this line into register
                                                  #"q"
k@q                                               #Run "q" as a macro  

#Macro
ylw                                               #Yank a single letter
   v$                                             #Visual selection to end of line
     :s/                                          #Substitute regex
       \%V\c                                      #Only apply to the selection and 
                                                  #ignore case
            <c-v><c-r>"                           #Enter the yanked letter
                       \h*                        #All "Head of word" chars
                                                  #And a space
                           //                     #Replace with an empty string
                             eg                   #Continue the macro if not found
                                                  #Apply to all matches
                               <c-v><cr>          #Enter a <CR> literal
                                        @q<esc>   #Recursively call the macro

ฉันผิดหวังมากกับระยะเวลาอันนี้ "ความถูกต้อง" ตัวอักษร (ทุกอย่าง แต่a-z, A-Z, _และพื้นที่) จริงๆโยนฉันลง ฉันแน่ใจว่ามีวิธีที่ดีกว่าในการทำสิ่งนี้:

:s/[^a-zA-Z_ ]//g

เนื่องจาก\hตรงกับสิ่งที่คาดหวังสำหรับพื้นที่ทั้งหมด แต่ฉันไม่สามารถหาวิธีที่จะทำให้ metachar อยู่ในช่วงได้ หากใครมีคำแนะนำฉันชอบที่จะได้ยินพวกเขา


3
ทำไมa-zA-Z_ไม่\w? ตัวเลขถูกต้อง
edc65

2

Julia, 165 155 151 129 102 ไบต์

g(s,d=[])=join(filter(i->i!=0,[(c=lcfirst(w)[1])∈d?0:(d=[d;c];w)for w=split(s,r"\W",keep=1<0)])," ")

นี่คือฟังก์ชั่นที่ยอมรับสตริงและส่งคืนสตริง

Ungolfed:

function g(s, d=[])
    # Split the string into an array on unwanted characters, then for
    # each word, if the first letter has been encountered, populate
    # this element of the array with 0, otherwise note the first letter
    # and use the word. This results in an array of words and zeros.
    x = [(c = lcfirst(w)[1])  d ? 0 : (d = [d; c]; w) for w = split(s, r"\W", keep=1<0)]

    # Remove the zeros, keeping only the words. Note that this works
    # even if the word is the string "0" since 0 != "0".
    z = filter(i -> i != 0, x)

    # Join into a string and return
    return join(z, " ")
end

บันทึก 53 ไบต์ด้วยความช่วยเหลือจาก Sp3000!



2

C # (LINQPAD) - 136 128 ไบต์

var w=Util.ReadLine().Split(' ');string.Join(" ",w.Select(s=>w.First(f=>Regex.IsMatch(""+f[0],"(?i)"+s[0]))).Distinct()).Dump();

2

05AB1E , 40 ไบต์

รหัส:

94L32+çJžj-DU-ð¡""Kvy¬Xsl©åï>iX®«Uy}\}ðý

ลองออนไลน์!

คำอธิบาย:

ก่อนอื่นเราสร้างตัวละครทั้งหมดซึ่งควรจะลบออกจากสายป้อนโดยใช้94L32+ç( ลองที่นี่ ) เราเข้าร่วมสตริงนี้โดยใช้Jและลบ[a-zA-Z0-9_]ซึ่งถูกเก็บไว้ในžj ( ลองที่นี่ ) เราลบอักขระทั้งหมดที่อยู่ในสตริงที่สองออกจากสตริงแรกซึ่งจะทำให้เรา:

!"#$%&'()*+,-./:;<=>?@[\]^`{|}~

ที่ยังสามารถทดสอบได้ที่นี่ เราDอัปโหลดสิ่งนี้และเก็บไว้ในXด้วยUคำสั่ง - จากนั้นเราจะลบอักขระทั้งหมดที่อยู่ในสตริงนี้ออกจากอินพุต จากนั้นเราแยกช่องว่างโดยใช้ð¡และลบสตริงว่างทั้งหมด (โดยใช้""K) ขณะนี้เรามีนี้

นี่เป็นเวอร์ชั่นที่สะอาดของอินพุตซึ่งเราจะใช้งาน เรา map vมากกว่าแต่ละองค์ประกอบโดยใช้ ใช้yเป็นตัวแปรสตริง เราใช้อักขระตัวแรกของสตริงที่ใช้¬และ push Xซึ่งมีสตริงที่มีอักขระต้องห้ามทั้งหมด( !"#$%&'()*+,-./:;<=>?@[\]^`{|}~) เราตรวจสอบว่าlรุ่น owercase ของตัวอักษรตัวแรก (ซึ่งจะได้รับการ©opied เพื่อลงทะเบียน) åอยู่ในสายนี้ใช้ ครอบคลุมโดยส่วนนี้: ï>iหากตัวอักษรตัวแรกไม่มีอยู่ในสตริงของตัวอักษรต้องห้าม ( X) เราจะต่อท้ายจดหมายนี้ไปยังรายการตัวอักษรต้องห้าม (ทำด้วยX®«U) และเราจะกดyด้านบนสุดของสแต็ก

ðýสุดท้ายเมื่อสตริงจะถูกกรองเราเข้าร่วมกองซ้อนด้วยช่องว่างด้วย


1
... คำอธิบาย? :-)
Luis Mendo

@ LuisMendo ขอบคุณที่เตือนฉัน! เสร็จสิ้น :)
Adnan

2

PHP

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

ด้วยฟังก์ชั่น wrapper, 89 ไบต์

function f($s){foreach(preg_split('/\W/',$s)as$w)$c[lcfirst($w)[0]]++?:$v.=" $w";echo$v;}

หากไม่มีฟังก์ชั่น wrapper (ต้องมีการประกาศ $ s ล่วงหน้า), 73 ไบต์

foreach(preg_split('/\W/',$s)as$w)$c[lcfirst($w)[0]]++?:$v.=" $w";echo$v;

คำอธิบาย:

foreach(preg_split('/\W/',$s)as$w)$c[lcfirst($w)[0]]++?:$v.=" $w";echo$v;
        preg_split('/\w/',$s)                                             Break input on all non-word characters
foreach(                     as$w)                                        Loop through each 'word'
                                     lcfirst($w)[0]                       Take the first letter of the lowercase version of the word
                                  $c[              ]++?:                  Increment an array element with a key of that letter after checking if it's false-y (0)
                                                        $v.=" $w";        Add the word if the letter wasn't found (if the previous condition evaluated to false)
                                                                  echo$v; Print the new string to screen.

สิ่งเดียวที่ฉันเสียใจคือฉันไม่สามารถหาวิธีตรวจสอบ / แปลงตัวอักษรได้เร็วขึ้น


2

Python ขนาด 103 ไบต์

import re
lambda s,d=[]:[w for w in re.findall("\w+",s)if(d.append(w.lower()[0])or d[-1])not in d[:-1]]

1

Lua, 172 ไบต์

มันจบลงได้นานกว่าที่ฉันต้องการ ...

t={}(...):gsub("[%w_]+",function(w)b=nil for i=1,#t
do b=t[i]:sub(1,1):lower()==w:sub(1,1):lower()and 1 or b
end t[#t+1]=not b and w or nil end)print(table.concat(t," "))

Ungolfed

t={}                           -- initialise the accepted words list
(...):gsub("[%w_]+",function(w)-- iterate over each group of alphanumericals and underscores
  b=nil                        -- initialise b (boolean->do we have this letter or not)
  for i=1,#t                   -- iterate over t
  do
    b=t[i]:sub(1,1):lower()    -- compare the first char of t's i word
       ==w:sub(1,1):lower()    -- and the first char of the current word
           and 1               -- if they are equals, set b to 1
           or b                -- else, don't change it
  end
  t[#t+1]=not b and w or nil   -- insert w into t if b isn't set
end)

print(table.concat(t," "))     -- print the content of t separated by spaces

1

อย่างจริงจัง 43 ไบต์

6╙¬▀'_+,;)-@s`;0@Eùk`M┬i;╗;lrZ`i@╜í=`M@░' j

ลองออนไลน์!

การขาดความสามารถของ regex ทำให้สิ่งนี้ยากกว่าที่ควรจะเป็น

คำอธิบาย:

6╙¬▀'_+,;)-@s`;0@Eùk`M┬i;╗;lrZ`i@╜í=`M@░' j
6╙¬▀                                         push digits in base 62 (uppercase and lowercase letters and numbers)
    '_+                                      prepend underscore
       ,;)                                   push two copies of input, move one to bottom of stack
          -                                  get all characters in input that are not letters, numbers, or underscores
           @s                                split input on all occurrences of non-word characters
             `;0@Eùk`M                       for each word: push the first letter (lowercased)
                      ┬i                     transpose and flatten (TOS is list of first letters, then list of words)
                        ;╗                   push a copy of the first letters list to register 0
                          ;lrZ               zip the list of first letters with their positions in the list
                              `i@╜í=`M       for each first letter: push 1 if that is the first time the letter has been encountered (first index of the letter matches its own index) else 0
                                      @░     filter words (take words where corresponding element in the previous list is truthy)
                                        ' j  join on spaces

1

ทับทิม 76 ไบต์

s;f={};s.scan(/(([\w])[\w]*)/).map{|h,i|f[j=i.upcase]?nil:(f[j]=!p; h)}.compact.*' '

หรือด้วยวิธีการกำหนด 88 ไบต์

def m s;f={};(s.scan(/((\w)\w*)/).map{|h,i|f[j=i.upcase]?nil:(f[j]=1; h)}-[p]).*' ';end

Ungolfed และด้วยการทดสอบหน่วย:

def m_long(s)
  #found  - Hash with already found initials
  f={}
  #h=hit, i=initial, j=i[0].downcase
  s.scan(/(([\w\d])[\w\d]*)/).map{|h,i| 
    f[j=i.upcase] ? nil : (f[j] = true; h)
  }.compact.join(' ')
end
#true == !p
#~ def m(s)
  #~ f={};s.scan(/(([\w\d])[\w\d]*)/).map{|h,i|f[j=i.upcase]?nil:(f[j]=!p; h)}.compact.join' '
#~ end
def m s;f={};s.scan(/(([\w\d])[\w\d]*)/).map{|h,i|f[j=i.upcase]?nil:(f[j]=!p; h)}.compact.join' ';end

#~ s = "Ferulas flourish in gorgeous gardens."
#~ p s.split

require 'minitest/autorun'
class FirstLetterTest < Minitest::Test
  def test_1
    assert_equal("Ferulas in gorgeous",m("Ferulas flourish in gorgeous gardens."))
    assert_equal("Ferulas in gorgeous",m_long("Ferulas flourish in gorgeous gardens."))
  end
  def test_2
    assert_equal("Take all first words each letter is",m("Take all first words for each letter... this is a test"))
    assert_equal("Take all first words each letter is",m_long("Take all first words for each letter... this is a test"))
  end
  def test_3
    assert_equal("Look _ There are 3 dogs",m("Look ^_^ .... There are 3 little dogs :)"))
    assert_equal("Look _ There are 3 dogs",m_long("Look ^_^ .... There are 3 little dogs :)"))
  end
  def test_4
    assert_equal("maybe some day 1 plus 2 could result in 3",m("...maybe some day 1 plus 2 plus 20 could result in 3"))
    assert_equal("maybe some day 1 plus 2 could result in 3",m_long("...maybe some day 1 plus 2 plus 20 could result in 3"))
  end
end

ใน Regex \wมีอักขระตัวเลขดังนั้นจึง[\w\d]สามารถแทนที่\wได้ นอกจากนี้หากnilค่าอยู่ในอาร์เรย์เมื่อคุณโทรjoin' '(หรือยังดีกว่า*' 'เป็นชวเลขที่คุณสามารถใช้เพื่อบันทึกไบต์เพิ่มเติม) พวกเขาหายไปดังนั้นการโทรไปที่compactไม่จำเป็น
หมึกมูลค่า

@KevinLau ขอบคุณ \w\dเป็นที่น่าอายสำหรับฉัน แต่ถ้าฉันลบcompactฉันจะได้รับพื้นที่เพิ่มเติม (ดู['x',nil,'x']*'y' == 'xyyx') หรือฉันคิดถึงอะไรบางอย่าง?
knut

อ๊ะคุณพูดถูก ในกรณีที่จะช่วยประหยัดไบต์มากกว่า(list-[p]) list.compactนอกจากนี้จะเทียบเท่ากับ/\w/ /[\w]/ในที่สุดคุณสามารถแทนที่nilด้วยpและของคุณ!pด้วย1(เนื่องจากแฮชของคุณต้องการค่าความจริงเท่านั้น)
Value Ink

ขอบคุณฉันเพิ่มข้อสังเกตของคุณการแทนที่nilด้วยpไม่ทำงาน ถ้าฉันใช้ภายในรหัสของฉันฉันจะได้รับข้อผิดพลาดทางไวยากรณ์ ฉันต้องแค็ปซูลเช่น(p)- แต่แล้วฉันก็มีตัวละครอีก 3 ตัว
knut

พลิก ternary !f[j=i.upcase]?(f[j]=1;h):pและจากนั้นก็ทำงานเพื่อประหยัดไบต์: เพียงแค่คิดถึงสิ่งนี้ แต่เนื่องจากการจัดทำดัชนีสตริงการใช้s.scan(/\w+/)และการลบสิ่งที่เป็นiประโยชน์ต่อh[0]งานเกินไป
หมึกมูลค่า

1

grep และ awk, 68 56 ไบต์

บท:

echo `grep -o '\w*'|awk '!x[tolower(substr($0,1,1))]++'`

คำอธิบาย:

  • grep -o จับคู่คำที่ถูกกฎหมายพิมพ์แต่ละบรรทัดของตัวเอง

  • awkใช้ตัวอักษรตัวแรกของแต่ละบรรทัดด้วยsubstrทำให้ตัวพิมพ์เล็กแล้วเพิ่มรายการ hashtable ด้วยคีย์นั้น หากค่าไม่ได้รับการตั้งค่าก่อนที่จะเพิ่มขึ้นบรรทัดจะถูกพิมพ์

  • echo ... เปลี่ยนบรรทัดกลับเป็นคำ

ผมเคยพยายามที่จะสร้างวิธีการแก้ปัญหาโดยไม่ต้องawkใช้uniq, sort, grepและbashแต่ลดลงแค่สั้น ๆ ประวัติความเป็นมาในการแก้ไข

ขอบคุณเดนนิสสำหรับการปรับปรุงที่ฉันพลาดไป


0

Python 3.5, 138 ไบต์:

import re;lambda o,t=[]:''.join([y[0]for y in[(u+' ',t.append(u[0].lower()))for u in re.sub('\W+',' ',o).split()if u[0].lower()not in t]])

โดยทั่วไปสิ่งที่เกิดขึ้นคือ ..

  1. การใช้นิพจน์ทั่วไปอย่างง่ายโปรแกรมจะแทนที่อักขระทั้งหมดยกเว้นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ตัวเลขหรือขีดล่างในสตริงที่กำหนดด้วยช่องว่างแล้วแยกสตริงที่ช่องว่างเหล่านั้น
  2. จากนั้นใช้ list comprehension สร้างรายการที่วนซ้ำทุกคำในสตริงที่แยกแล้วเพิ่มตัวอักษรตัวแรกของแต่ละคำลงในรายการ "t"
  3. ในกระบวนการหากตัวอักษรตัวแรกของคำปัจจุบันยังไม่ได้อยู่ในรายการ "t" คำนั้นและช่องว่างต่อท้ายจะถูกเพิ่มเข้าไปในรายการปัจจุบันที่กำลังสร้าง มิฉะนั้นรายการจะดำเนินการต่อท้ายอักษรตัวแรกของแต่ละคำเพื่อแสดงรายการ "t"
  4. ในที่สุดเมื่อคำทั้งหมดในการแบ่งได้รับการวนซ้ำคำในรายการใหม่จะถูกรวมเข้ากับสตริงและส่งคืน

0

PHP 120 ไบท์

function a($s){foreach(preg_split('/\W/',$s)as$w)if(!$o[ucfirst($w[0])]){$o[ucfirst($w[0])]=$w;}return implode(" ",$o);}

สิ่งนี้สร้างคำเตือนมากมาย แต่ไม่เป็นไร


คือfunctionจำเป็น?
อัล

0

Javascript ES6, 108 107 ตัวอักษร

107 ตัวอักษรสตริงผลลัพธ์ถูกตัดแต่ง

r=s=>s.split``.reverse().join``
f=s=>r(r(s).replace(/\b\w*(\w)\b(?=.*\1\b)/gi,'')).replace(/\W+/g,' ').trim()

ทดสอบ:

["Take all first words for each letter... this is a test",
"Look ^_^ .... There are 3 little dogs :)",
"...maybe some day 1 plus 2 plus 20 could result in 3"
].map(f) + '' == [
"Take all first words each letter is",
"Look _ There are 3 dogs",
"maybe some day 1 plus 2 could result in 3"
]

f= ไม่นับ
Qwertiy

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