Codegolf - Какой Второй Неповторяющийся Символ?

  • Автор темы Muklat
  • Обновлено
  • 20, Oct 2024
  • #1

На основе этот вопрос из Code Review

Учитывая непустую строку печатных символов ASCII, выведите второй неповторяющийся характер. Например, для ввода

 DEFD
F

FEED
D

This is an example input sentence.
x

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

ABCDefgHijklMNOPqrsTuVWxyz
B

AAAAAABBBBB

Thisxthis

This this.
.
 
, output d .

Вход

Выход

  • второй символ, который не повторяется при чтении слева направо, снова в подходящем формате.
  • Выходной символ не чувствителен к регистру.
  • Если такого символа не существует (например, все символы повторяются), выведите пустую строку.

Правила

  • Алгоритм должен игнорировать регистр. То есть, D and F считаться одним и тем же персонажем.
  • Допускается либо полная программа, либо функция.
  • Входная строка гарантированно будет непустой (т. е. длиной не менее одного символа).
  • Входная строка — ASCII. Может повторяться любой допустимый символ, а не только буквенно-цифровой (включая пробелы).
  • Стандартные лазейки запрещены.
  • Таким образом, применяются все обычные правила игры в гольф, и побеждает самый короткий код (в байтах).

Примеры

Ввод находится в первой строке, вывод — во второй строке.

DEFD

#code-golf #code-golf #строка #анализ

Muklat


Рег
15 Sep, 2011

Тем
59

Постов
197

Баллов
512
  • 26, Oct 2024
  • #2

МАТЛ, 11 байт

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

Это завершается с ошибкой (разрешено по умолчанию), если нет второго неповторяющегося символа.

Попробуйте онлайн!

Объяснение

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

сетчатка, 25 байт

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

Попробуйте онлайн! (Первая строка позволяет запустить код на наборе тестов из нескольких входных данных.)

Объяснение

Это всего лишь одно совпадение с регулярным выражением, причем регулярное выражение:

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

То есть сопоставьте символ и убедитесь, что он больше нигде не встречается во входных данных. Остальное — конфигурация:

  • Œlµċ@Ị¥Ðf¹ḊḢȯ“” activates case insensitivity.
  • *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 tells Retina to print the matches as opposed to counting them.
  • *1_&1=#:'=_ tells Retina to print only the second match as opposed to all of them.
 

Игорек епт


Рег
12 Feb, 2010

Тем
78

Постов
198

Баллов
608
  • 26, Oct 2024
  • #3

05AB1E, 15 12 байт

{~grep({2>m:g:i/$^a/},.comb)[1]}

Объяснено

.comb

Попробуйте онлайн

Сэкономлено 3 байта благодаря @Adnan

 

Мурат70


Рег
23 Mar, 2007

Тем
66

Постов
193

Баллов
583
  • 26, Oct 2024
  • #4

Желе, 11 байты

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

Попробуйте онлайн! или проверить все тестовые случаи.

Как это работает

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

Питон 2, 59 58 байт

Возвращает список из одного символа или пустой список, если вывод невозможен. (Глупая нечувствительность к регистру...)

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

Попробуйте онлайн

 

Ася1


Рег
22 Jan, 2016

Тем
95

Постов
206

Баллов
691
  • 26, Oct 2024
  • #5

Пакетный, 171 байт

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

Альтернативная формулировка, тоже 171 байт:

. ||answer||

Пиф, 16 15 байт

1 байт благодаря @mbomb007

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

Тестовый набор.

 

Dndtd3z


Рег
24 Jan, 2007

Тем
66

Постов
192

Баллов
552
  • 26, Oct 2024
  • #6

На самом деле 19 байт

String#swapcase

Попробуйте онлайн!

Объяснение:

String#count ||answer||

С#, 129 128 байт

nil

работает нормально.

Мне бы хотелось, чтобы мне не нужно было все писать строчными буквами

 

Waginari


Рег
22 Aug, 2011

Тем
68

Постов
210

Баллов
580
  • 26, Oct 2024
  • #7
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) ||answer||

Лямбда C# с Linq, 63 байта

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)

С#, 141 байт

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

Без разрыва (самый маленький), 135 байт

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

С for(;;), 150 байт

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

Ungolfed с комментариями

12 байт сохранено TuukkaX (изменение счетчика на c).

3 байта сохранены TuukkaX (измените строку на var).

4 байта, сохраненные TuukkaX в «With for(;;)» (изменено while(true) на for(;;)).

2 байта сохранены TuukkaX (изменено c++;if(c==2) на if(++c==2)).

14 байт сохранено Брайсом Вагнером (изменено x.ToCharArray() на x).

 

BusetCelica0


Рег
11 Mar, 2010

Тем
65

Постов
194

Баллов
539
  • 26, Oct 2024
  • #8

Машинный код x86, 43 байта

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

В шестнадцатеричном формате:

Функция принимает указатель на входную строку в (E)SI и целое число в (E)DX и возвращает (E)DX-й неповторяющийся символ или ноль, если такого символа нет. В качестве побочного эффекта строка преобразуется в верхний регистр.

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

Разборка:

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

АПЛ, 32 байта || Попробуйте это

Все тестовые случаи

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

Объяснение:

Я собирался опубликовать его с 16 байтами, но понял, что он должен быть нечувствителен к регистру...

 

Sanya1165


Рег
07 Nov, 2019

Тем
95

Постов
210

Баллов
715
  • 26, Oct 2024
  • #10
undefined

Математика, 49 байт

Анонимная функция. Принимает на вход список символов. Игнорируйте любые возникающие ошибки.

 

1investa


Рег
30 Apr, 2016

Тем
67

Постов
202

Баллов
557
  • 26, Oct 2024
  • #11
f=s=>(m=s.match(/(.).*\1/i))?f(s.replace(m[1],"","gi")):s[1]

JavaScript (Firefox 48 или более ранняя версия), 60 байт Cases[Tally@ToUpperCase@#,{_,1}][[2,1]]~Check~""& if there are only zero or one non-repeating characters. Works by case-insensitively deleting all occurrences of characters that appear more than once in the string. Relies on a non-standard Firefox extension that was removed in Firefox 49. 119 91 byte ES6 version:

iM!`(.)(?<!\1.+)(?!.*\1) !`(?<=^.¶).

Возврат

Рекурсивно ищет все символы, которые встречаются в строке хотя бы дважды. Если символ появляется ровно два раза, оба вхождения удаляются, в противном случае удаляется только первое вхождение (остальные вхождения будут удалены позже). Это позволяет вхождениям иметь разный регистр.

 

Gavr6161


Рег
28 Mar, 2011

Тем
79

Постов
188

Баллов
603
  • 26, Oct 2024
  • #12
(⎕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

Дж, 25 байт

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

Использование

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 ||answer||

Объяснение

FC31C031C95641AC84C0740E3C6172F63C7A77F28066FFDFEBEC5EAC49740B89F751F2AE5974F44A77F1C3

Баш, 58 байт Осторожность: Это создаст временный файл с именемт

. Если он уже существует, он будет перезаписан.

 

Goloalexander


Рег
28 Apr, 2020

Тем
81

Постов
187

Баллов
602
  • 26, Oct 2024
  • #13
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

С, 174 байта

Это не самая короткая, но вполне эффективная реализация. По сути, он использует двусвязный список для поддержания упорядоченного набора символов-кандидатов и сканирует входную строку только один раз. Возвращает код символа или ноль, если он не найден.

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

Немного негольфированная версия:

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

С#, 143 байта

TSQL, 128 байт

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

Гольф:

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

Негольфед:

скрипка

 

JamesB_079


Рег
19 Dec, 2008

Тем
76

Постов
210

Баллов
590
  • 26, Oct 2024
  • #14

Рубин, 53 байта 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]:' ';} , which is not printed.

;╗`ù╜ù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) is a strange function in Ruby because instead of counting the number of occurrences for the string that was passed in, it counts the number of occurrences for each letter in that string. It's usually annoying but we can use it to our advantage this time. ;╗`ù╜ùc1=`░ε;(qq1@E Вход — STDIN, выход — STDOUT. В Ruby возвращаются позиции вне индекса в массиве или строке.

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

меняет местами прописные и строчные буквы. @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% - 46 bytes

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

Старая версия, которая не была защищена от специальных символов, таких как

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

Java 8, 172 157 байт

-15 байт... Черт, я тогда плохо играл в гольф. ;)

Объяснение:

Œlµḟœ-Q$Ḋḣ1 ||answer||

Попробуйте здесь.Р

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

, 79 байт

Попробуйте онлайн!

Я определенно чувствую, что здесь можно что-то сыграть в гольф. Но мне очень понравился этот вызов.

Этот ответ разбивает строку на вектор символов, изменяет их все на нижний регистр и помещает в таблицу (подсчитывает их). Символы, которые встречаются один раз, выбираются и сравниваются с символами в вышеупомянутом векторе, затем в качестве вывода возвращается второе истинное значение. Пустая строка или строка без повторяющихся символов выводит NA.

 

Dixi


Рег
11 May, 2007

Тем
60

Постов
189

Баллов
519
  • 26, Oct 2024
  • #17
i!2=`(.)(?<!\1.+)(?!.*\1) ||answer||

Перл, 75 байт

Javascript (с использованием внешней библиотеки) (107 байт)

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

Раздавил это, используя написанную мной библиотеку. Не уверен, нужно ли мне считать объявление переменной «s», которая является рассматриваемой строкой.

Это будет обрабатывать ввод пустой строки, ввод только с одним неповторяющимся символом и ввод с 2+ неповторяющимися символами.

 

HiceFrienny23


Рег
10 Jun, 2007

Тем
71

Постов
209

Баллов
604
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно