Так просто, як ABC


28

Вхідні дані

Рядок , яка містить не більше одного з кожних з букв A, Bі C. Вони можуть бути в будь-якому порядку. Порожній рядок є коректним введенням.

Примітка. У попередній версії цього виклику LEJзамість ABCних використовувались букви, і вони можуть все ще використовуватися при бажанні.

Вихідні дані

Рядок з A, B, Cбукв , які не були присутні на вході. Вони можуть бути в будь-якому порядку.

Якщо виведенням буде порожній рядок, то просто не даючи виводу є дійсним, якщо це має сенс для вашої реалізації. (наприклад, вам не потрібно насправді дзвонити printна порожню рядок.)

Приклади

  • Якщо вхід є, Bто вихід повинен бути CAабо таким, або ACяк, Aі Cне є у вході.
  • Якщо вхід є порожнім рядком, то вихід повинен бути ABCабо будь-яка перестановка, оскільки жодна з трьох букв не присутня у введенні.
  • Якщо вхід є, CABто на виході повинен бути порожній рядок, оскільки всі три букви присутні у введенні.

Випробування

Є так мало випадків введення, що ми можемо перерахувати всі:

in -> out1 | out2 | out3 | ...
ABC -> ""
ACB -> ""
BCA -> ""
BAC -> ""
CAB -> ""
CBA -> ""
AB -> C
AC -> B
BC -> A
BA -> C
CA -> B
CB -> A
A -> BC | CB
B -> CA | AC
C -> AB | BA
"" -> ABC | ACB | BCA | BAC | CAB | CBA

Всі дійсні виходи для кожного введення задані, розділеними |'s. ""являє собою порожній рядок

Оцінка балів

Виграє найкоротший код у байтах. Але майте на увазі, що ви можете отримати більше визнання для вирішення проблеми унікальним способом, а не коротким способом;)



1
Завдання встановлюється різницею між постійною та вхідною. Вимагати, щоб все робилося в рядках, громіздко з точки зору складності фактичного завдання.
Мего

2
Я смутно пам'ятаю більш точну відповідність дупу, де вам довелося відняти вхід з постійного набору.
xnor

1
Чи можуть входи містити літери поза "ABC"? Специфікація: "Рядок, що містить щонайбільше одну з кожної літери A, B і C", не виключає таких входів.
theonlygusti

1
@theonlygusti Вхід повинен містити лише ABC
Calvin's Hobbies

Відповіді:


20

Python 3, 29 27 22 байт

lambda x:{*"ABC"}-{*x}

-2 байти завдяки Джонатану Аллану

-5 байт завдяки Роду


print(*{*"LEJ"}-{*input()})економить 2. (перевірено на 3.5 та 3.6).
Джонатан Аллан


14
Я люблю python ❤️
theonlygusti

@theonlygusti Що б сталося з <3 і ♥?
wizzwizz4

@theonlygusti: Я би дуже любив python, якщо зможу замінити lamda на 𝛌
Фахім Паркар

10

Желе , 4 байти

Завдяки @DuctrTape за пропозицію про зміну та наявність "ABC" у словнику Jelly.

“ḃ»ḟ

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

“ḃ»шукає запис "ABC" у словнику Джеллі, - це діада, що відкидає файли, яка відкидає символи, знайдені у вхідному списку зі списку символів. Результат неявно друкується.


Для нижньої версії словник, який використовується словником, може бути або "abac" ( “c»), або "abaca" ( “i»).


Коли викликом було "LEJ", у верхньому регістрі можна досягти лише 6 байтів, оскільки жодного запису словника не існує з цим набором символів, що дозволяє нам створити список символів “LEJ”(або перестановку їх).

Нижній варіант вийшов з ладу краще на 5 байт через наявність слова "jell" ( “ẎṄ»).


1
Мені подобається, як більшість коду просто генерує рядок "ABC", а сама програма - один символ. Класичне желе.
sagiksp

6

Bash + coreutils, 15 байт

tr -d x$1<<<LEJ

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

Я хотів би опустити x, але тоді tr -dб не було аргументу, коли рядок введення порожній. (Це xне приносить ніякої шкоди, оскільки в цьому рядку LEJ немає жодного символу x.) Я б зазвичай писав tr -d "$1", але роблю це так, як я це робив, на один байт коротший від цього.


У мене були такі ж думки - навіть із цитатами - одразу теж.
rexkogitans

6

Сітківка , 14 байт

Кількість байтів передбачає кодування ISO 8859-1.

$
¶ABC
D`.
A1`

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

Пояснення

$
¶ABC

Додайте другий рядок, що містить ABC.

D`.

Дублюйте символи. Це видаляє кожен символ із другого рядка, який уже з’являється у першому рядку.

A1`

Відмовтеся від першого рядка.


Як саме працює 1`частина стадії антигрепп?
Kritixi Lithos

@KritixiLithos Числа в рядку конфігурації - це обмеження. 1загалом означає "зробити X лише один раз". Як саме обмежує роботу (тобто, що таке X), залежить від типу етапу, який ви використовуєте. Для етапів антигрептів Retina спочатку перевіряє, які рядки відповідають регулярному вираженню (тут кожен рядок, оскільки регулярний вираз є порожнім), але потім обмеження означає "відкинути тільки перший рядок". Так само, якби це був греп-етап, це означало б "зберігати лише першу лінію відповідності". Семантика всіх обмежень перелічена на вікі .
Мартін Ендер

6

05AB1E , 6 4 байти

Збережено 2 байти, використовуючи нову žRкоманду, як запропонував Кевін Круїссен

žRsм

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

   м  # remove the character of
  s   # the input
žR    # from the string "ABC"

Чи не слід вводити лише Jповернення EL, LE?
Чарівний восьминога Урна

2
Приємно! Як FYI, вхідні дані також можуть бути представлені як """{input}""", що також працює для порожніх рядків :).
Аднан

@carusocomputing: може повернутися або (у цьому випадку повертається LE).
Емінья


1
@Emigna Tbh ні. Я думаю, що він був доданий через цю проблему, але я особисто раніше не використовував його.
Кевін Кройсейсен

5

Java 7, 73 58 байт

String c(String s){return"EJL".replaceAll("[ "+s+"]","");}

15 байт збережено завдяки @KritixiLithos .

Код тесту:

Спробуйте тут.

class M{
  static String c(String s){return"EJL".replaceAll("[ "+s+"]","");}

  public static void main(final String[] a) {
    System.out.print("LEJ=" + c("LEJ") + "; ");
    System.out.print("LJE=" + c("LJE") + "; ");
    System.out.print("EJL=" + c("EJL") + "; ");
    System.out.print("ELJ=" + c("ELJ") + "; ");
    System.out.print("JLE=" + c("JLE") + "; ");
    System.out.print("JEL=" + c("JEL") + "; ");
    System.out.print("LE=" + c("LE") + "; ");
    System.out.print("LJ=" + c("LJ") + "; ");
    System.out.print("EJ=" + c("EJ") + "; ");
    System.out.print("EL=" + c("EL") + "; ");
    System.out.print("JL=" + c("JL") + "; ");
    System.out.print("JE=" + c("JE") + "; ");
    System.out.print("L=" + c("L") + "; ");
    System.out.print("E=" + c("E") + "; ");
    System.out.print("J=" + c("J") + "; ");
    System.out.print("\"\"=" + c(""));
  }
}

Вихід:

LEJ=; LJE=; EJL=; ELJ=; JLE=; JEL=; LE=J; LJ=E; EJ=L; EL=J; JL=E; JE=L; L=EJ; E=JL; J=EL; ""=EJL

1
Ви можете зробити "["+s+"]"замість цього s.replaceAll("(.)","$1|")?
Kritixi Lithos

@KritixiLithos Smart. Він не відповідає порожній рядку, але додаючи пробіл (або будь-який інший символ, який його немає EJL) він працює знову, що ще набагато коротше. :)
Кевін Круїссен



4

MATL, 10 8 байт

Збережено два байти завдяки Suever. setdiffкоротше, ніж ismember.

'ABC'iX-

Спробуйте тут!

Пояснення

'ABC'      % Create a string literal
     i     % User input
      X-   % Set difference, between two elements of the stack 

Так, це могло бути тривіальним завданням, але я цілком задоволений, що мені вдалося вирішити це з MATL все самостійно. Я ніколи не говорив, що це найкоротше рішення ... Дякую Сьювер!


4

JavaScript ES6, 41 39 38 байт

s=>eval(`'ABC'.replace(/[${s}]/g,'')`)

Збережено 2 байти завдяки Арнольду. Збережено 1 байт завдяки LarsW.

f=s=>eval(`'ABC'.replace(/[${s}]/g,'')`)

console.log(f("AB"));


Я на мобільному, тому не можу перевірити свій код, але це має спрацювати, я думаю:s=>eval`'ABC'.replace(/[${s}]/g,'')`
LarsW

Хороша робота! Будучи в стані сказати .join``рятує вас два символу над вирішенням я придумав: f=s=>"ABC".replace(RegExp(`[${s}]`,'g'),"").
nnnnnn

1
@LarsW Точний код, здається, не працює, але додавання дужок навколо рядка шаблону зробило і зберегло один байт. Спасибі!
Том

3

V , 10 байт

CLEJ<ESC>Ó[<C-r>"]

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

Hexdump:

00000000: 434c 454a 1bd3 5b12 225d                 CLEJ..[."]

Пояснення

Введення знаходиться в першому рядку буфера. Тож щось на кшталт:

EL

і курсор знаходиться на першому символі. Таким чином, ми видаляємо вхід (який зберігає його в реєстрі ") і вводимо режим вставки одночасно, використовуючи C.

Опинившись у режимі вставки, символи LEJвставляються, після чого я повертаюсь у звичайний режим за допомогою <ESC>.

Тепер ми повинні видалити всі символи, які присутні у вводі.

Ó                       " remove every
 [<C-r>"]               "  character that appears in the input
                        " synonym of Vim's :s/[<C-r>"]//g

І як тільки це станеться, нам залишаються букви, що залишилися в буфері.


3

Рубі, 27 19 18 байт

->s{"ABC".tr s,""}

-1 байт завдяки Мартіну Ендеру


3

Haskell , 27 26 байт

import Data.List
("ABC"\\)

Спробуйте в Інтернеті! Використання: ("ABC"\\) "CB"урожайність "A".

\\є оператором заданої різниці, круглі дужки утворюють так званий розділ, який є короткою формою для lamda (\x -> "ABC" \\ x).


Без імпорту: (те саме число байтів завдяки @nimi)

f x=[c|c<-"ABC",all(/=c)x]

Спробуйте в Інтернеті! Використання: f "CB"урожайність "A".


Інші підходи:

f x=filter(`notElem`x)"ABC"
(`filter`"ABC").flip notElem
f x=[c|c<-"ABC",notElem c x]

1
Я сподіваюся, що (\\)незабаром буде перенесено до Прелюдії.
theonlygusti

@theonlygusti Я сподіваюся, що цього не буде; це насправді не розумна операція для списків (принаймні, не, якщо ви прямо не заявите, що хочете встановити список). Операція за замовчуванням для цього завдання повинна бути Data.Set.difference.
перестала повертати проти годинника,

@ceasedtoturncounter clockwis чому це не розумно? Крім того, єдина причина, яку я бажаю, щоб вона рухалася, це те, що вона корисна, часто.
theonlygusti

1
@theonlygusti це нерозумно в тому сенсі, що якщо ви опинитесь ним, це знак того, що ви, ймовірно, використовуєте неправильну структуру даних. Списки можуть мати повторювані елементи, порядок, і вони можуть бути ліниво побудовані (навіть нескінченні). (\\)нічого з цього не поважає. Типи даних, призначені для такої поведінки, мають структуру, яка робить їх, як правило, дещо ефективнішими, безпечнішими (оскільки можливі припущення щодо стабільності тощо не можуть бути порушені) та відкриває більш зручний інтерфейс.
перестали повертати проти годинника,

@ceasedtoturncounter clock - що, так, це так. "Перший екземпляр ...", але nvm
theonlygusti

3

GNU sed , 34 29 байт

Включає +1 для -r

-5 завдяки Digital Trauma

s/^/ABC/
:
s/(.)(.*)\1/\2/
t

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

Чомусь TIO не працює з розширеним регулярним виразом ( -r), тому мені довелося загортати його в BASH.


s/^/ABC/        # put ABC at the beginning of the string
:               # nameless label
s/(.)(.*)\1/\2/ # remove a duplicate letter
t               # branch to the nameless label if something changed

Новий рядок, -nі Pне потрібні. Також ви можете загорнути це в баш, щоб змусити його працювати в TIO. Не маю уявлення, чому -rце не працює. tio.run/nexus/bash#DcmxDYAwDATA/qdIR4JELCjp7F8jooIFCPubb@/…
Digital Trauma

@DigitalTrauma Дякую! Коли я писав це, я думав, що крім персонажів A, B і C будуть ще символи.
Райлі

3

Мозок-Флак , 120 + 3 = 123 байти

<>((((((((()()){}){}){}){}){}())())())<>{({}(<()>)){(([({})]<>({}))){(<({}<>{})<>([{}]{}<>)>)}{}}{}{}<>{}{({}<>)<>}{}}<>

Він працює з -cпрапором, додаючи 3 байти

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

Пояснення

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

Анотований код

<>((((((((()()){}){}){}){}){}())())())<> # Switch to right stack, push CBA, switch back
{({}(<()>)){(([({})]<>({}))){(<({}<>{})<>([{}]{}<>)>)}{}}{}{}<>{}{({}<>)<>}{}}<>

Ще пояснення:



2

Морква , 15 байт, неконкурентна

неконкурентований через помилку, яку я знайшов із поверненими сірниками та порожніми рядками. Тому я це просто виправив

ABC^//[^#]/gS""

Спробуйте в Інтернеті! (Копіювати Вставити)

Пояснення

ABC^                   //sets stack (just a string, not an array) to "ABC"
    /                  //return match(es) of:
     /[^#]/g           // `#` is the placeholder for the input
                       // so effectively, this returns the matches of any character not present in the input
                       // applied on the stack
                       //this returns an array of all the matches of the regex
            S""        //join all the elements of the array using "", the empty string



2

Октава, 29 27 байт

Збережено два байти завдяки Suever, створивши рядок 'ABC'всередині ismemberвиклику.

@(s)x(~ismember(x='ABC',s))

Ми використовуємо ~ismember()як логічні показники до змінної x. Своєрідна річ у тому, що ми створюємо x='ABC' всередині ismember , а не перед нею. Порядок Октава бачить це:

@(s)                        % Anonymous function that takes a string s as input
                x='ABC'     % Create a variable x with the characters 'ABC'
       ismember(x='ABC',s)  % True for elements that are in both x and s. False otherwise.
      ~ismember(x='ABC',s)  % Negate this, so that we keep the characters that aren't in s
@(s)x(~ismember(x='ABC',s)) % Use the logical vector as indices to x and return the result

2

C #, 50 байт 32 байт 47 байт 35 байт

де iвхід:

i=>string.Join("","ABC".Except(i));

Повна програма перевірена на LINQPad

void Main()
{
    var testcases = new Dictionary<string,string[]>
    {
        ["ABC"] = new[]{""},
        ["ACB"] = new[]{""},
        ["BCA"]  = new[]{""},
        ["BAC"]  = new[]{""},
        ["CAB"]  = new[]{""},
        ["CBA"]  = new[]{""},
        ["AB"] = new[]{"C"},
        ["AC"] = new[]{"B"},
        ["BC"] = new[]{"A"},
        ["BA"] = new[]{"C"},
        ["CA"] = new[]{"B"},
        ["CB"] = new[]{"A"},
        ["A"] = new[]{"BC","CB"},
        ["B"] = new[]{"CA","AC"},
        ["C"] = new[]{"AB","BA"},
        [""] = new[]{"ABC","ACB","BCA","BAC","CAB","CBA"},
    };

    var output = "";

    foreach(var input in testcases.Keys)
    {
        var expect = testcases[input];
        var actual = GetResult(input);
        if(!expect.Contains(actual)) throw new ApplicationException($"{input}:{string.Join(",",expect)}:{actual}");
        output+=$"{input} -> {actual}\n";
    }
    output.Dump();
}

// Define other methods and classes here
private string GetResult(string input){
    return string.Join("","ABC".Except(i));
}

Результати тесту

ABC ->
ACB ->
BCA ->
BAC ->
CAB ->
CBA ->
AB -> C
AC -> B
BC -> A
BA -> C
CA -> B
CB -> A
A -> BC
B -> AC
C -> AB
-> ABC


1
Це неправдива відповідь, це повинна бути функція чи програма, а не фрагмент коду.
theonlygusti

Ага. Моє ліжко. Перший таймер тут. Тож мені потрібна частина друку в ньому?
Майкл Коксон

@MichaelCoxon: Вам або потрібно зробити запис у всій програмі, яка компілюється (не рекомендується в C #, у ній багато котлів), або у функцію, яку можна викликати кілька разів; на даний момент це просто заява. У C # майже завжди найпростіше перетворити його на функцію, створивши лямбда, яка приймає введення через свої аргументи і повертає через своє повернене значення.

string.Join("",...)-> string.Concat(...)Економить 1 байт
Втілення Невігластва

1

APL, 7 байт

'ABC'∘~

~встановлюється віднімання, є складанням, тому це функція, яка повертає ABCмінус символів у своєму введенні.



1

Perl 5,9,9 79 38 37 35 байт

perl -le '$_="ABC";eval"y/$ARGV[0]//d";print'

(не впевнений у правилах підрахунку тут - включені перемикачі, але не команда perl).

> perl -le '$_="ABC";eval"y/$ARGV[0]//d";print' AB
C
> perl -le '$_="ABC";eval"y/$ARGV[0]//d";print'
ABC

(скориговане підрахунок після коментаря до рішення нижче)


Це буде працювати для порожнього введення?
Тит

Тепер я виправив помилку транскрипції (мав "..", набрав {,,} тут ...)
Том Таннер

Ваш код довжиною 35 байт. (34 +1 для -lпрапора). :)
Пол Пікар

Спасибі. -L призначений для попередньої обробки (як у новому рядку в кінці виводу). не був впевнений, що це потрібно з правил конкурсу.
Том Таннер

Завдяки 5.14+ ви можете зробити perl -pe'$_=eval"ABC=~y/$_//dr"'лише 23 байти (22 + 1 за -p).
ThisSuitIsBlackNot

1

Лист звичайний, 71 байт

Найбільший запис на даний момент, але принаймні читабельний ;-)

(lambda(s)(coerce(set-difference'(#\A #\B #\C)(coerce s'list))'string))


1

Pyth, 4 байти

-<G3

Спробуйте тут!

 <G3 -  alphabet[:3]
-    - input-^

Зверніть увагу: для цього використовується малі регістри, які можуть бути неприйнятними



1

Пакетна, 101 байт

@set/ps=
@for %%c in (L E J)do @call set d=%%s:%%c=%%&call:c %%c
:c
@if "%d%"=="%s%" set/pd=%1<nul

Здійснює вхід на STDIN, а це означає, що %1він порожній, коли код потрапляє в підпрограму помічника і нічого не друкується.


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