Нечетное: буквы

11

Задача

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

подробности

Вам будет передана матрица (в виде строки) в качестве ввода случайных размеров, таких как эта.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

Ваша задача - найти букву, которая не соответствует остальным (в данном случае она находится dв строке 2, столбец 6), и вернуть эту букву в качестве вывода. Матрица будет состоять из букв A-Z, a-zновых строк ( \nтолько на концах строк) и иметь размеры от 5x5 до 10x10 (25-100 букв).

Применяются стандартные лазейки. Это кодовое соревнование по гольфу; запись с кодом младшего байта выигрывает.

вход

Ввод будет передан через стандартный ввод в виде строки, если это программа, или в качестве аргумента, если функция (или аналогичная).

Выход

Единственный символ , который является «нечетным» в матрице или None , nil, NULили строка , "None"если нет «нечетного» характера.

Больше примеров

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Ответ: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Ответ: q

puuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu

Ответ: p

Генератор

Вот генератор случайных матриц, написанный на Python, который вы можете использовать для тестирования своей программы. Примечание: есть небольшая вероятность того, что он мог ошибиться и не вставить нечетную букву.

juniorRubyist
источник
1
Вот буквальный перевод вашего кода Python на JS.
Арно
1
@juniorRubyist «удаление бонуса» не означает «сделать бонус обязательным». Переместив часть, которая была необязательна, в требования задачи, вы сделали недействительной большую часть существующих ответов.
Мартин Эндер

Ответы:

6

J , 12 10 7 байт

-.}./.~

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

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

10-байтовая версия

-._1 1{\:~

Hisss ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input
FrownyFrog
источник
2
@ FrownyFrog Это умный способ найти странного персонажа
Гален Иванов
не могу решить, что мне больше нравится: этот прекрасный крючок или твоя драконья шутка ...
Иона
4

Брахилог , 8 4 байта

oḅ∋≠

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

объяснение

Я не использовал Brachylog раньше, так что это не может быть оптимальным.

oḅ∋≠  Input is a string.
o     Sort the input.
 ḅ    Split it into blocks of equal elements.
  ∋   There is a block
   ≠  whose elements are all different.
      That block is the output.
Zgarb
источник
Использование метода ∋≠after для получения результатов длины 1 очень умно. Вы должны обязательно опубликовать это в вопросе подсказок Brachylog .
Роковая
@Fatalize Спасибо, я добавил совет.
Згарб
3

K (ок) , 7 6 байтов

Решение

*<#:'=

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

Пример:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

Объяснение:

Найден несколько более короткий подход: оценивается справа налево:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

Заметки:

Хотя я ожидаю, что бонусный аспект этого испытания будет отброшен, это решение вернет символ новой строки, \nесли не будет нечетного символа:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"
streetster
источник
3

Пролог (SWI) , 46 байт

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

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

Или если стандарт правда вывод от запросов пролога не в порядке:

Пролог (SWI) , 48 байт

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

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

объяснение

Find the first element X in the input  
that when removed, results in output  
that does not contain X

then depending on the version above either:  
print X as a character  
or  
return X as an atom
Emigna
источник
3

C (gcc) , 93 92 90 66 62 байта

Намного короче как функция

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

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

тестовый код

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

старая версия это программа

C 86 байт

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Выводит нечетный символ или ничего. беги так;

C:\eng\golf>python matrix_gen.py | a.exe
X
C:\eng\golf>python matrix_gen.py | a.exe
G
C:\eng\golf>python matrix_gen.py | a.exe
x
C:\eng\golf>python matrix_gen.py | a.exe

C:\eng\golf>python matrix_gen.py | a.exe
J
cleblanc
источник
Я не знаю, что было бы справедливо поместить gets()тестовый драйвер, так как он очищает входные данные, удаляя символы \ n для вас. Это делает некоторую работу, чтобы ваша функция не работала с исходным вводом.
Майкл Дорган
@MichaelDorgan. Работает с конвейерным вводом из скрипта python, а также с вводом в TIO. Другие просто жестко закодировали ввод, который не соответствовал духу проблемы.
cleblanc
3

05AB1E ,  4  2 байта

Сохранено 2 байта благодаря Аднану

.m

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

объяснение

.m   # push a list of the least frequent character(s) in input
Emigna
источник
Вам нужно удалить символы новой строки, поскольку мы уверены, что ввод будет не менее 5 строк?
Лохматый
@ Шэгги: Нет, не знаю. Это было для обработки 2x2матриц. Я пропустил часть о 5x5и вверх. Благодаря!
Эминья
Он должен вернуться, nilесли у него нет «нечетного», не так ли?
Волшебная Осьминог Урна
@MagicOctopusUrn Эта часть была необязательной, когда этот ответ был опубликован. Я думаю, что изменение делает недействительными большинство ответов сейчас ...
Мартин Эндер
2

Шелуха , 2 байта

◄=

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

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

Лео
источник
2

C 94 байта

Вернуться по указателю. Если нет, верните\0 .

Это приведет к утечке памяти. Предполагается, intчто 4 байта.

*t;f(c,p,i)char*c,*p;{t=calloc(64,8);for(*p=-1;*c;c++)t[*c]--;for(i=0;++i<128;)!~t[i]?*p=i:0;}

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

Колера Су
источник
@ Shaggy На самом деле, я не знаю, как интерпретировать это правило, так как я вижу, что некоторые (другие) пользователи явно знают об этом правиле, но все еще публикуют такие ответы, как этот.
user202729
2
@ user202729, просто потому, что другие делают это, не значит, что это правильно;) Если вы обнаружите такие решения, лучше всего указать им на это.
Лохматый
@ Shaggy Ну, я явно указал правило, но тот пользователь сказал, что «правило прямо говорит, что это действительно». Я не знаю, что сказать. | В этом случае функция требует, чтобы массив tобнулялся перед вызовом каждый раз, а не в первый раз.
user202729
@ Shaggy Спасибо, исправлено.
Колера Су
2

Баш , 15 20 байт

fold -1|sort|uniq -u

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

Объяснение: fold s вводит 1символ в каждой строке, sortразбивает его на группы совпадающих букв, затем печатает только те строки, которые совпадают uniq.

Спасибо @Nahuel Fouilleul за то, что он поймал и помог решить проблему с этим подходом.

Джастин Маринер
источник
не работает, если нечетный персонаж является вторым или penuitlimate
Науэль Fouilleul
@NahuelFouilleul Хороший улов ... Я не уверен, как исправить это в данный момент, но я исправлю или удалим позже, если у вас не было предложенного исправления.
Джастин Маринер
это может быть просто исправлено, |sort|но может быть и лучшее решение
Науэль Фуйе
также нашел решение с помощью grep, но оно длиннееgrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel Fouilleul
@NahuelFouilleul Я собираюсь sortисправить, спасибо. Вы всегда можете опубликовать этот grep-ответ как свой собственный, если хотите.
Джастин Маринер
1

Pyth , 4 байта

ho/Q

Попробуй это здесь!

Мистер Xcoder
источник
.m/Qравно 4 байта
Дейв
@Dave Это выводит в виде списка, хотя я выбрал это, потому что это было более элегантно ;-)
Mr. Xcoder
1

Matlab, 25 байт

a=input('');a(a~=mode(a))

Вход «а», где «а» не является режимом «а». Выводит пустой массив для отсутствия чудака.

Иеремия Пик
источник
1

Haskell, 33 * 0,75 = 24,75 байт

f s=[c|[c]<-(`filter`s).(==)<$>s]

Возвращает пустой список, если нет нечетного символа.

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

Для каждого символа cв матрице (заданной в виде строки s) создайте строку всех символов в ней s, равную cдлине 1.

Ними
источник
1

JavaScript (ES6), 37 байт

Возвращает, nullесли нет нечетной буквы.

s=>s.match(`[^
${s.match(/(.)\1/)}]`)

Контрольные примеры

Arnauld
источник
1

Japt , 6 байт

Принимает ввод как многострочную строку и выводит односимвольную строку или пустую строку, если нет решения.

k@èX É

Попробуй


объяснение

Удалите символы, которые возвращают truey ( k) при прохождении через функцию ( @), которая считает ( è) вхождения текущего элемента ( X) во входных данных и вычитает 1 ( É).

мохнатый
источник
1

Желе , 4 байта

ċ@ÐṂ

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

Возврат \n(одна новая строка), если нет нечетного символа. очевидно\n это не печатный символ.

По совпадению это тот же алгоритм, что и в ответе Mr.Xcoder Python. (Я придумал это самостоятельно)

Объяснение:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

Это работает, потому что в m×nматрице:

  • Если существует нечетный символ: есть m-1новые строки, 1 нечетные символы и m×n-1нормальный символ, и 1 < m-1 < m×n-1потому5 ≤ m, n ≤ 10 .
  • Если не существует нечетного символа: есть m-1новые строки и m×nнормальный символ, и m-1 < m×n.
user202729
источник
1

C # (.NET Core) , 54 байта

i=>i.GroupBy(x=>x).FirstOrDefault(g=>g.Count()<2)?.Key

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

Wakawakamush
источник
Вы правы, мой ответ был неверным. Я удалил его. Но вы пропускаете 18 байтов из usingоператора в подсчете байтов.
Разнагул
1

C (gcc) , 91 86 82 79 71 байт

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

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

  • Спасибо Гастропнеру за XOR и? трюки (-3 байта)
  • Переработана версия сравнения для исправления ошибок и использование магии Gastropner из комментариев.

Объяснение:

Сравните текущий и предыдущий символ, пропуская новые строки. Если отличается, сравните со следующим символом. Это говорит нам, если мы вернемся текущий или предыдущий символ. Функция возвращает «нечетное» значение char, если оно существует, или 0, если массив не является нечетным. Мы получаем «следующую» проверку символов, потому что перед символом всегда стоит новая \0строка. Если нет нечетного символа, мы возвращаем \ 0 из цикла for.


Более старый, более сексуальный код xor Объяснение:

Создайте бегущую маску xor из следующих 3 строковых значений. Если они все одинаковы, то значение будет равно любому из трех. Если они различаются, то 2 идентичных будут взаимно уничтожать друг друга, оставляя уникальное.

Должен множитель / n перед xor, иначе он станет грязным. Также нужно проверить 2 символа на неравенство в случае, если s [0] нечетное значение. Это стоит дополнительных || чек об оплате.

v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^‌​*s++||v^*s)break;}}
Майкл Дорган
источник
79 с несколькими настройками. Обратный возврат не согласуется с моим компилятором, поэтому тестируется только на v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^*s++||v^*s)break;}}
TIO
Для дерьма, которое я пишу, я придерживаюсь TIO. Благодаря!
Майкл Дорган
Перестановка некоторых выражений позволяет получить еще -2 для 77: v;f(char*s){while(s[2]==10?s+=3:0,v=*s^s[1]^s[2],s[3])if(v^*s++||v^*s)break;} однако ваша победившая лошадь - другая, если вы немного v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
поиграете
Да, но XOR кажется таким сексуальным. :)
Майкл Дорган
Предлагаю s+=*++s-10?0:2вместо*++s==10?s+=2:0
floorcat
1

Октава , 26 25 байт

1 байт сохранен благодаря @Giuseppe

@(x)x(sum(x(:)==x(:)')<2)

Анонимная функция, которая принимает двумерный массив символов в качестве входных данных и выводит либо нечетную букву, либо пустую строку, если она не существует.

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

Луис Мендо
источник
0

Алиса , 16 * 75% = 12 байт

/-.nDo&
\i..*N@/

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

Выводится, Jabberwockyесли нет повторяющегося символа.

объяснение

/...@
\.../

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

i..DN&-o

i   Read all input.
..  Make two copies.
D   Deduplicate one copy, giving only the two letters and a linefeed.
N   Multiset difference. Removes one copy of each letter and one linefeed.
    Therefore it drops the unique letter.
&-  Fold substring removal over this new string. This essentially removes
    all copies of the repeated letter and all linefeeds from the input,
    leaving only the unique letter.
.   Duplicate.
n   Logical NOT. Turns empty strings into "Jabberwocky" and everything else
    into an empty string.
*   Concatenate to the previous result.
o   Print the unique letter or "Jabberwocky".

Вместо этого &-мы могли бы также использовать ey(транслитерацию в пустую строку). В качестве альтернативы, потратив еще один символ на манипуляции со стеком, мы также можем дедуплицировать ввод, который позволяет нам удалять ненужные символы N, но это все равно с тем же количеством байтов:

i.D.QXN.n*o@

Алиса , 13 байт

/N.-D@
\i&.o/

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

Это решение без бонуса, просто отсутствует .n*.

Мартин Эндер
источник
0

APL + WIN, 16 байт

(1=+/a∘.=a)/a←,⎕

Запрашивает ввод с экрана и либо выводит нечетную букву, либо ничего, если нет нечетной буквы

Грэхем
источник
a/⍨1=+/a∘.=a←,⎕за байт
Уриэль
@Uriel Спасибо, но я боюсь, что оператор ⍨ недоступен в моем старом APL + WIN версии 5 :(
Грэм
0

PowerShell , 39 байт

([char[]]"$args"|group|sort c*)[0].Name

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

Принимает ввод в виде строки с символами новой строки (как указано в вызове), преобразует его в char-array. Затем мы Group-Objectиспользуем символы, так что символы группируются по их именам, а затем sortна основе cколичества. Это гарантирует, что одинокий символ будет первым, поэтому мы берем [0]индекс и выводим его .Name.

Если новая строка приемлема для «ничего», то это соответствует бонусу.

AdmBorkBork
источник
Я надеялся, sort c*)[0]что можно сократить, но я придумал то же количество байтов ? c* -eq 1).
root
можно сократить, удалив двойные кавычки вокруг $args. Также это более точно сделать, так ([char[]]$args|group|? c* -eq 1).Nameкак он будет точно возвращать, nullкогда нет нечетного символа (вместо новой строки). Однако с точки зрения байтов это все равно не приведет вас ниже 37.
cogumel0
@ cogumel0 Не работает без двойных кавычек.
root
@ корень, ты прав. Тем не менее , чтобы передать одному из требований (один символ , который является «нечетным» в матрице , или None, nil, NUL, или строки"None" , если нет «нечетного» характера.) Он должен еще быть изменен. Новая строка не является частью приемлемых ответов.
cogumel0
@ cogumel0 Ах, проблема была изменена, так как я отправил свой ответ. «Нет / ноль / все» раньше было скорее бонусом, чем обязательным. Я собираюсь оставить свой ответ как есть.
AdmBorkBork
0

Perl 6 ,  27  24 -25% = 18 байт

*.comb.Bag.min(*.value).key

Попробуй это

{%(.comb.Bag.invert){1}}

Попробуй это

Это будет вернет неопределенное значение если дан ввод, у которого нет нечетного символа.

Expanded:

{  # bare block lambda with implicit parameter 「$_」

  %(        # coerce into a Hash

    .comb   # split the input into graphemes (implicit method call on 「$_」)
    .Bag    # turn into a weighted Set
    .invert # invert that (swap keys for values) returns a sequence

  ){ 1 }    # get the character that only occurs once
}
Брэд Гилберт b2gills
источник
0

Brainfuck, 125 байт

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

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

Печатает букву матрицы, если нет нечетного

Джо Кинг
источник
0

Java 8, 85 байт

Это лямбда от Stringдо String(например Function<String, String>). По сути, это копия решения Луки , но я немного сократил сортировку строк.

s->new String(s.chars().sorted().toArray(),0,s.length()).replaceAll("(.)\\1+|\\n","")

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

Jakob
источник