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.