Odd'em out: букви


11

Об'єктивна

Напишіть програму або функцію (або еквівалент), яка сортує та повертає непарну букву в матриці випадкового розміру.

Деталі

Вам буде передано матрицю (як рядок) як вхід випадкових розмірів, таких як цей.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

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

Застосовуються стандартні лазівки. Це виклик з кодом для гольфу; запис з кодом найменших байтів виграє.

Вхідні дані

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

Вихідні дані

Єдиний символ , який є «непарних» в матриці або None , nil, NULабо рядок , "None"якщо немає «непарного» характеру.

Більше прикладів

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Відповідь: I

vvqvvvvvvvv
вввввввввв
вввввввввв
вввввввввв
вввввввввв

Відповідь: q

puuuuuuuu
ууууууууу
ууууууууу
ууууууууу
ууууууууу
ууууууууу
ууууууууу
ууууууууу
ууууууууу
ууууууууу

Відповідь: p

Генератор

Ось генератор випадкових матриць, написаний на Python, який ви можете використовувати для тестування програми. Примітка. Є невелика ймовірність, що він може помилитися і не поставити його в непарному листі.


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{\:~

шис ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input

2
@ FrownyFrog Це розумний спосіб знайти дивного персонажа
Гален Іванов

не можу вирішити, що мені подобається краще: цей чудовий гачок чи твій жарт з драконом ...
Jonah

4

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

oḅ∋≠

Спробуйте в Інтернеті!

Пояснення

Я раніше не використовував Брахілог, тому це може бути не оптимально.

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.

Це використання ∋≠після, щоб отримати результати довжини 1, дуже розумне. Ви обов'язково повинні опублікувати його у питанні про поради Брахілога .
Фаталізувати

@Fatalize Спасибі, я додав підказку.
Згарб

3

K (oK) , 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"

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

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

Я не знаю, що цілком справедливо вводити gets()тестовий драйвер, оскільки він санітує введення, видаляючи \ n знаки для вас. Це виконує певну роботу, щоб ваша функція не працювала на вихідному вході.
Майкл Дорган

@MichaelDorgan Працює з конвеєрним входом із сценарію python, а також із введенням у TIO. Інші просто жорстко кодували вхід, який не здавався духу виклику.
клебланк

3

05AB1E ,  4  2 байти

Збережено 2 байти завдяки Аднану

.m

Спробуйте в Інтернеті!

Пояснення

.m   # push a list of the least frequent character(s) in input

Чи потрібно видаляти нові рядки, бачачи, як ми гарантуємо, що вхід буде тривати принаймні 5 рядків?
Кудлатий

@Shaggy: Ні, я ні. Це було обробляти 2x2матриці. Я пропустив частину про 5x5і вище. Дякую!
Емінья

Він повинен повернутися, nilякщо у нього немає "непарного", чи не так?
Magic Octopus Urn

@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 Насправді я не знаю, як інтерпретувати це правило, оскільки я бачу, що деякі (інші) користувачі явно знають про це правило, але все ж публікують такі відповіді, як ця.
користувач202729

2
@ user202729, тому що це роблять інші, це не означає, що це правильно;) Якщо ви помітили такі рішення, краще вказати на них.
Кудлатий

@Shaggy Ну, я явно вказав на це правило, але той користувач сказав: "правило прямо говорить, що це дійсне". Я не знаю, що сказати. | У цьому випадку функція вимагає tнульового масиву перед викликом кожного разу не в перший раз.
користувач202729

@Shaggy Спасибі, виправлено.
Colera Su


2

Баш , 15 20 байт

fold -1|sort|uniq -u

Спробуйте в Інтернеті!

Пояснення: fold s введення 1символу для кожного рядка, sorts його на групи відповідних літер, а потім друкує лише рядки, які є unique.

Дякуємо @Nahuel Fouilleul за те, що вирішили проблему з таким підходом.


не працює, якщо непарний персонаж є другим або пенуйтлімат
Nahuel Fouilleul

@NahuelFouilleul Хороший улов ... Я не знаю, як це виправити на даний момент, але я виправлю або видаляю пізніше, якщо у вас не було запропонованого виправлення.
Джастін Марінер

це можна просто виправити, |sort|але може бути краще рішення
Nahuel Fouilleul

також знайшов рішення з грепом, але це довшеgrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Нахуель Фольє

@NahuelFouilleul Я збираюся sortвиправити, дякую. Ти завжди можеш розмістити цю грепну відповідь як свою, якщо хочеш.
Джастін Марінер



1

Матлаб, 25 байт

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

Вхід "a" де "a" не є режимом "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/)}]`)

Тестові справи


1

Japt , 6 байт

Приймає введення як багаторядковий рядок і виводить рядок з одним символом або порожній рядок, якщо немає рішення.

k@èX É

Спробуй це


Пояснення

Видаліть символи, які повертають truthy ( 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.


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

Спробуйте в Інтернеті!

  • Завдяки Gastropner за xor і? трюки (-3 байти)
  • Переробив порівняльну версію, щоб виправити помилки та використав магію Gastropner з коментарів.

Пояснення:

Порівняйте поточний та попередній знаки, пропускаючи нові рядки. Якщо різні, порівняйте з наступною таблицею. Це говорить нам, чи повернемо поточну чи попередню схему. Функція повертає "непарне" значення char, якщо воно існує, або 0, якщо масив не є непарним. Ми відходимо від "наступної" перевірки чар, тому що завжди є новий рядок перед цим \0. Якщо немає непарних знаків, ми внутрішньо повертаємо \ 0 з циклу for.


Старший, сексуальніший XOR-код Пояснення:

Створіть запущену маску xor з наступних 3 рядкових значень. Якщо вони однакові, то значення буде дорівнює будь-якому з трьох. Якщо вони різні, то два однакових відмінять один одного, залишаючи унікальний.

Потрібний фактор / 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 з декількома твіками. Повернення проходження не погоджується з моїм компілятором, тому перевірено лише на TIO: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;}}
gastropner

Щодо лайно, про яке я пишу, ТІО - це те, на що я дотримуюся. Дякую!
Майкл Дорган

Перестановка деяких виразів дозволяє отримати ще -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
roofcat


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 Дякую, але я боюся, що оператор not недоступний у моїй старій версії APL + WIN 5 :(
Грем

0

PowerShell , 39 байт

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

Спробуйте в Інтернеті!

Приймає введення як рядок з новими рядками (як зазначено в виклику), перетворює його в- charмасив. Потім ми Group-Objectсимволи, так що символи згруповані разом за своїми іменами, а потім sortна основі cунти. Це забезпечує, що самотній персонаж перший, тому ми беремо[0] індекс і виводимо його .Name.

Якщо новий рядок прийнятний для "нічого", то це може бути бонусом.


Я сподівався , що sort c*)[0]може бути скорочений, але то , що я придумав було таке ж кількість байтів, ? c* -eq 1).
корінь

можна скоротити, видаливши подвійні лапки навколо $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}}

Перевірте це

Це поверне невизначене значення при введенні, що не має непарного символу.

Розширено:

{  # 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
}


0

Java 8, 85 байт

Це лямбда від Stringдо String(наприклад Function<String, String>). Це по суті копія рішення Лука , але я трохи впорядкував рядки, сортуючи їх.

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

Спробуйте це в Інтернеті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.