Apa karakter kedua yang tidak berulang?


18

Berdasarkan pertanyaan ini dari Peninjauan Kode

Diberikan string karakter ASCII yang tidak kosong yang dapat dicetak, mengeluarkan karakter kedua yang tidak berulang. Misalnya untuk input DEFD, output F.

Memasukkan

Keluaran

  • The kedua karakter yang tidak berulang, ketika membaca kiri-ke-kanan, sekali lagi dalam format yang sesuai.
  • Karakter keluaran tidak peka huruf besar-kecil.
  • Jika tidak ada karakter seperti itu (misalnya, semua karakter ulangi), output string kosong.

Aturan

  • Algoritme harus mengabaikan case. Yaitu, Ddan ddihitung sebagai karakter yang sama.
  • Program lengkap atau fungsi dapat diterima.
  • String input akan dijamin non-kosong (mis., Setidaknya satu karakter panjangnya).
  • String input adalah ASCII. Setiap karakter yang valid dapat diulang, bukan hanya alfanumerik (ini termasuk spasi).
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Contohnya

Input ada di baris pertama, output ada di baris kedua.

DEFD
F

FEED
D

This is an example input sentence.
x

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

ABCDefgHijklMNOPqrsTuVWxyz
B

AAAAAABBBBB


Thisxthis


This this.
.

8
Jika itu tidak peka terhadap huruf besar-kecil, saya akan mempertimbangkan untuk melakukannya di Forth. Operasi string menyedot dalam bahasa itu.
mbomb007

Bagaimana jika bahasa saya tidak mendukung huruf kecil?
Adám

@ Adám Apakah ini menggunakan halaman kode yang berbeda? Bagaimana biasanya input string ASCII jika tidak mendukung huruf kecil?
AdmBorkBork

1
Sistem yang ada dalam pikiran saya memiliki halaman kode 7-bit; halaman kode standar yang dimodifikasi di mana huruf besar menempati posisi huruf kecil, dan posisi huruf besar digunakan untuk mesin terbang. Ini dilakukan pada sistem APL lama sehingga orang dapat menggunakan Shift untuk mengakses mesin terbang APL, sedangkan huruf yang tidak tergeser adalah ibukota gaya pengkodean klasik.
Adám

Jawaban:


10

MATL , 11 byte

tk&=s1=)FT)

Ini keluar dengan kesalahan (diizinkan secara default) jika tidak ada karakter kedua yang tidak diulang.

Cobalah online!

Penjelasan

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 

Sunting Ninja menyerang lagi. : P
Dennis

@Dennis Hahaha. Yah, saya kira Anda akan segera menghapus beberapa byte
Luis Mendo

10

Retina , 25 byte

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

Cobalah online! (Baris pertama memungkinkan menjalankan kode pada suite uji beberapa input.)

Penjelasan

Ini hanya pertandingan regex tunggal, regexnya adalah:

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

Artinya, cocokkan karakter dan pastikan tidak muncul di tempat lain di input. Sisanya adalah konfigurasi:

  • i mengaktifkan ketidakpekaan case.
  • ! memberitahu Retina untuk mencetak korek api dan bukan menghitungnya.
  • 2= memberitahu Retina untuk mencetak hanya pertandingan kedua yang bertentangan dengan mereka semua.

1
Ah, terima kasih sudah mengajari saya tentang 2=.
Leaky Nun

6

05AB1E, 15 12 byte

l©v®y¢iy}}1@

Dijelaskan

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

Cobalah online

Disimpan 3 byte berkat @Adnan


Atau selama 12 byte l©v®y¢iy}}1@:).
Adnan

@ Adnan: Bagus! Tidak terpikir untuk menggunakan @.
Emigna

5

Python 2, 59 58 byte

Mengembalikan daftar karakter tunggal, atau daftar kosong jika tidak ada output. (Ketidakpekaan kasus bodoh ...)

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

Cobalah online



Itu bukan input yang valid. Pengguna seharusnya tidak perlu melarikan diri dari input mereka.
mbomb007

4
Tentu saja. Kami menyediakan daftar tentang STDIN dalam format daftar bahasa. Mengapa string berbeda?
Dennis

5

Jelly , 11 byte

Œlµḟœ-Q$Ḋḣ1

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Œ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

Batch, 171 byte

@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%

Formulasi alternatif, juga 171 byte:

@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%

Tidak dapat menjalankannya pada W2008R2. Baris "set panggilan ..." memperluas ke "set panggilan t =% s: D =%" dan dibatalkan dengan pesan "Sintaks perintah salah".
meden

@meden Maaf, beberapa kesalahan ketik merayapi posting saya. Hadiah mati adalah bahwa pos itu lebih pendek dari yang saya katakan! Sudah diperbaiki sekarang.
Neil

3

Pyth, 16 15 byte

Terima kasih 1 byte ke @ mbomb007

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

Suite uji.


2
Saya bahkan tidak tahu Pyth, tetapi jika Anda mengatakannya. : D
mbomb007

@ mbomb007 Anda tahu, [1:2]triknya.
Leaky Nun

Anda dapat menyimpan byte dengan t<…2alih - alih :…1 2. Anda dapat menyimpan byte lain dengan memindahkan =rz1ke penggunaan pertama, jika Anda juga mengubah 1ke Z(untuk huruf kecil bukan output huruf besar): t<fq1/zT=rzZ2.
Anders Kaseorg

3

Sebenarnya, 19 byte

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

Cobalah online!

Penjelasan:

;╗`ù╜ù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 byte

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]:' ';}

bekerja dengan baik. Saya berharap saya tidak perlu huruf kecil semuanya


Melempar IndexOutOfRangeException ketika saya meneruskan "Thisxthis" sebagai argumen. Selain itu, saya pikir == 1 dapat diubah menjadi <2.
Yytsi

2

C # lambda dengan Linq, 63 byte

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

Anda harus dapat menggantinya .Skip(1).First()dengan.ElementAt(1)
aloisdg kata Reinstate Monica

Bahkan lebih baik Anda dapat mengkonversi ke daftar dan menggunakan indeks.ToList()[1]
aloisdg mengatakan Reinstate Monica

Ini melempar pengecualian untuk input seperti "", "AABB", dan "AABBC", di mana tidak ada karakter yang cocok di posisi ke-2. Saya pikir Anda perlu FirstOrDefault.
Grax32

2

C #, 141 byte

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;}}}}

Tanpa istirahat (terkecil), 135 byte

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);}}}}

Dengan untuk (;;), 150 byte

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;}}}}}

Tidak dikoleksi dengan komentar

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 byte disimpan oleh TuukkaX (ubah hitung menjadi c).

3 byte disimpan oleh TuukkaX (ubah string ke var).

4 byte disimpan oleh TuukkaX di "With for (;;)" (diubah saat (true) menjadi untuk (;;)).

2 byte disimpan oleh TuukkaX (diubah c ++; if (c == 2) menjadi if (++ c == 2)).

14 byte disimpan oleh Bryce Wagner (diubah x.ToCharArray () menjadi x).


@ TuukkaX oh, sungguh. Terima kasih!
r3pear

Selamat datang di PPCG! Itu posting pertama yang bagus! Karena aturan menyebutkan bahwa jawaban untuk masalah ini harus berupa fungsi atau program penuh, kode Anda memerlukan sedikit penyesuaian. Anda juga dapat menyimpan byte dengan menggunakan varalih-alih stringdan memiliki sesuatu seperti cbukan count.
Yytsi

@TuukkaX Terima kasih lagi! Sebentar lagi saya akan memodifikasi kode dan mengubah string ke var.
r3pear

@ TuukkaX Haruskah saya menambahkan sesuatu seperti void program () {} ???
r3pear

Ya, tetapi berikan nama fungsi satu byte untuk menghemat byte! :)
Yytsi

2

kode mesin x86, 43 byte

Dalam hex:

FC31C031C95641AC84C0740E3C6172F63C7A77F28066FFDFEBEC5EAC49740B89F751F2AE5974F44A77F1C3

Fungsi mengambil pointer ke string input di (E) SI dan integer di (E) DX dan mengembalikan (E) DX-th karakter yang tidak berulang atau nol jika tidak ada karakter seperti itu. Sebagai efek samping itu mengubah string ke huruf besar.

Membongkar:

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 byte

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

Cobalah || Semua uji kasus

Penjelasan:

                (⎕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

Saya akan mempostingnya dengan 16 byte, tetapi saya menyadari itu harus case-insensitive ...


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

Saya belum pernah melihat operator itu sebelumnya. Versi apa fungsinya?
Woofmao

Ini disebut i-beam . Ini adalah operator di semua versi APL Dyalog. Awalnya fungsi dalam versi lama APL IBM untuk panggilan khusus ke sistem IBM. Mengerti? IBM - i-beam ?
Adám

Dokumentasi untuk secara umum dan untuk layanan 819 ("819" ≈ "BIg"). Cobalah online!
Adám

Yah, saya sudah belajar sesuatu yang baru. tryapl.org tampaknya tidak mengenalinya, jadi apakah Anda keberatan jika saya hanya menggunakan tautan TIO Anda?
Woofmao


1

Mathematica, 49 byte

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

Fungsi anonim. Mengambil daftar karakter sebagai input. Abaikan setiap kesalahan yang dihasilkan.


1

JavaScript (Firefox 48 atau yang lebih lama), 60 byte

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

Mengembalikan undefinedjika hanya ada nol atau satu karakter yang tidak berulang. Bekerja dengan case-insensitive menghapus semua kemunculan karakter yang muncul lebih dari satu kali dalam string. Bergantung pada ekstensi Firefox non-standar yang telah dihapus di Firefox 49. 119 ES6 versi 91 byte:

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

Secara rekursif mencari semua karakter yang muncul setidaknya dua kali dalam string. Jika karakter muncul tepat dua kali maka kedua kejadian dihapus jika tidak hanya kejadian pertama dihapus (kejadian lainnya akan dihapus kemudian). Ini memungkinkan kejadian memiliki kasus perbedaan.


Saya percaya Anda benar-benar dapat mengadaptasi jawaban Firefox 48 Anda agar sesuai dengan ES6 dengan menggantinya m[1]dengannew RegExp(`${m[1]}`,"gi")
Value Ink

@ KevinLau-notKenny Itu tidak akan berfungsi untuk karakter khusus, dan biayanya saya 33 byte untuk kasus khusus mereka, membawa saya hingga 93, sayangnya.
Neil

noooooo bukan karakter spesial! Saya harus mengedit jawaban Ruby saya untuk mengakomodasi mereka juga, sekarang.
Nilai Tinta

1

J, 25 byte

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

Pemakaian

   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.'
.

Penjelasan

(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 byte

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

Perhatian: Ini membuat file sementara bernama t . Jika sudah ada, itu akan ditimpa.


1

C, 174 byte

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]];}

Ini bukan implementasi yang paling singkat, tetapi cukup efisien. Pada dasarnya ia menggunakan daftar yang ditautkan ganda untuk mempertahankan sekumpulan karakter kandidat dan memindai string input hanya sekali. Mengembalikan kode karakter atau nol jika tidak ada yang ditemukan.

Versi sedikit tidak ungolfed:

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 byte

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 byte

Golf:

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)

Tidak Disatukan:

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)

Biola


1

Ruby, 53 byte

Input adalah STDIN, output adalah STDOUT. Di Ruby, posisi out-of-index dalam array atau string kembali nil, yang tidak dicetak.

String#countadalah fungsi aneh di Ruby karena alih-alih menghitung jumlah kemunculan untuk string yang diteruskan, itu menghitung jumlah kemunculan untuk setiap huruf dalam string itu. Ini biasanya menjengkelkan tetapi kita dapat menggunakannya untuk keuntungan kita saat ini. String#swapcasemenukar huruf besar dan kecil.

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

Versi lama yang tidak aman terhadap karakter khusus seperti .- 46 byte

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

1

Java 8, 172 157 byte

(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 byte .. Dang aku buruk dalam golf saat itu. ;)

Penjelasan:

Coba di sini.

(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 byte

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

Cobalah online!

Saya pasti merasa ada sesuatu yang bisa bermain golf di sini. Tapi saya sangat menikmati tantangan ini.

Jawaban ini memecah string menjadi vektor karakter, mengubahnya semua menjadi huruf kecil, dan tabel mereka (menghitungnya). Karakter yang muncul satu kali dipilih dan dibandingkan dengan karakter dalam vektor yang disebutkan di atas, maka nilai kedua yang benar dikembalikan sebagai output. String kosong, atau string tanpa karakter berulang menghasilkan NA.



1

K (oK) / K4 , 11 byte

Larutan:

*1_&1=#:'=_

Cobalah online!

Penjelasan:

*1_&1=#:'=_ / the solution
          _ / convert input to lowercase
         =  / group alike characters
      #:'   / count (#:) each group
    1=      / 1 equal to length of the group?
   &        / where true
 1_         / drop the first
*           / take the first


0

Perl, 75 byte

 my$s=<>;chomp$s;my$c;for my$i(split//,$s){my$m=@{[$s=~/$i/gi]};$m<2and++$c>=2and say$i and last}

0

Javascript (menggunakan Perpustakaan eksternal) (107 byte)

Hancurkan ini menggunakan perpustakaan yang saya tulis. Tidak yakin apakah saya harus menghitung deklarasi variabel "s", yang merupakan string yang dimaksud.

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

Ini akan menangani input string kosong, input dengan hanya satu karakter yang tidak berulang, dan input dengan 2+ karakter yang tidak berulang

Gambar 1


Apakah Anda memiliki tautan ke perpustakaan yang dimaksud? Juga, ini kode golf, Anda harus mengeluarkan ruang kosong di mana Anda bisa
Value Ink

Hei, ya itu github.com/mvegh1/Enumerable . Belum ada dokumen. Maaf, saya akan membersihkan jawaban ini untuk mengurangi ruang kosong sebanyak
applejacks01

Anda mungkin harus menyebutkan dan menautkannya di badan jawaban. Juga, mengenai bytecount, konsensus adalah memasukkannya ke dalam lambda anonim (jadi s=> ...)
Value Ink

OK tidak masalah. Saya tidak ingin menyinggung siapa pun dengan menautkan ke kode saya, tetapi saya menyebutkan saya menggunakan perpustakaan saya. Saya akan memperbarui jawaban saya dengan lambda, terima kasih telah memberi tahu saya
applejacks01

0

Clojure, 109 byte

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

Wah, saya harap ada cara yang lebih ringkas.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.