แยกสตริงที่เกิดขึ้นครั้งแรกของตัวละครแต่ละตัว


45

ที่เกี่ยวข้อง

กำหนดสตริง ASCII ที่พิมพ์ได้แบ่งเป็นรายการสตริงที่ไม่ว่างโดยมีสตริงย่อยใหม่เริ่มต้นทุกครั้งที่มีอักขระซึ่งไม่เคยเห็นมาก่อนในกรณีเดียวกันเกิดขึ้น

ตัวอย่าง

"mississippi" → ["m","i","ssissi","ppi"]

"P P & C G" → ["P"," P ","& ","C ","G"]

"AAA" → ["AAA"]

"Adam" → ["A","d","a","m"]

"" → []


บันทึกย่อ : ผลลัพธ์จะมีองค์ประกอบระหว่าง 0 ถึง 95 สตริงย่อยลำดับที่ 95 จะต้องดำเนินการต่อไปจนสิ้นสุดเนื่องจาก ณ จุดนั้นอักขระ ASCII ที่พิมพ์ได้ทั้งหมดได้เริ่มต้นสตริงย่อยดังนั้นอักขระเพิ่มเติมทุกตัวจะเกิดขึ้นก่อนและจึงไม่สามารถทำให้สตริงย่อยใหม่เริ่มต้นได้


1
ตัวอย่างที่มี"และ'ดูเหมือนว่าเป็นความคิดที่ดี
Emigna

จะ""[""]เป็นที่ยอมรับ?
Arnauld

5
@Emigna นั่นแค่ยุ่งกับรูปแบบผลลัพธ์ตัวอย่างโดยไม่ต้องเพิ่มความชัดเจนใด ๆ
Adám

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

2
@wastl เอ่อฉันจะอนุญาตมันในกรณีนี้เพราะมันไม่สามารถระบุเซ็กเมนต์ที่ว่างเปล่าได้แม้ว่ามันจะขัดแย้งกับการพิจารณาก่อนหน้านี้ของฉัน[""]ว่าไม่ถูกต้อง ถอนหายใจ
Adám

คำตอบ:


22

เยลลี่ 4 ไบต์

QƤĠị

ลองออนไลน์!

คำอธิบาย

QƤĠị  Input is a string, say s = "adam"
 Ƥ    For each prefix of s: ["a","ad","ada","adam"]
Q     remove duplicates: ["a","ad","ad","adm"]
  Ġ   Group indices by equal values: [[1],[2,3],[4]]
   ị  Index into s: ["a","da","m"]

การแสดงสตริงภายในซึ่งลิงค์ TIO แสดงนั้นแตกต่างกันเล็กน้อย


10

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

q1,`.
¶$&

ลองออนไลน์!

คำอธิบาย

จับคู่ตัวละครแต่ละตัว ( .) ทิ้งการแข่งขันซ้ำ ( q) ทิ้งการจับคู่แรก ( 1,) และแทรกตัวดึงบรรทัดไว้ด้านหน้าการแข่งขันแต่ละ¶$&รายการ


6

05AB1E , 11 ไบต์

ÙSk¥sg¸«£õK

ลองออนไลน์!

คำอธิบาย

Ù             # remove duplicates in input
 S            # split to a list of characters
  k           # get the (first) index of each character in the input
   ¥          # calculate delta's
    sg¸«      # append the length of the input
        £     # split the list into pieces of these sizes
         õK   # remove empty string (for the special case "" -> [])

1
สำหรับทุกคนที่เจอคำตอบนี้¸«สามารถอยู่ªในรุ่นใหม่ของ 05AB1E
Kevin Cruijssen

6

C,  75   65  63 ไบต์

ขอบคุณ @Digital Trauma สำหรับการบันทึก 10 ไบต์และต้องขอบคุณ @gastropner และ @ l4m2 สำหรับการบันทึกแต่ละไบต์!

f(char*s){for(int l[128]={};*s;putchar(*s++))l[*s]++||puts(l);}

พิมพ์บรรทัดใหม่นำหน้า

ลองออนไลน์!

ไม่มีบรรทัดใหม่นำหน้า (71 ไบต์):

f(char*s){int l[128]={};for(l[*s]=1;*s;putchar(*s++))l[*s]++||puts(l);}

ลองออนไลน์!



@gastropner เคล็ดลับ Clever; ขอบคุณ!
Steadybox

{0}=> {}?
l4m2

@ l4m2 ใช่แล้วขอบคุณ!
Steadybox

5

Perl 6 ,  58 52  40 ไบต์

{$/={};.comb.classify({$+=!$/{$_}++}).sort».value».join}

ลองมัน

*.comb.classify({$+=!(%){$_}++}).sort».value».join

ลองมัน

*.classify({$+=!(%){$_}++}).sort».value

ลองใช้
(อินพุตคือรายการของอักขระและเอาต์พุตเป็นรายการของอักขระ)

ขยาย:

*                   # parameter for WhateverCode lambda

  .classify(        # classify that list
    {
        $           # anonymous scalar state variable (accumulator)

      +=            # increment it if:

        !           # Bool invert the following
          (
            %       # anonymous hash state variable
          ){ $_ }++ # look to see if the character was seen already
    }
  ).sort\           # sort the Pairs by key (makes the order correct)
  ».value           # get the value from each Pair

ผลลัพธ์จากclassifyคือ

{ # Hash
  1 => ['m'],
  2 => ['i'],
  3 => ['s','s','i','s','s','i'],
  4 => ['p','p','i'],
}

และ.sortเปลี่ยนเป็น:

[
  1 => ['m'],
  2 => ['i'],
  3 => ['s','s','i','s','s','i'],
  4 => ['p','p','i'],
]

».value ลบกุญแจ

[
  ['m'],
  ['i'],
  ['s','s','i','s','s','i'],
  ['p','p','i'],
]

ทำไมปุ่มต่างๆถึงไม่เป็นระเบียบ? ลำดับการแทรกไม่ได้รับการติดตามเหมือนกับHashMapvs. LinkedHashMapใน Java ซึ่งคำสั่งนั้นอ้างอิงตามหน่วยความจำและลำดับแทรกหรือไม่
Magic Octopus Urn

1
@MagicOctopusUrn ไม่มี Perl รุ่นไหนที่สั่งแฮช ในความเป็นจริง Perl 5 รุ่น 18 ทำให้แฮ็กสุ่มมากขึ้นซึ่งจะช่วยให้การปฏิเสธการโจมตีบริการบางประเภทเป็นไปได้น้อยลงและทำให้รหัสผู้ใช้บั๊กกี้แสดงให้เห็นว่าพฤติกรรมบั๊กกี้บ่อยขึ้น ตอนนี้บางคนสามารถ (และน่าจะมี) ใช้คลาสที่ติดตาม แต่จะใช้เวลามากกว่า 5 ตัวอักษรในการโหลดและใช้งาน
แบรดกิลเบิร์ต b2gills

5

J , 7 ไบต์

~:<;.1]

ลองออนไลน์!

คำอธิบาย

โอกาสของ Nub ตะแกรงส่องประกาย!

~: <;.1 ]
        ]  Input
~:         Nub sieve (1 if the character is the first instance in string)
    ;.1    Split input on 1s in nub sieve
   <       And box each

2
ผมกำลังจะโพสต์เหมือนกัน (ไม่น่าแปลกใจ) คำตอบมันเป็นเรื่องดีที่ผมเหลือบมองไปส่งของคุณก่อนที่ :)
เลน Ivanov

2
@ GalenIvanov I - และฉันนึกภาพนักกอล์ฟ J คนอื่น ๆ ส่วนใหญ่เช่นกัน - เพลิดเพลินกับโอกาสที่จะใช้ตะแกรง nub หรือจัดประเภทตัวเอง
โคล

5

แต่ แต่ ... โอ้ฉัน
Adám

ฉันสงสัยว่าคุณอาจโพสต์ความท้าทายนี้เนื่องจากดั้งเดิม (⊆) ใหม่ ไม่ชัด :)
ngn

ดูเหมือนเคอร์บี้จะถือขวดนม
Magic Octopus Urn

สำหรับทุกคนที่ต้องการที่จะดูขึ้น "เคอร์บี" เหมือนผม - มันเป็นลูกสีชมพูมนุษย์จากวิดีโอเกมญี่ปุ่น
NGN

5

05AB1E , 8 ไบต์

Ùvyy¶ì.;

ลองออนไลน์!


มักจะส่งออก 1 ก่อนขึ้นบรรทัดใหม่ซึ่งจะคงที่และไม่ได้บ่งบอกถึงการแยกทางเลือก 10 ไบต์ที่ไม่ได้ส่งออกขึ้นบรรทัดใหม่ก่อนหน้านี้คือÙvyy¶ì.;}¦คุณสามารถลองที่นี่ บรรทัดใหม่ก่อนหน้าหรือตามรอยของอดัมเป็นที่ยอมรับ


Input      = mississippi                               | Stack
-----------#-------------------------------------------+----------------------------------
Ù          # Push unique letters of first input.       | ['misp']
 v         # Iterate through each unique letter.       | []
  yy       # Push 2 copies of the letter (or yD)       | ['m','m']
    ¶      # Push a newline char.                      | ['m','m','\n']
     ì     # Prepended to the letter.                  | ['m','\nm']
      .;   # Replace first instance with '\n + letter' | ['\nmississippi']

หลังจากการทำซ้ำแต่ละครั้งเราจะได้รับ:

['\nmississippi'] > ['\nm\nississippi'] > ['\nm\ni\nssissippi'] > ['\nm\ni\nssissi\nppi']

ซึ่งเป็น:

m
i
ssissi
ppi

ดี! เอาชนะฉันด้วยอัตรากำไรขั้นต้นที่ดี;)
Emigna

@Emigna นี่มันเป็นความเห็นในคำตอบของคุณเป็นเวลา 2 วันจากนั้นฉันเพิ่งโพสต์มัน b / c ไม่มีการตอบสนอง haha: P
Magic Octopus Urn

แปลกประหลาดไม่เห็นการแจ้งเตือนใด ๆ ต่างกันพอสำหรับคำตอบของมันเอง :)
Emigna

@Emigna ดีฉันหมายความว่าฉันลบมันฮ่าฮ่า
Magic Octopus Urn

ÙSD¶ì.;กระโดดข้ามห่วงบันทึกไบต์ ไม่แน่ใจว่าทำไมเราไม่คิดอย่างนั้นมาก่อน: P
Emigna

5

Haskell , 39 ไบต์

foldl(\s c->s++['\n'|all(/=c)s]++[c])""

ลองออนไลน์!

แทรกสัญลักษณ์ขึ้นบรรทัดใหม่ต่อหน้าอักขระทุกตัวที่ปรากฏขึ้นเป็นครั้งแรกส่งผลให้เกิดสตริงที่คั่นด้วยการขึ้นบรรทัดใหม่ด้วยการขึ้นบรรทัดใหม่ เตรียมที่lines.จะผลิตรายการ


Haskell , 55 ไบต์

(""%)
_%[]=[]
p%s|(a,b)<-span(`elem`s!!0:p)s=a:(a++p)%b

ลองออนไลน์!

ใช้คำนำหน้าอักขระแรกซ้ำแล้วซ้ำอีกรวมถึงอักขระที่ไม่ซ้ำกันซึ่งตามมา


@WheatWizard linesอ๊ะใช่
xnor

อาจต้องการที่tail.linesจะลบสตริงว่างเปล่าตอนนี้ที่ฉันคิดเกี่ยวกับมัน
ข้าวสาลีตัวช่วยสร้าง

4

APL (Dyalog)ขนาด 9 ไบต์

ขอบคุณ Erik the Outgolfer ที่ช่วยประหยัด 1 ไบต์!

⊢⊂⍨⍳∘≢∊⍳⍨

ลองออนไลน์!

คำอธิบาย:

⍳⍨: สำหรับตัวละครแต่ละตัวรับดัชนีการเกิดขึ้นครั้งแรก เช่นmississippi -> 1 2 3 3 2 3 3 2 9 9 2

⍳∘≢: ช่วงจาก 1 ถึงความยาวของอินพุต

: การเป็นสมาชิก เช่น1 2 3 4 5 6 7 8 9 10 11∊1 2 3 3 2 3 3 2 9 9 2 -> 1 1 1 0 0 0 0 0 1 0 0

⊢⊂⍨: พาร์ทิชันสตริงการป้อนข้อมูลที่มีพาร์ทิชันใหม่เริ่มต้นที่1s ในเวกเตอร์ข้างต้น


9 ไบต์ (monadic fgและ monadic f∘gทำงานเหมือนกัน)
Erik the Outgolfer

ทำไมแทน=?
อดัม

ในช่วงเวลาของการเขียนฉันไม่ได้พิจารณาว่าดัชนีจะอยู่ในตำแหน่งที่ถูกต้อง แม้ว่าจะเป็นที่ชัดเจนว่าพวกเขา
H.PWiz

4

Japt , 11 ไบต์

‰ r@=iRUbY

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

คำอธิบาย

นี้ได้รับแรงบันดาลใจจากเมจิกปลาหมึกโกศ 's วิธีการแก้ปัญหา 05AB1E

‰ r@=iRUbY    Implicit: U = input string
‰             Split U into chars, and keep only the first occurrence of each.
   r@          Reduce; for each char Y in this string...
        UbY      Find the first index of Y in U.
      iR         Insert a newline at this index in U.
     =           Set U to the result.
               As reduce returns the result of the last function call, this gives the
               value of U after the final replacement, which is implicitly printed.

1
Japt กำลังประสบวิกฤตตัวตนที่นี่เรียกตัวเองว่า Ruby ด้วยเหตุผลบางอย่าง iRUbY!
Magic Octopus Urn

3

JavaScript (ES6), 37 ไบต์

บันทึกแล้ว 7 ไบต์: ขึ้นบรรทัดใหม่อย่างชัดเจน (ขอบคุณ @Shaggy!)

รับอินพุตเป็นอาร์เรย์ของอักขระ ส่งออกสตริงที่คั่นด้วยบรรทัดใหม่

s=>s.map(c=>s[c]=s[c]?c:`
`+c).join``

กรณีทดสอบ


อนุญาตให้ขึ้นบรรทัดใหม่ได้เพื่อให้คุณสามารถลดขนาดลงได้ถึง37 ไบต์
Shaggy

3

brainfuck, 66 ไบต์

,[>+[<[>+<<-<+>>-]>[>]<<[[+]++++++++++.>>>]<]<[>+<-]>>>[>>]<<-.>,]

จัดรูปแบบ:

,
[
  >+
  [
    <[>+< <-<+>>-]
    >[>]
    <<[[+]++++++++++.>>>]
    <
  ]
  <[>+<-]
  >>>[>>]
  <<-.>,
]

ลองออนไลน์

ขึ้นบรรทัดใหม่ชั้นนำในการส่งออก (ซึ่งจะมีการพิมพ์เฉพาะถ้าใส่เป็นไม่ว่างเปล่า) ที่สามารถถอดออกค่าใช้จ่ายของ 5 ไบต์โดยการเปลี่ยนร่างกายxของหลัก (นอก) .>,[x]กับวง



2

K4 , 19 ไบต์

วิธีการแก้:

$[#x;(*:'.=x)_;,]x:

ตัวอย่าง:

q)k)$[#x;(*:'.=x)_;,]x:"mississippi"
,"m"
,"i"
"ssissi"
"ppi"
q)k)$[#x;(*:'.=x)_;,]x:"P P & C G"
,"P"
" P "
"& "
"C "
,"G"
q)k)$[#x;(*:'.=x)_;,]x:"AAA"
"AAA"
q)k)$[#x;(*:'.=x)_;,]x:"Adam"
,"A"
,"d"
,"a"
,"m"
q)k)$[#x;(*:'.=x)_;,]x:""
,[""]

คำอธิบาย:

8 ไบต์เป็นเพียงการจัดการ""...

$[#x;(*:'.=x)_;,]x: / the solution
                 x: / save input as variable x
$[  ;         ; ]   / $[condition;true;false]
  #x                / length of x ("" has length 0, i.e. false)
             _      / cut right at left indices
     (      )       / do together
          =x        / group x into key/value (char!indices)
         .          / return value (get indices)
      *:'           / first (*:) each
               ,    / enlist, "" => [""]

2

Python 2 , 81 74 ไบต์

def f(s):d=sorted(map(s.find,set(s)));print map(lambda a,b:s[a:b],d,d[1:])

ลองออนไลน์!



@JanathanAllan มันเป็นผลข้างเคียงที่ทำให้เข้าใจผิดsetอย่าทำตามคำสั่งต่อต้าน ->s='c'*6+'a'*100+'b'
Rod

ฉันรู้ว่าเราไม่สามารถพึ่งพามันได้ในการใช้งานในอนาคต แต่ฉันเชื่อว่าได้รับจำนวนเต็มที่สั่งซื้อเรารักษาลำดับในชุดเนื่องจากการแฮชของจำนวนเต็มเป็นจำนวนเต็ม (ตามที่คุณแสดงเหมือนกันไม่เป็นความจริงสำหรับวัตถุอื่น ๆ คำที่ใช้ไม่ได้กับทางเลือกของฉัน?)
Jonathan Allan


อ้าพอใช้ความเชื่อของฉันมันผิด!
Jonathan Allan


2

Perl, 30 ไบต์

รวม+1สำหรับp

ให้อินพุตโดยไม่ขึ้นบรรทัดใหม่ใน STDIN เอาต์พุตก็ไม่ขึ้นบรรทัดใหม่ด้วย:

echo -n adam | perl -pE 's%.%$v{$&}+++!pos?$&:$/.$&%eg'; echo

หากคุณไม่สนใจเกี่ยวกับชั้นนำและต่อท้ายบรรทัดใหม่นี้25( +3สำหรับ-pเนื่องจากรหัสมี') นอกจากนี้ยังทำงาน:

#!/usr/bin/perl -p
s%%$/x!$v{$'&~v0}++%eg

ทางออกที่ดีเช่นเคย! ${$&}++ขึ้นอยู่กับกรณีทดสอบที่มีให้คุณไม่ต้องตั้งชื่อแฮชของคุณที่คุณสามารถทำได้ มันไม่ได้แข็งแกร่ง แต่อาจพอเพียงสำหรับความท้าทายนี้? นอกจากนี้ยังมีฉันทามติเกี่ยวกับเมตาที่perl -pไม่จำเป็นต้องมีไบต์เพิ่มเติมคุณเพียงแค่ต้องมีส่วนหัวPerl with `-p` แทนที่จะเป็นเพียง Perl ฉันพยายามที่จะจำได้ว่าจะทำอย่างไรที่ตัวเอง ...
Dom เฮสติ้งส์

@DomHastings คำอธิบายประกอบเกี่ยวกับสตริงที่เป็นไปได้มากที่สุด 95 รายการค่อนข้างมีนัยมากซึ่งบ่งบอกว่า1ใช้ได้ในกรณีที่vจำเป็น เกี่ยวกับการนับฉันมักจะติดตามcodegolf.meta.stackexchange.com/a/7539/51507ซึ่งสำหรับฉันนั้นเป็นเมตาโพสต์ที่สอดคล้องที่สุดเกี่ยวกับการนับ perl
Ton Hospel

ยินดีที่ได้เรียนรู้จากอาจารย์เสมอ โดยเฉพาะในกรณีนี้&~v0สำหรับการจับตัวละครตัวแรก ขอบคุณที่เข้าร่วมเว็บไซต์นี้และแบ่งปันความเชี่ยวชาญอันยาวนานของคุณ
msh210

คุณสามารถใช้ Strawberry Perl ซึ่งใช้"แทน'ด้วย-eแล้วคุณสามารถนับ-epเป็น +1 แทนที่จะเป็น +3 (ทดสอบแล้ว)
msh210

2

JavaScript, 61 54 52 ไบต์

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

s=>s.map(x=>a[x]?a[y]+=x:a[x]=a[++y]=x,a=[],y=-1)&&a

ลองมัน

o.innerText=JSON.stringify((f=
s=>s.map(x=>a[x]?a[y]+=x:a[x]=a[++y]=x,a=[],y=-1)&&a
)([...i.value=""]));oninput=_=>o.innerText=JSON.stringify(f([...i.value]))
<input id=i><pre id=o></pre>


2

R , 94 87 ไบต์

function(s,n=nchar(s),g=substring)g(s,d<-which(!duplicated(g(s,1:n,1:n))),c(d[-1]-1,n))

ลองออนไลน์!

ส่งคืนรายการสตริงย่อย (อาจว่างเปล่า)

ขอบคุณ Michael M สำหรับการบันทึก 7 ไบต์!


3
function(s,n=nchar(s),g=substring)g(s,d<-which(!duplicated(g(s,1:n,1:n))),c(d[-1]-1,n))จะสั้นลงและแน่นอนน่าเกลียดสักหน่อย ...
Michael M

ทำไมsubstringแทนsubstr?
plannapus

@MichaelM ดีมาก! ฉันยังคงต้องเพิ่มif(n)ในเพราะsubstringโยนข้อผิดพลาดสำหรับการป้อนสตริงที่ว่างเปล่า
Giuseppe

1
@plannapus substrส่งคืนเวกเตอร์ที่มีความยาวเท่ากับอินพุตแรกในขณะที่substringส่งคืนหนึ่งความยาวเท่ากับยาวที่สุดของอินพุต
Giuseppe

@Giuseppe: วาง "if (n)" ใน R 3.4.3 แมปสตริงอินพุตว่าง "" กับสตริงเอาต์พุตว่าง "" ซึ่งควรจะดี (?)
Michael M

2

Stax , 8 ไบต์

ç↓‼►▐NVh

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์

การเป็นตัวแทน ASCII ของโปรแกรมเดียวกันคือสิ่งนี้

c{[Ii=}(m

สำหรับแต่ละอักขระจะแยกเมื่อดัชนีของอักขระปัจจุบันคือตำแหน่งปัจจุบัน

c            copy the input
 {    }(     split the string when the result of the enclosed block is truthy
  [          duplicate the input string under the top of the stack
   I         get the character index of the current character
    i=       is it equal to the iteration index?
        m    print each substring

2

> <> , 22 17 14 ไบต์

-1 ไบต์ต้องขอบคุณ Emigna

i:::a$1g?!o1po

ลองออนไลน์!

พิมพ์บรรทัดใหม่ที่นำหน้าและต่อท้าย

มันจะติดตามว่าตัวอักษรใดที่ปรากฏขึ้นแล้วโดยpการคัดลอกตัวละครที่จุดที่สอดคล้องกันในแถวที่สองและพิมพ์ขึ้นบรรทัดใหม่หากค่าที่ดึงมาจากตำแหน่งนั้นไม่ใช่ 1 สิ้นสุดลงในข้อผิดพลาดเมื่อพยายามพิมพ์-1


ใช้งานได้ดีมากg/p! 16 ไบต์
Emigna


1

JavaScript (ES6), 68 ไบต์

s=>s.map(c=>o[c]?t+=c:(t&&m.push(t),t=o[c]=c),t='',o=m=[])&&[...m,t]

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

กรณีทดสอบ:


ฉันมีวิธีแก้ไขปัญหาที่คล้ายกันและถามว่า[""]เป็นที่ยอมรับสำหรับกรณีทดสอบล่าสุดหรือไม่ แต่มันไม่ได้ :-(
Arnauld

โอ้คุณได้คำตอบที่ดีกว่ามากแล้ว:)
Rick Hitchcock

1

PHP, 317 ไบต์

function SplitOnFirstUnique($s){
    $len = strlen($s); 
    $output = [];
    $newstring = '';
    for ($i=0; $i < $len ; $i++) { 
        $newstring = $newstring.$s[$i];
        if(!in_array($s[$i] , $output  )){
            $output[] = $newstring;
            $newstring = '';
        }
    }
    return $output;
}

ลองออนไลน์!


2
สวัสดีและยินดีต้อนรับสู่ PPCG! ฉันได้แก้ไขโพสต์ของคุณในรูปแบบมาตรฐานของเราและเพิ่มลิงก์ไปยัง Try It Online เพื่อให้ผู้อื่นสามารถทดสอบโค้ดของคุณ จุดมุ่งหมายของ Code Golf คือการเขียนรหัสที่สั้นที่สุดเท่าที่จะเป็นไปได้และฉันสามารถเห็นสองสามวิธีในการทำให้สั้นลงเช่นใช้ชื่อตัวแปรที่สั้นกว่าและออกจากพื้นที่ว่างบางส่วน คุณสามารถตรวจสอบเคล็ดลับทั่วไปและหน้าเคล็ดลับ PHPสำหรับแนวคิดเพิ่มเติม
ไม่ใช่ต้นไม้

1

สีแดง 79 ไบต์

func[s][foreach c next unique/case append s"^@"[print copy/part s s: find s c]]

ลองออนไลน์!

Ungolfed:

f: func [s] [
    b: next unique/case append s "^@"  ; append `null` to the end of the string, than
                                       ; find the unique characters and 
                                       ; store all except the first to b  
    foreach c b [                      ; for each character in b
        print copy/part s s: find s c  ; print the part of the string to
                                       ; where the character is found and
                                       ; set the beginning of the string to that position
    ]
] 

1

SNOBOL4 (CSNOBOL4) , 115 91 77 ไบต์

	N =INPUT
S	N LEN(1) . Y	:F(END)
	S =S Y
	N SPAN(S) . OUTPUT REM . N	:(S)
END

ลองออนไลน์!

พิมพ์สตริงย่อยคั่นด้วยบรรทัดใหม่

คำอธิบาย:

บรรทัดS(ต่อSPLIT) ไม่ได้แยกออกจริง แต่แทนที่จะสารสกัดจากอักษรตัวแรกของNและบันทึก ( .) Yเพื่อ เมื่อวันที่Failure ENDมันกระโดดไป การจับคู่ควรล้มเหลวเมื่อNเป็นสตริงว่างเท่านั้น ดังนั้นเมื่ออินพุตว่างมันจะกระโดดไปที่ENDและไม่แสดงผลใด ๆ

S = S Yconcatenates บนYS

SPAN(S)อย่างตะกละตะกลามตรงกับการทำงานของตัวละครในSและส่งมัน ( .) ถึงOUTPUTการตั้งค่า ( .) Nเพื่อREMตัวอักษร aining ของN(ถ้ามี) Sจากนั้นก็กระโดดกลับไป



1

Ruby , 65 62 58 ไบต์

->s,*a{s.size.times{|i|(i==s.index(c=s[i])?a:a[-1])<<c}
a}

ลองออนไลน์!

แลมบ์ดายอมรับสตริงและส่งคืนอาเรย์ของสตริง

วิธีการ: สำหรับแต่ละดัชนีให้ผนวกอักขระที่ดัชนีนั้นsเข้ากับอาร์เรย์ผลลัพธ์หรือไปยังสตริงสุดท้ายในอาร์เรย์ผลลัพธ์ String#indexส่งคืนดัชนีของอินสแตนซ์แรกของอาร์กิวเมนต์

-2 ไบต์: เตรียมใช้งานaเป็นอาร์กิวเมนต์ splat แทนที่จะเป็นบนบรรทัดของตัวเอง ขอบคุณValue Ink !

-1 ไบต์: ใช้c=s[i]... cแทน...s[i] ขอบคุณValue Ink !s[i]

-4 ไบต์: ใช้.timesแทน.map



1

Java 8, 193 169 155 151 ไบต์

s->{for(int l=s.length(),i=0,j;i<l;i++)if(s.indexOf(s.charAt(i))==i){for(j=i;++j<l&&s.indexOf(s.charAt(j))!=j;);System.out.println(s.substring(i,j));}}

-14 ไบต์ขอบคุณ@raznagul (สำหรับบางสิ่งบางอย่างที่ชัดเจนฉันคิดถึงตัวเอง .. )
-3 ไบต์ขอบคุณ@OOBalance (อีกครั้งสำหรับสิ่งที่ชัดเจนฉันคิดถึงตัวเองอย่างใด .. : S)

คำอธิบาย:

ลองออนไลน์

s->{                    // Method with String parameter and no return-type
  for(int l=s.length(), //  The length of the input-String
          i=0,j;        //  Index integers
      i<l;i++)          //  Loop `i` from 0 to `l` (exclusive)
    if(s.indexOf(s.charAt(i))==i){
                        //   If the character at index `i` hasn't occurred yet:
      for(j=i;++j<l     //    Inner loop `j` from `i` to `l` (exclusive),
          &&s.indexOf(s.charAt(j))!=j;);
                        //     as long as the character at index `j` has already occurred
      System.out.println(//    Print:
        s.substring(i,j));}}
                        //     The substring of the input from index `i` to `j` (exclusive)

1
if(l<1)ผมไม่คิดว่าคุณต้องการ ถ้าlเป็น0ห่วงไม่ควรจะดำเนินการอยู่แล้วในฐานะเป็น0<0 false
raznagul

@raznagul ไม่แน่ใจว่าฉันพลาดไปได้อย่างไร แต่คุณทำเสร็จแล้ว!
>>>

คุณกำลังตั้งi=0สองครั้ง คุณสามารถบันทึก 3 ไบต์โดยปล่อยอันที่สอง:for(;i<l;i++)
OOBalance

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