Enklactify สตริงเหล่านี้


42

แรงบันดาลใจจากห่วงโซ่ความคิดเห็นนี้ ...

ฉันต้องการenklactออกจากความท้าทายนี้ แต่ฉันไม่สามารถ ...

@ETHproductions เพื่อ enklact (v): เพื่อใช้ตารางการค้นหาโดยใช้ส่วนย่อยที่ประกอบด้วยองค์ประกอบที่ไม่ซ้ำกัน


Enklacting เป็นวิธีที่มีประโยชน์มากในการบีบอัดตารางการค้นหา ตัวอย่างเช่นสมมติว่าคุณมีรายการสีดังต่อไปนี้:

red
green
blue
yellow
purple
orange

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

["red", "green", "blue", "yellow", "purple", "orange"].index(input())

แต่มีวิธีที่เราสามารถทำได้ในทางที่น้อยกว่าไบต์:

"rgbypo".index(input()[0])

สิ่งนี้ได้ผลเพราะดัชนีแรก (หรือ 0'th) ของแต่ละสตริงนั้นไม่ซ้ำกัน ตัวอย่างนี้ชัดเจน แต่บางครั้งก็ยากขึ้นเล็กน้อย ถ้าเราต้องการสร้างตารางการค้นหาสำหรับรายการนี้

Sweet Onion Chicken Teriyaki
Oven Roasted Chicken
Turkey Breast
Italian BMT
Tuna
Black Forest Ham
Meatball Marinara

ในกรณีนี้เราไม่สามารถทำได้:

"SOTITBM".index(input()[0])

เพราะมีสองอินพุตที่ต่างกันที่เริ่มต้นด้วย a 'T'คือ "ปลาทูน่า" และ "ตุรกี" เราต้องดูดัชนีอื่น หากคุณดูที่ดัชนีที่ 4 ของแต่ละสตริงคุณจะสังเกตเห็นว่ามันไม่ซ้ำกันทั้งหมด ดังนั้นเราสามารถทำสิ่งนี้ ...

"enklact".index(input()[3])

ในกรณีนี้สตริง "enklaction"คือ "enklact"

นั่นนำเราสู่ความท้าทายในปัจจุบัน ...

รับรายการสตริงส่งคืนสตริง enklaction ที่ถูกต้อง หรือกล่าวอีกอย่างหนึ่งคือให้รายการของสตริงส่งคืนสตริงใหม่ที่ตัวอักษรแต่ละตัวไม่ซ้ำกันและสตริงนั้นเกิดจากการรวมตัวอักษร i'th ของแต่ละสตริง

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

แต่ละสตริงจะมีเฉพาะ ASCII ที่พิมพ์ได้และความท้าทายนี้จะต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก

นี่คือดังนั้นพยายามเขียนโปรแกรมสั้นที่สุดในภาษาที่คุณเลือก!

กรณีทดสอบ

Input:
Programming
Puzzles
Code
Golf

Output (any one of these):
"ozdl"
"gzef"


Input:
the quick
brown fox
jumped over
lazy dogs

Output:
"tbjl"
"hrua"
"eomz"
" wpy"
"qne "
"if o"
"kxvs"

Note that "u dd" and "coog" are not valid.


Input:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

Output:
""


Input:
AbC
aBc
bbC

Output:
"Aab"


Input:
@#$%^_
Hello_World
How are you?

Output:
"#eo"
"$lw"
"%l "
"^oa"


Input:
a
ab
ac

Output:
""

เราสามารถส่งคืนรายการสตริงที่ใช้ได้หรือไม่?
LyricLy

@LyricLy อืมตอนนี้ฉันก็คิดถึงมันแล้ว แต่เนื่องจากมีคำตอบอยู่แล้วและมันก็ไม่มากเกินไปสำหรับการส่งคืนแรกฉันจะบอกว่าไม่ควรเป็นสตริงที่ใช้ได้
DJMcMayhem

เราสามารถรับประกันได้ว่าสตริงที่ป้อนเข้านั้นว่างเปล่าหรือไม่?
musicman523

6
ค่าเท็จที่สอดคล้องกันสามารถเป็นข้อผิดพลาดของประเภทที่สอดคล้องกันได้หรือไม่
Stewie Griffin

2
ขอโทษนะ แต่ฉันคิดว่าคำกริยาที่ถูกต้องคือenklactate
Erik the Outgolfer

คำตอบ:


8

Python3, 59 ไบต์

lambda l:{len({*d}):''.join(d)for d in zip(*l)}.get(len(l))

ส่งคืนสตริงที่มี enklact, None เป็นอย่างอื่น


8

Python 2 , 68 67 61 ไบต์

lambda a:`{0:j for j in zip(*a)if len(set(j))==len(j)}`[6::5]

ลองออนไลน์!

ปรับปรุง

  • จาก 68 ไบต์ถึง 67 ไบต์โดยJo King
  • จาก 66 ถึง 65 ไบต์โดยLynn

หากเอาต์พุตไม่จำเป็นต้องเป็นสตริง:

Python 3 , 49 ไบต์

lambda a:[j for j in zip(*a)if len({*j})==len(j)]

ลองออนไลน์!



@ JoKing สง่างามและดำเนินการ
Neil

ฉันคิดว่าmax(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))ใช้ได้ผลเพื่อช่วยประหยัดไบต์
Lynn

@Lynn ขอบคุณและอัปเดต
Neil

7

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

+/^(.).+^\1|^$/ms&m`^.

|""Lm`^.

ลองออนไลน์! แก้ไข: บันทึก 11 ไบต์ขอบคุณ @MartinEnder คำอธิบาย:

+

ทำซ้ำในขณะที่อินพุตเปลี่ยน ...

/^(.).+^\1|^$/ms&

... เฉพาะเมื่อหนึ่งบรรทัดว่างเปล่าหรือสองบรรทัดเริ่มต้นด้วยอักขระเดียวกัน ...

m`^.

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

|""L`^.

รวบรวมอักขระตัวแรกของทุกบรรทัด (หากไม่มีวิธีแก้ปัญหาห่วงด้านบนจะลบทุกอย่างและจะไม่มีการรวบรวม)


ตัวเลือก Regex ยังใช้ตัวดัดแปลง regex (โดยเขียนโดยตรงหลังจากตัวคั่นการปิด): tio.run/##K0otycxLNPz/ …
Martin Ender

ที่จริงแล้วช่วยให้คุณกำจัดขั้นตอนที่สองได้อย่างสิ้นเชิง: tio.run/##K0otycxLNPz/X1s/ … (อย่างใดไม่สามารถใช้mกับกลุ่มที่นี่ดูเหมือนว่าขั้นตอนตามเงื่อนไขจะไม่แพร่กระจายตัวเลือก)
Martin Ender

แน่นอนว่าคุณวนลูปแบบมีเงื่อนไขแทนลูปแบบมีเงื่อนไขซึ่งจะแก้ข้อผิดพลาดวนซ้ำไม่สิ้นสุดในเวอร์ชันแรกของคุณ เรียบร้อยมาก!
Neil

5

Haskell , 71 ไบต์

f x|elem""x=""|y<-head<$>x,and[filter(==a)y==[a]|a<-y]=y|1<2=f$tail<$>x

ลองออนไลน์!

BMO บันทึก 3 ไบต์ด้วย→any null xelem""x

Orjan Johansen บันทึกไบต์ที่มี→sum[1|b<-y,a==b]<2filter(==a)[y]==[a]

คำอธิบาย

f x|elem""x=""                      -- Once any of the strings is empty, return "".
   |y<-head<$>x                     -- Otherwise, let y be all the first letters...
   ,and[                 |a<-y]     -- If, for all a in y,
        filter(==a)y==[a]           -- a occurs just once in y:
                               =y   -- return y.
   |1<2=f$tail<$>x                  -- Else, chop off all the first letters and recurse.

ถ้าโยนข้อผิดพลาด ( Prelude.head: empty list) เมื่อมีการแก้ปัญหาไม่เป็น OK |elem""x=""สามารถลบสำหรับ61 ไบต์


1
การทดสอบที่สั้นกว่า:filter(==a)y==[a]
Ørjan Johansen

4

Ruby , 38 ไบต์

->x,*y{x.zip(*y).find{|z|z==z-[p]|[]}}

ลองออนไลน์!

ขอขอบคุณที่ GB สำหรับการชี้จุดบกพร่อง


ล้มเหลวหากไม่มีการจับคู่และสตริงแรกไม่สั้นที่สุด
GB

@GB คุณช่วยยกตัวอย่างได้ไหม ฉันแก้ไขการทดสอบครั้งสุดท้ายตามคำอธิบายของคุณและใช้งานได้
คิริลล์ลิตร

ลอง ["abc", "ac", "acd"]
GB

ตอนนี้ฉันเห็นแล้วคุณพูดถูก ควรได้รับการแก้ไข
Kirill L.

4

Pyth , 6 ไบต์

>1{I#C

ชุดทดสอบ

เอาท์พุทเป็นรายการเดี่ยวขณะที่ได้รับอนุญาตโดยค่าเริ่มต้น ; รายการ[] (รายการที่ว่างเปล่า falsy) จะถูกส่งกลับในกรณีที่สายไม่สามารถenklactified

คำอธิบาย

> 1 {I # C - โปรแกรมเต็มรูปแบบ
     C - โอนย้ายอินพุตขาดการปลูกพืช
    # - กรองตาม:
  {I - ค่าคงที่ภายใต้การคัดลอกซ้ำ
> 1 - Slice ถึง 1. list [: 1] ใน Python

Pyth , 5 ไบต์

สิ่งนี้จะใช้ได้ถ้าการชนจะนับว่าเป็นค่าที่ไม่ถูกต้อง

h{I#C

ชุดทดสอบ


3

Haskell , 76 74 ไบต์

f t=last$"":(id=<<foldr(zipWith(#))([[]]<$t)t)
x#[s]=[x:s|all(/=x)s]
x#e=e

ลองออนไลน์! ส่งคืนสตริงการค้นหาที่ถูกต้องครั้งสุดท้ายหรือสตริงว่างถ้าไม่มีสตริงดังกล่าวอยู่


71 69 ไบต์

หากการโยนข้อยกเว้นที่สอดคล้องกันเป็นค่าเท็จจะได้รับอนุญาต:

f t=head$id=<<foldr(zipWith(#))([[]]<$t)t
x#[s]=[x:s|all(/=x)s]
x#e=e

ลองออนไลน์! ส่งempty listข้อยกเว้นถ้าไม่พบสตริงส่งคืนสตริงที่ถูกต้องเป็นอย่างอื่น

-2 ไบต์ขอบคุณØrjan Johansen


1
notElem x all(/=x)สามารถลงไป
Ørjan Johansen

2

เยลลี่ขนาด 7 ไบต์

z0Q€fZḢ

ส่งคืนเลขจำนวนเต็ม0หากสตริงไม่สามารถ enklactified

ลองออนไลน์!

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

z0Q€fZḢ  Main link. Argument: A (string array)

z0       Zip/transpose, filling shorter rows with 0.
  Q€     Unique each deduplicate resulting string.
     Z   Zip/transpose, without using a filler.
    f    Filter; keep only string that appear in the results to both sides.
      Ḣ  Head; extract the first string. Returns 0 if the array is empty.


2

Stax , 9 8 ไบต์

åτIⁿs↓µg

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

คำอธิบาย (แยกออก):

M{c0-u=}j Full program, implicit input
          e.g. ["Programming", "Puzzles", "Code", "Golf"]
M         Transpose
                ["PPCG", "ruoo", "ozdl", "gzef", "rl\0\0", "ae\0\0", "ms\0\0", "m\0\0\0", "i\0\0\0", "n\0\0\0", "g\0\0\0"]
 {     }j Find first matching element:
            e.g. "PPCG"
  c0-       Copy and remove zero bytes (padding)
                 "PPCG" "PPCG"
     u      Unique
                 "PPCG" "PCG"
      =     Check if equal:
                 1
          First matching here: "ozdl". If none is found, the stack is empty
          Implicit output if anything on stack

2

R , 127 ไบต์

function(S,s=sapply(S,substring,x<-1:max(nchar(S)+1),x))cat(rbind(s[!apply(s,1,anyDuplicated)&!rowSums(s==""),],"")[1,],sep="")

ลองออนไลน์!

sapplyโดยทั่วไปแล้วจะส่งกลับ a matrixเมื่อทั้งหมดlength(FUN(X[[i]]))เท่ากันยกเว้นเมื่อlength(FUN(X[[i]]))==1ในกรณีที่มันกลับvectorมา เพื่อที่จะใช้ดำเนินงานเมทริกซ์แล้วเราจะต้องsubstringหนึ่งไกลเกินกว่าที่เราจำเป็นต้องรับประกันmatrixซึ่งเป็นเหตุผลที่จะขยายไปสู่xmax(nchar(S)+1)

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

จากนั้นเราจะพิมพ์enklactสตริง ified หรือสตริงว่าง


2

R , 116 107 95 ไบต์

R + pryr

pryr::f(for(i in 1:min(nchar(v)))`if`(anyDuplicated(t<-substr(v,i,i)),0,{cat(t,sep="")
break}))

ลองออนไลน์!

ฐาน R

function(v)for(i in 1:min(nchar(v)))`if`(anyDuplicated(t<-substr(v,i,i)),0,{cat(t,sep="")
v=0})

ลองออนไลน์!

ทั้งสองประหยัด 9 ไบต์ขอบคุณสายพันธุ์จูเซปเป้

คำอธิบาย:

สิ่งนี้จะตัดเหล็กในเวกเตอร์ทั้งหมดvให้มีความยาวสั้นที่สุดและมีการวนซ้ำผ่านดัชนีที่ตามมา การตรวจสอบแล้วว่ามีรายการที่ซ้ำกันใด ๆ catภายในตัวอักษรเลือกและถ้าไม่วางพวกเขาร่วมกันและพิมพ์ด้วย หากดัชนีทั้งหมดส่งคืนผลลัพธ์ที่ซ้ำกันสิ่งนี้จะพิมพ์สตริงว่าง
ทั้งหมดถูกห่อหุ้มในpryrฟังก์ชั่นที่ไม่ระบุชื่อด้วยbreakเพื่อหยุดการวนซ้ำหรือฟังก์ชัน R ฐานเป็นศูนย์เพื่อให้เวกเตอร์หยุดการวนซ้ำ


1
ทำได้ดีนี่! สามารถเล่นได้ถึง107 ไบต์ในR+pryrหรือ107 ไบต์ในฐานอาร์
จูเซปเป้

2

Japt, 9 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระอาร์เรย์ส่งคืนอาร์เรย์อักขระหรือ undefined

y æ_f eZâ

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


คำอธิบาย

y             :Transpose
  æ_          :Pass each array Z through a function and return the first that returns true
    f         :  Filter nulls (used for padding when transposing)
      e       :  Test for equality with
       Zâ     :  Z deduplicated

ฉันพยายามท้าทายออกมาก่อนที่จะอ่านวิธีการแก้ปัญหาของคุณและมีวิธีการแก้ปัญหาเหมือนกันเกือบ:z æ_¬eZ¬â
นิตย์

เหมือนกันทุกประการนอกเหนือจากรูปแบบอินพุต
Shaggy


1

Python 3 , 75 ไบต์

def f(t):c=[s.pop(0)for s in t];return all(t)and(f(t),c)[len(t)==len({*c})]

ดำเนินการกับรายชื่อตัวละครแทนสตริง ส่งคืน False ถ้าไม่มีสตริง enklaction ที่ถูกต้อง

ลองออนไลน์!


ฉันคิดว่าสิ่งนี้ซ้ำซึ่งจะทำให้มันไม่ถูกต้องเว้นแต่f=จะรวมอยู่ในการนับไบต์
LyricLy

@LyricLy แก้ไข :)
musicman523

1

C (gcc) , 161 ไบต์

f(s,i)char**s;{char**t,a[255],*u=a;for(i=0;memset(a,0,255),u&&~i;i+=!!~i&&u)for(t=s;(u=u?*t++:0)&&~(i=u[i]?i:-1)&&!a[u[i]]++;);while(~i&&(u=*s++))putchar(u[i]);}

ลองออนไลน์!

ตำแหน่งอักขระแต่ละตัวจะได้รับการทดสอบสำหรับการทำซ้ำและข้ามหากตรวจพบการซ้ำซ้อน สิ่งนี้จะดำเนินต่อไปจนกว่าสตริงที่สั้นที่สุดจะสิ้นสุดลง เป็น ASCII เท่านั้นน่าเศร้า: สตริง DBCS / UTF-8 ทำให้ฟังก์ชันนี้แย่มาก!



1

Japt , 12 ไบต์

ส่งคืนundefinedสำหรับสตริงที่ไม่ใช่ enklactic

y ·æ_¬n ä¦ e

ลองออนไลน์!

คำอธิบาย:

y ·æ_¬n ä¦ e
y             // Split the input at newlines and transpose
  ·           // Join on newlines 
   æ_         // Return the first item that returns truthy when ran through:
     ¬n       //   Sort
        ä¦    //   Reduce with !=
           e  //   All items are truthy (unique)

คุณควรจะสามารถบันทึกได้ 2 ไบต์โดยรับอินพุตเป็นอาร์เรย์ของอักขระอาร์เรย์และทิ้งสองsplits
Shaggy

1

ภาษา Wolfram (Mathematica) , 54 ไบต์

#&@@Select[PadRight@#,#~FreeQ~0&&Union@#==Sort@#&]&

ลองออนไลน์!

รับรายการของตัวละครเป็นอินพุตส่งคืนรายการของตัวละคร มี U + F3C7 ซึ่งสอดคล้องกับตัวดำเนินการ "Transpose"

ส่งคืน#1และส่งข้อผิดพลาดจำนวนมากที่สามารถละเว้นได้เมื่อไม่มีสตริงที่เหมาะสม

คำอธิบาย:

PadRight@#

แพดอินพุตเพื่อให้ "สตริง" (รายการอักขระ) แต่ละรายการมีความยาวเท่ากัน ต่อท้ายจำนวนเต็ม0s (ไม่ใช่สตริง"0") จากนั้นขนย้าย

Select[ ... ,#~FreeQ~0&&Union@#==Sort@#&]

เลือกสตริงที่ไม่มีจำนวนเต็ม0และมีอักขระที่ไม่ซ้ำกันทั้งหมด

#&@@

รับอันแรก


1

JavaScript (ES6), 66 ไบต์

ส่งคืนสตริงหรือundefinedถ้าไม่มีวิธีแก้ไข

f=(a,i=0)=>a.every(s=>(o[k+=c=s[i],c]^=1)&&c,o=k=[])?k:c&&f(a,i+1)

ลองออนไลน์!

แสดงความคิดเห็น

f = (           // f = recursive function taking:
  a,            //   a[] = input array
  i = 0         //   i   = pointer
) =>            //
  a.every(s =>  // for each string s in a[]:
    (o[k +=     //   append to the key string k
      c = s[i], //   the character c at position i in s
      c] ^= 1   //   and toggle o[c] (undefined -> 1 -> 0)
    ) && c,     //   additionally, make sure that c is defined
    o = k = []  //   start with o = k = empty array
  ) ?           // every() is true if all characters were distinct and defined:
    k           //   in which case we return k
  :             // else:
    c &&        //   provided that every() didn't fail because of an undefined character,
    f(a, i + 1) //   try again at the next position

1

ถ่าน , 23 21 ไบต์

-2 ไบต์ขอบคุณ@Neil !

§ΦE⌊EθLι⭆θ§λι⬤ι⁼¹№ιλ⁰

ลองออนไลน์!


หืมเมื่อไหร่ก) qหยุดเป็นสตริงเสมอ) StringMap เริ่มทำงานกับสตริงไม่ใช่? อย่างไรก็ตามคุณRangeไม่จำเป็นต้องประหยัด 2 ไบต์
Neil

@Neil a) เมื่อฉันเพิ่มอาร์เรย์ / อินพุตวัตถุ b)> _> ฉันไม่แน่ใจ อาจประมาณเวลาที่ฉันแก้ไขวงขณะที่ (ขออภัยลืมพูดถึงอย่างใดอย่างหนึ่ง)
ASCII- เท่านั้น

1

Husk , 9 ไบต์

ḟS=UḞz:∞ø

ลองออนไลน์!

คำอธิบาย

fS=UḞz:∞ø
    Ḟz:∞ø  Transpose the input dropping characters of longer strings
    Ḟ        Fold right
     z:      Zip with prepend
       ∞ø    Infinite list of empty lists
ḟS=U       Find the first string without duplicates, returns an empty string if none
ḟ            Return first value satisfying predicate
  =          Equal
 S U         to itself with duplicates removed

การใช้←ġLTเกินḞz:∞øควรบันทึกไบต์
ბიმო

1

เรติน่า , 81 56 ไบต์

m`$
$.=*£¢
N$`.
$.%`
¶

~`(.*?¢)+
L`.{$#1}
A`(.).*\1|£|¢

ลองออนไลน์!

-25 ไบต์ขอบคุณ @Neil


การย้ายข้อความสี่เหลี่ยมใน Retina เป็นเรื่องยากอย่างน่าประหลาดใจ


ฉันหวังว่าฉันรู้ว่าวิธีที่ดีกว่าในการดำเนินการขนย้ายเป็นรูปสี่เหลี่ยมผืนผ้า แต่ในเวลาเฉลี่ยที่บันทึก 25 ไบต์
Neil

@ Neil Ahh ... เวที eval ฉันลืมจอประสาทตา 1.0 เสมอว่ามีฟีเจอร์ใหม่ที่ยอดเยี่ยมทั้งหมด
TwiNight

1

Perl 6 , 27 ไบต์

{([Z] $_).first:{.Set==$_}}

ลองออนไลน์!

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

รุ่นที่เก่ากว่าของฉันและการส่งที่ถูกต้องมากขึ้นมีดังนี้:

Perl 6 , 38 ไบต์

แยก, ซิป, ตรวจสอบความเป็นเอกลักษณ์, เข้าร่วม

{[~] ([Z] @_>>.comb).first:{.Set==$_}}

ลองออนไลน์!


1

C (gcc) , 121 113 110 ไบต์

i;d;f(s)char**s;{char**_=s,x[255]={0},y[99]={0};for(d=i=0;*_;)d+=x[y[i++]=*(*_++)++]++;d=d?*x?0:f(s):puts(y);}

ลองออนไลน์!

Ungolfed

void enklactify(char *strings[]) {
    int quit = 0;
    while (!quit) {
        char **arg = strings;      // current row
        int exists[255] = {0};     // which characters exist in the column
        char output[99] = {0};     // will hold output string
        int index = 0;             // where to insert in output
        int duplicates = 0;        // have we found any duplicates?
        while (*arg != NULL) {
            char *word = *arg;     // current word
            char first = *word;    // first letter of current word
            if (exists[first])
                duplicates = 1;    // we found a duplicate
            exists[first] = 1;     // mark it as in our string
            output[index] = first; // add it to our output
            index++;
            (*arg)++;              // advances the current word to the next
                                   // character by reference (chops first char)
            arg++;                 // advance to next whole argument
        }

        if (!duplicates) {         // This is a valid solution
            puts(output);
            quit = 1;
        }

        if (exists[0]) {           // We hit the null terminator of one of the
                                   // input strings, so we failed
            quit = 1;
        }
    }
}

-3 ขอบคุณแมวเพดาน

การละเมิดนี้ทำให้ความสามารถในการเพิ่ม 1 ไปยังตัวชี้สตริงใน C เพื่อรับ 'ส่วนท้าย' ของสตริง ตัวรักษาไบต์หลักคือ:

  • d+=x[y[i++]=*(*_)++]++ซึ่งจะผนวกอักขระตัวแรกของสตริงแรกของ_เป็นy, เลื่อนไปที่สตริงแรกของ_เพื่อลบอักขระตัวแรกของมัน, เพิ่มxรายการที่อักขระนั้นไปที่d, และส่วนเพิ่มกล่าวถึงxรายการ
  • q=d?*x:puts(y)ซึ่งพิมพ์yถ้าdไม่เป็นศูนย์ในขณะที่การตั้งค่าเป็นค่าqที่ไม่เป็นศูนย์หรือตั้งค่าqที่ไม่เป็นศูนย์หากองค์ประกอบแรกของxไม่ใช่ศูนย์ (ถ้าเราอยู่ที่จุดสิ้นสุดของหนึ่งในสตริงแล้วกล่าวว่าองค์ประกอบจะไม่ใช่ - ศูนย์)

แก้ไข: โกนเป็นไบต์ด้วยการสลับจากขณะที่วนซ้ำเป็นการเรียกหางแบบวนซ้ำและลบวงเล็บจากสำหรับวงวน


แนะนำfor(d=i=0;*_;)แทนfor(d=0,i=0;*_;++_)และ*(*_++)++]++;d=d?!*x*f(s)แทนที่*(*_)++]++;d=d?*x?0:f(s)
ceilingcat

0

Pyth, 13 ไบต์

e+kf{IT@.TQ.t

ลองที่นี่

e+kf{IT@.TQ.t
           .tQ   Transpose the (implicit) input with padding.
        .TQ      Transpose the input without padding.
       @         Take the strings in both.
   f{IT          Find the ones that have no duplicates.
e+k              Get the last, or an empty string.

1
ดูเหมือนว่าการส่งคืนรายการของสตริงที่ถูกต้องทั้งหมดไม่ถูกต้อง
LyricLy

@LyricLy แก้ไขแล้ว
ช่วยในการจำ

0

สีแดง 139 ไบต์

func[b][m: length? first b foreach a b[m: min m length? a]repeat n m[c: copy[]foreach a b[append c a/(n)]if c = unique c[return rejoin c]]]

ลองออนไลน์!

คำอธิบาย:

รับอินพุตเป็นบล็อก (รายการ) ของสตริง ส่งคืนสตริงenklactionหรือnoneอย่างอื่น

f: func[b][
    m: length? first b                   ; the minimal length of the first string  
    foreach a b[m: min m length? a]      ; find the minimal length of all strings
    repeat n m[                          ; limit the search to the minimal length
        c: copy[]                        ; an empty block  
        foreach a b[append c a/(n)]      ; for each string append the current char
        if c = unique c[return rejoin c] ; if all chars are unique, return the block
    ]  
]

0

Röda , 80 77 ไบต์

f a{a|seq 0,#_|try{{|i|a|[_[i:i+1]]|orderedUniq|concat|[_]if[#_1=#a]}_|head}}

ลองออนไลน์!

-1 ไบต์ต้องขอบคุณนักต้มตุ๋นวัว

คำอธิบาย:

f a{
  a|         /* Push the strings in a to the stream */
             /* For each string (_): */
  seq 0,#_|     /* Push a range from 0 to the length of _ to the stream */
  try{       /* Ignore errors during the following block */
    {|i|        /* For each i in the stream: */
      a|           /* Push strings in a to the stream */
      [_[i:i+1]]|  /* For each string, push the ith character to the stream */
      orderedUniq| /* Remove duplicate characters */
      concat|      /* Join the characters into a string */
      [_]if        /* Push the string to the stream if */
      [#_1=#a]     /* Its length is the length of a */
    }_|
    head        /* Take the first string in the stream and return it */
  }
}

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


คุณสามารถลบ parens seqเพื่อบันทึก byte
Kritixi Lithos

@ Cowquack ขอบคุณ!
fergusq

0

Java 10, 106 ไบต์

a->{for(int i=0;;i++){var r="";for(var s:a)r+=s[i];if(r.length()==r.chars().distinct().count())return r;}}

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

ลองออนไลน์

คำอธิบาย:

a->{                  // Method with character-matrix parameter and String return-type
  for(int i=0;;i++){  //  Loop `i` upwards
    var r="";         //   Result-String, starting empty
    for(var s:a)      //   Loop over the character-arrays of the input
      r+=s[i];        //    And append every `i`'th character to `r`
    if(r.length()==r.chars().distinct().count())
                      //   If `r` only contains unique characters
      return r;}}     //    Return `r` as result

OP ดูเหมือนจะไม่ต้องการที่จะอนุญาตให้มีข้อผิดพลาดแม้ว่าจะยอมรับไม่ได้ใส่ไว้ในโพสต์เอง
Ørjan Johansen


0

APL + WIN, 35 33 ไบต์

บันทึก 2 ไบต์ด้วยAdám

พร้อมต์สำหรับบรรทัดของข้อความเป็นเมทริกซ์อักขระ:

⊃((↑⍴¨a)=+/¨((a⍳¨a)=⍳¨⍴¨a))/a←,⌿⎕

ลองออนไลน์! ความอนุเคราะห์จาก Dyalog Classic

คำอธิบาย:

a←,⌿⎕ prompts for input and creates a nested vector of the input matrix columns

((a⍳¨a)=⍳¨⍴¨a) creates a binary vector for each nested element with a 1 for each unique element

((↑⍴¨a)=+/¨ sums each binary vector and compares to number of characters in each element

(...)/a←⊂[1]⎕ selects only those elements where number of uniques = column length

⊃ converts nested vector back to a matrix of each valid enklaction string 

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