อักขระที่ไม่ซ้ำกันตัวที่สองคืออะไร


18

ตามคำถามนี้จากการตรวจสอบรหัส

กำหนดสตริงอักขระ ASCII ที่ไม่สามารถพิมพ์ได้และว่างเปล่าเอาท์พุทอักขระที่ไม่ซ้ำตัวที่สอง ตัวอย่างเช่นสำหรับการป้อนข้อมูลการส่งออกDEFDF

อินพุต

  • สายเดียวในรูปแบบที่เหมาะสมใด

เอาท์พุต

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

กฎระเบียบ

  • อัลกอริทึมควรละเว้นกรณีและปัญหา นั่นคือDและdนับเป็นตัวละครเดียวกัน
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • สตริงอินพุตจะได้รับการรับประกันว่าไม่ว่างเปล่า (เช่นอย่างน้อยหนึ่งตัวอักษร)
  • สตริงอินพุตคือ ASCII อักขระที่ถูกต้องใด ๆ สามารถทำซ้ำได้ไม่ใช่แค่ตัวอักษรและตัวเลข (รวมถึงช่องว่าง)
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

อินพุตอยู่บนบรรทัดแรกเอาต์พุตอยู่บนบรรทัดที่สอง

DEFD
F

FEED
D

This is an example input sentence.
x

...,,,..,,!@
@

ABCDefgHijklMNOPqrsTuVWxyz
B

AAAAAABBBBB


Thisxthis


This this.
.

8
ถ้ามันไม่ตรงตามตัวพิมพ์ใหญ่ - เล็กฉันจะลองทำดูที่ Forth แม้ว่าการดำเนินการกับสตริงจะดูดข้อมูลในภาษานั้น
mbomb007

จะทำอย่างไรถ้าภาษาของฉันไม่รองรับอักษรตัวพิมพ์เล็ก
Adám

@ Adámมันใช้หน้ารหัสอื่นหรือไม่? โดยปกติแล้วจะป้อนสตริง ASCII อย่างไรหากไม่รองรับตัวอักษรพิมพ์เล็ก
AdmBorkBork

1
ระบบที่ฉันมีอยู่ในใจมีหน้ารหัส 7 บิต; หน้ารหัสมาตรฐานที่แก้ไขซึ่งตัวอักษรตัวพิมพ์ใหญ่ใช้ตำแหน่งตัวพิมพ์เล็กและตำแหน่งตัวพิมพ์ใหญ่ถูกใช้สำหรับร่ายมนตร์ สิ่งนี้ทำในระบบ APL แบบเก่าเพื่อให้สามารถใช้ Shift เพื่อเข้าถึงร่ายมนตร์ APL ในขณะที่ตัวอักษรที่ไม่เปลี่ยนเป็นตัวพิมพ์ใหญ่ที่เป็นสไตล์การเข้ารหัสแบบคลาสสิก
Adám

คำตอบ:


10

MATL 11 ไบต์

tk&=s1=)FT)

การออกนี้มีข้อผิดพลาด (อนุญาตโดยค่าเริ่มต้น) หากไม่มีอักขระที่ไม่ซ้ำกันที่สอง

ลองออนไลน์!

คำอธิบาย

t      % Implicitly take input string. Duplicate
k      % Convert to lowercase
&=     % 2D array of equality comparisons
s      % Sum of each column
1=     % True for entries that equal 1
)      % Apply logical index to the input string to keep non-repeated characters
TF)    % Apply logical index to take 2nd element if it exists. Implicitly display 

การแก้ไขนินจาปะทะกันอีกครั้ง : P
Dennis

@Dennis Hahaha ฉันเดาว่าคุณจะลบสองสามไบต์เร็ว ๆ นี้
Luis Mendo

10

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

i!2=`(.)(?<!\1.+)(?!.*\1)

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานการเรียกใช้โค้ดในชุดทดสอบของอินพุตหลายอินพุต)

คำอธิบาย

นี่เป็นเพียงการแข่งขัน regex เดียว regex เป็น:

(.)(?<!\1.+)(?!.*\1)

นั่นคือจับคู่อักขระและตรวจสอบให้แน่ใจว่าไม่ปรากฏที่อื่นในอินพุต ส่วนที่เหลือคือการกำหนดค่า:

  • i เปิดใช้งาน case insensitivity
  • ! บอกให้ Retina พิมพ์การแข่งขันแทนการนับ
  • 2= บอกให้ Retina พิมพ์เฉพาะนัดที่สองซึ่งตรงข้ามกับพวกเขาทั้งหมด

1
2=โอ้ขอบคุณสำหรับการเรียนการสอนเกี่ยวกับฉัน
Leun Nun

6

05AB1E, 15 12 ไบต์

l©v®y¢iy}}1@

อธิบาย

l©            # store lower case string in register
  v     }     # for each char in lower case string
   ®y¢iy      # if it occurs once in string, push it to stack
         }    # end if
          1@  # push the 2nd element from stack and implicitly display

ลองออนไลน์

บันทึกแล้ว 3 ไบต์ขอบคุณ @Adnan


หรือ 12 ไบต์l©v®y¢iy}}1@:)
Adnan

@Adnan: ดี! ไม่คิดว่าจะใช้ @
Emigna

5

Python 2, 59 58 ไบต์

ส่งคืนรายการของอักขระเดี่ยวหรือรายการว่างถ้าไม่มีเอาต์พุต (ความไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ... )

s=input().lower();print[c for c in s if s.count(c)<2][1:2]

ลองออนไลน์



มันไม่ถูกต้อง ผู้ใช้ไม่ควรหลีกเลี่ยงการป้อนข้อมูลของพวกเขา
mbomb007

4
แน่นอนค่ะ เราให้รายการใน STDIN ในรูปแบบรายการภาษา เหตุใดสตริงจึงแตกต่างกัน
Dennis

5

เยลลี่ 11 ไบต์

Œlµḟœ-Q$Ḋḣ1

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

Œlµḟœ-Q$Ḋḣ1  Main link. Argument: s (string)

Œl           Convert s to lowercase.
  µ          Begin a new, monadic chain. Argument: s (lowercase string)
       $     Combine the two links to the left into a monadic chain.
      Q        Unique; yield the first occurrence of each character.
    œ-         Perform multiset subtraction, removing the last occurrence of each
               character.
   ḟ         Filterfalse; keep characters that do not appear in the difference.
        Ḋ    Dequeue; remove the first character.
         ḣ1  Head 1; remove everything but the first character.

4

แบตช์ 171 ไบต์

@echo off
set a=.
set s=%~1
:l
if "%s%"=="" exit/b
set c=%s:~0,1%
call set t=%%s:%c%=%%
if "%s:~1%"=="%t%" set a=%a%%c%
set s=%t%
if "%a:~2%"=="" goto l
echo %c%

สูตรทางเลือก 171 ไบต์เช่นกัน:

@echo off
set a=.
set s=%~1
:l
if "%s%"=="" exit/b
set c=%s:~0,1%
set t=%s:~1%
call set s=%%s:%c%=%%
if "%s%"=="%t%" set a=%a%%c%
if "%a:~2%"=="" goto l
echo %c%

ไม่สามารถทำให้มันทำงานบน W2008R2 ได้ บรรทัด "call set ... " ขยายเป็น "call set t =% s: D =%" และยกเลิกด้วยข้อความ "ไวยากรณ์ของคำสั่งไม่ถูกต้อง"
meden

@meden ขออภัยมีความผิดพลาดบางอย่างเกิดขึ้นในโพสต์ของฉัน ของแถมที่ตายแล้วคือโพสต์นั้นสั้นกว่าที่ฉันบอกไว้! พวกเขากำลังได้รับการแก้ไขแล้ว
Neil

3

Pyth, 16 15 ไบต์

1 ไบต์ต้องขอบคุณ @ mbomb007

= rz1.xhtfq1 / zTzk
= rz1: fq1 / zTz1 2

ชุดทดสอบ


2
ฉันไม่รู้ด้วยซ้ำว่า Pyth แต่ถ้าคุณพูดอย่างนั้น : D
mbomb007

@ mbomb007 คุณรู้[1:2]เคล็ดลับ
Leun Nun

คุณสามารถบันทึกไบต์ที่มีแทนt<…2 :…1 2คุณสามารถบันทึกไบต์อื่นโดยการย้าย=rz1การใช้งานครั้งแรกถ้าคุณยังเปลี่ยน1ไป(สำหรับตัวพิมพ์เล็กแทนการส่งออกเป็นตัวพิมพ์ใหญ่):Z t<fq1/zT=rzZ2
Anders Kaseorg

3

ที่จริงแล้ว 19 ไบต์

;╗`ù╜ùc1=`░ε;(qq1@E

ลองออนไลน์!

คำอธิบาย:

;╗`ù╜ùc1=`░ε;(qq1@E
;╗                   push a copy of input to reg0
  `ù╜ùc1=`░          [v for v in s if
   ù╜ùc1=              s.lower().count(v.lower()) == 1]
           ε;(qq     append two empty strings to the list
                1@E  element at index 1 (second element)

3

C #, 129 128 ไบต์

char c(string i){var s=i.Where((n,m)=>i.ToLower().Where(o=>o==Char.ToLower(n)).Count()<2).ToArray();return s.Length>1?s[1]:' ';}

ทำงานได้ดี ฉันหวังว่าฉันไม่จำเป็นต้องพิมพ์เล็กทุกอย่าง


โยน IndexOutOfRangeException เมื่อฉันผ่าน "Thisxthis" นี้เป็นอาร์กิวเมนต์ นอกจากนั้นฉันคิดว่า == 1 สามารถเปลี่ยนเป็น <2
Yytsi

2

C # lambda พร้อม Linq, 63 ไบต์

s=>(s=s.ToUpper()).Where(c=>s.Count(C=>c==C)<2).Skip(1).First()

คุณควรจะแทนที่.Skip(1).First()ด้วย.ElementAt(1)
aloisdg พูดว่า Reinstate Monica

ยิ่งไปกว่านั้นคุณสามารถแปลงเป็นลิสต์และใช้ดัชนีได้.ToList()[1]
aloisdg พูดว่า Reinstate Monica

สิ่งนี้จะเป็นการยกเว้นสำหรับอินพุตเช่น "", "AABB" และ "AABBC" ซึ่งไม่มีอักขระที่ตรงกันในตำแหน่งที่ 2 ฉันคิดว่าคุณต้องการ FirstOrDefault
Grax32

2

C #, 141 ไบต์

void p(){var x=Console.ReadLine().ToLower();var c=0;foreach(char i in x){if(x.Split(i).Length-1<2){if(++c==2){Console.WriteLine(i);break;}}}}

โดยไม่หยุดพัก (เล็กที่สุด) 135 ไบต์

void p(){var x=Console.ReadLine().ToLower();var c=0;foreach(char i in x){if(x.Split(i).Length-1<2){if(++c==2){Console.WriteLine(i);}}}}

ด้วย for (;;) 150 ไบต์

void p(){for(;;){var x=Console.ReadLine().ToLower();var c=0;foreach(char i in x){if(x.Split(i).Length-1<2){if(++c==2){Console.WriteLine(i);break;}}}}}

ไม่พอใจกับความคิดเห็น

void p()
{
    var x=Console.ReadLine().ToLower();//Get lowercase version of input from STDIN
    var c=0; //Create "count" integer
    foreach(char i in x){//For each char in input from STDIN
        if(x.Split(i).Length-1<2)//If current char occurs once in input from STDIN
        {
            if(++c==2){ //Add 1 to count and if count is 2
                Console.WriteLine(i); //Print result to STDOUT
                break; //Exit foreach
            } //End of IF
         } //End of IF
     } //End of FOREACH
} //End of VOID

บันทึก 12 ไบต์โดย TuukkaX (เปลี่ยนจำนวนเป็น c)

3 ไบต์บันทึกโดย TuukkaX (เปลี่ยนสตริงเป็น var)

TuukkaX บันทึก 4 ไบต์ใน "With for (;;)" (เปลี่ยนขณะ (จริง) เป็น for (;;))

2 ไบต์บันทึกโดย TuukkaX (เปลี่ยน c ++; if (c == 2) เป็น if (++ c == 2))

บันทึกได้ 14 ไบต์โดย Bryce Wagner (เปลี่ยน x.ToCharArray () เป็น x)


@ TuukkaX โอ้จริง ๆ ขอขอบคุณ!
r3pear

ยินดีต้อนรับสู่ PPCG! นั่นเป็นโพสต์แรกที่ดี! เนื่องจากกฎระบุว่าคำตอบสำหรับปัญหานี้ควรเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบรหัสของคุณต้องมีการปรับแต่งเล็กน้อย นอกจากนี้คุณยังสามารถบันทึกไบต์โดยใช้varแทนstringและมีสิ่งที่ชอบแทนc count
Yytsi

@TuukkaX ขอบคุณอีกครั้ง! ไม่นานฉันจะแก้ไขโค้ดและเปลี่ยนสตริงเป็น var
r3pear

@TuukkaX ฉันควรเพิ่มบางอย่างเช่นโปรแกรม void () {} ???
r3pear

ใช่ แต่ให้ชื่อฟังก์ชั่นหนึ่งไบต์เพื่อบันทึกไบต์! :)
Yytsi

2

รหัสเครื่อง x86, 43 ไบต์

ในรูปหกเหลี่ยม:

FC31C031C95641AC84C0740E3C6172F63C7A77F28066FFDFEBEC5EAC49740B89F751F2AE5974F44A77F1C3

ฟังก์ชั่นจะใช้ตัวชี้ไปยังสตริงอินพุตใน (E) SI และจำนวนเต็มใน (E) DX และส่งกลับ (E) DX-th อักขระที่ไม่ซ้ำกันหรือศูนย์ถ้าไม่มีอักขระดังกล่าว ในฐานะที่เป็นผลข้างเคียงมันจะแปลงสตริงเป็นตัวพิมพ์ใหญ่

ถอดชิ้นส่วน:

fc             cld
31 c0          xor    eax,eax
31 c9          xor    ecx,ecx
56             push   esi
_loop0:                         ;Search for the NULL char,
41             inc    ecx       ;counting the length in the process
ac             lodsb
84 c0          test   al,al
74 0e          je     _break0   ;NULL found, break
3c 61          cmp    al,0x61   ;If char is
72 f6          jb     _loop0    ;between 'a' and 'z'
3c 7a          cmp    al,0x7a   ;convert this char
77 f2          ja     _loop0    ;to uppercase in-place
80 66 ff df    and    byte ptr [esi-0x1],0xdf
eb ec          jmp    _loop0
_break0:
5e             pop    esi       ;Reset pointer to the string
_loop:                          ;ECX=string length with NULL
ac             lodsb            ;Load next char to AL
49             dec    ecx
74 0b          je     _ret      ;End of string found, break (AL==0)
89 f7          mov    edi,esi   ;EDI points to the next char
51             push   ecx
f2 ae          repnz scasb      ;Search for AL in the rest of the string
59             pop    ecx
74 f4          je     _loop     ;ZF==1 <=> another instance found, continue
4a             dec    edx
77 f1          ja     _loop     ;If not yet the EDX-th non-rep char, continue
_ret:
c3             ret

2

APL, 32 ไบต์

{⊃1↓⍵/⍨1=+/∘.=⍨(⎕UCS ⍵)+32×⍵∊⎕A}

ลอง | | กรณีทดสอบทั้งหมด

คำอธิบาย:

                (⎕UCS ⍵)+32×⍵∊⎕A  Add 32 to uppercase letters
            ∘.=⍨                    Make an equality matrix
          +/                        Check how many matches
    ⍵/⍨1=                           Keep elements with 1 match
  1↓                                Drop the first one
⊃                                   Return the second one

ฉันกำลังจะโพสต์ด้วย 16 ไบต์ แต่ฉันรู้ว่ามันจะต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก ...


1
(⎕UCS ⍵)+32×⍵∊⎕A819⌶⍵
Adám

ฉันไม่เคยเห็นผู้ประกอบการรายนั้นมาก่อน เวอร์ชันใดใช้งานได้?
Woofmao

มันถูกเรียกว่าI-คาน มันเป็นโอเปอเรเตอร์ใน Dyalog APL ทุกรุ่น เดิมเป็นฟังก์ชันในเวอร์ชันเก่าของ APL ของ IBM สำหรับการโทรพิเศษไปยังระบบ IBM รับมัน IBM - i-beam ?
อดัม

เอกสารสำหรับทั่วไปและสำหรับบริการ 819 ("819" ≈ "BIg") ลองออนไลน์!
อดัม

ฉันได้เรียนรู้สิ่งใหม่แล้ว tryapl.org ดูเหมือนจะไม่รู้จักดังนั้นคุณจะรังเกียจไหมถ้าฉันใช้ลิงค์ TIO ของคุณ
Woofmao


1

Mathematica, 49 ไบต์

Cases[Tally@ToUpperCase@#,{_,1}][[2,1]]~Check~""&

ฟังก์ชั่นไม่ระบุชื่อ ใช้รายการอักขระเป็นอินพุต ละเว้นข้อผิดพลาดใด ๆ ที่สร้างขึ้น


1

JavaScript (Firefox 48 หรือรุ่นก่อนหน้า), 60 ไบต์

f=s=>(m=s.match(/(.).*\1/i))?f(s.replace(m[1],"","gi")):s[1]

ส่งคืนundefinedถ้ามีศูนย์หรืออักขระที่ไม่ซ้ำหนึ่งตัวเท่านั้น ทำงานโดยคำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก - ใหญ่ที่ปรากฏในสตริงมากกว่าหนึ่งครั้ง อาศัยส่วนขยาย Firefox ที่ไม่ได้มาตรฐานซึ่งถูกลบใน Firefox 49 119 91 byte ES6 เวอร์ชั่น:

f=s=>(m=s.match(/(.).*?(\1)(.*\1)?/i))?f((m[3]?s:s.replace(m[2],"")).replace(m[1],"")):s[1]

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


ฉันเชื่อว่าคุณสามารถปรับคำตอบ Firefox 48 ของคุณให้สอดคล้องm[1]กับES6 ได้โดยแทนที่ด้วยnew RegExp(`${m[1]}`,"gi")
Value Ink

@ KevinLau-notKenny นั่นมันใช้งานไม่ได้กับตัวละครพิเศษและมันมีราคาถึง 33 ไบต์สำหรับกรณีพิเศษพวกมันทำให้ฉันสูงถึง 93 น่าเสียดาย
Neil

noooooo ไม่ใช่ตัวละครพิเศษ! ฉันต้องแก้ไขคำตอบ Ruby ของฉันเพื่อรองรับพวกเขาเช่นกันตอนนี้
ค่าหมึก

1

J, 25 ไบต์

(1{2{.]-.]#~1-~:)@tolower

การใช้

   f =: (1{2{.]-.]#~1-~:)@tolower
   f 'DEFD'
f
   f 'FEED'
d
   f 'This is an example input sentence.'
x
   f '...,,,..,,!@'
@
   f 'ABCDefgHijklMNOPqrsTuVWxyz'
b
   f 'AAAAAABBBBB'

   f 'Thisxthis'

   f 'This this.'
.

คำอธิบาย

(1{2{.]-.]#~1-~:)@tolower  Input: s
                  tolower  Converts the string s to lowercase
              ~:           Mark the indices where the first time a char appears
            1-             Complement it
         ]                 Identity function to get s
          #~               Copy only the chars appearing more than once
      ]                    Identity function to get s
       -.                  Remove all the chars from s appearing more than once
   2{.                     Take the first 2 chars from the result (pad with empty string)
 1{                        Take the second char at index 1 and return it

1

Bash, 58 ไบต์

tr A-Z a-z>t
tr -dc "`fold -1<t|sort|uniq -u`"<t|cut -c2

ข้อควรระวัง:นี้จะสร้างไฟล์ชื่อชั่วคราวเสื้อ หากมีอยู่แล้วมันจะถูกเขียนทับ


1

C, 174 ไบต์

int c(char*s){int y=128,z=256,c[384],t;memset(c,0,z*6);for(;t=toupper(*s);s++){c[t]++?c[t]-2?0:c[z+(c[y+c[z+t]]=c[y+t])]=c[z+t]:c[z]=c[y+(c[z+t]=c[z])]=t;}return c[y+c[y]];}

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

รุ่นที่ไม่ได้รับการดูแลเล็กน้อย:

int c(char*s)
{
    int y=128,z=256,c[384],t;
    //It's basically c[3][128], but with linear array the code is shorter

    memset(c,0,z*6);

    for(;t=toupper(*s);s++)
    {
        c[t]++ ?        // c[0][x] - number of char x's occurrence
            c[t] - 2 ?  // > 0
                0       // > 1 - nothing to do  
                : c[z + (c[y + c[z + t]] = c[y + t])] = c[z + t]  // == 1 - remove char from the list
            : c[z] = c[y + (c[z + t] = c[z])] = t; // == 0 - add char to the end of the list
    }
    return c[y + c[y]];
}

1

C #, 143 ไบต์

char c(string s){var l=s.Select(o=>Char.ToLower(o)).GroupBy(x=>x).Where(n=>n.Count()<2).Select(m=>m.Key).ToList();return l.Count()>1?l[1]:' ';}

1

TSQL, 128 ไบต์

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

DECLARE @ varchar(99)=',,zzzbb@kkkkkkJgg'

,@i INT=99WHILE @i>1SELECT
@i-=1,@=IIF(LEN(@)>LEN(x)+1,x,@)FROM(SELECT
REPLACE(@,SUBSTRING(@,@i,1),'')x)x PRINT SUBSTRING(@,2,1)

Ungolfed:

DECLARE @ varchar(99)=',,zzzbb@kkkkkkJgg'

,@i INT=99

WHILE @i>1
  SELECT
    @i-=1,@=IIF(LEN(@)>LEN(x)+1,x,@)
  FROM
    (SELECT 
       REPLACE(@,SUBSTRING(@,@i,1),'')x
    )x

PRINT SUBSTRING(@,2,1)

ซอ


1

Ruby, 53 ไบต์

อินพุตคือ STDIN เอาต์พุตคือ STDOUT ใน Ruby ตำแหน่งที่ไม่อยู่ในดัชนีในอาร์เรย์หรือการส่งคืนสตริงnilซึ่งไม่ได้พิมพ์

String#countเป็นฟังก์ชั่นแปลก ๆ ใน Ruby เพราะแทนที่จะนับจำนวนที่เกิดขึ้นสำหรับสตริงที่ส่งผ่านเข้ามามันจะนับจำนวนที่เกิดขึ้นสำหรับแต่ละตัวอักษรในสตริงนั้น ปกติแล้วมันน่ารำคาญ แต่เราสามารถใช้เพื่อประโยชน์ของเราในครั้งนี้ String#swapcaseสลับตัวอักษรตัวพิมพ์เล็กและใหญ่

$><<gets.chars.reject{|c|$_.count(c+c.swapcase)>1}[1]

เวอร์ชันเก่าที่ไม่ปลอดภัยกับตัวอักษรพิเศษเช่น.- 46 ไบต์

$><<gets.chars.reject{|c|$_=~/#{c}.*#{c}/i}[1]

1

Java 8, 172 157 bytes

(String s)->{s=s.toLowerCase();for(char i=0,c;s.length()>0;s=s.replace(c+"","")){c=s.charAt(0);if(!s.matches(".*"+c+".*"+c+".*")&&++i>1)return c;}return' ';}

-15 ไบต์ .. แดงเมื่อฉันเล่นกอล์ฟไม่ดี ;)

คำอธิบาย:

ลองที่นี่

(String s)->{                          // Method with String parameter and character return-type
  s=s.toLowerCase();                   // Make the input-String lowercase
  for(char i=0,c;s.length()>0;         // Loop over the characters of `s`
      s=s.replace(c+"","")){           // And after every iteration, remove all occurrences of the previous iteration
    c=s.charAt(0);                     // Get the current first character
    if(!s.matches(".*"+c+".*"+c+".*")  // If it doesn't occur more than once
     &&++i>1)                          // And this was the second one we've found
      return c;                        // Return this second characters
  }                                    // End of loop
  return' ';                           // Else: return an empty character/nothing
}                                      // End of method

1

R , 79 ไบต์

function(z){y=tolower(el(strsplit(z,"")));x=table(y);y[y%in%names(x[x==1])][2]}

ลองออนไลน์!

ฉันรู้สึกเหมือนมีอะไรบางอย่างที่สามารถเล่นกอล์ฟได้ที่นี่ แต่ฉันก็ชอบความท้าทายนี้มาก

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






0

Javascript (ใช้ไลบรารีภายนอก) (107 ไบต์)

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

(s)=>_.From(s).ToLookup(y=>y.toLowerCase(),z=>z).Where(g=>g.Value.Count()==1).Select(x=>x.Key).ElementAt(1)

สิ่งนี้จะจัดการอินพุตสตริงที่ว่างเปล่าอินพุตที่มีอักขระที่ไม่ซ้ำกันเพียงตัวเดียวและอินพุตที่มีอักขระที่ไม่ซ้ำกัน 2+ ตัว

ภาพ 1


คุณมีลิงค์ไปยังห้องสมุดที่เป็นปัญหาหรือไม่? นอกจากนี้นี่คือการตีกอล์ฟคุณต้องออกไปจากที่ว่างที่คุณสามารถทำได้
Value Ink

เฮ้ใช่มันเป็นgithub.com/mvegh1/ จำนวนมาก ยังไม่มีเอกสาร ขออภัยฉันจะล้างคำตอบนี้เพื่อลดช่องว่างให้มากที่สุด
applejacks01

คุณน่าจะพูดถึงและเชื่อมโยงมันในเนื้อหาของคำตอบ ฉันทามติคือการใส่มันลงในแลมบ์ดานิรนาม (ดังนั้นs=> ...)
Value Ink

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

0

Clojure, 109 ไบต์

#(let[s(clojure.string/lower-case %)](or(second(remove(set(map(fn[[k v]](if(> v 1)k))(frequencies s)))s))""))

อืมฉันหวังว่าจะมีวิธีที่กระชับกว่านี้

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