Tão fácil quanto ABC

28

Entrada

Uma string que contém no máximo um de cada uma das cartas A, Be C. Eles podem estar em qualquer ordem. A cadeia vazia é uma entrada válida.

Nota: Uma versão anterior deste desafio usava as letras em LEJvez de ABCe elas ainda podem ser usadas, se desejado.

Saída

Uma corda dos A, B, Cletras que não estavam presentes na entrada. Eles podem estar em qualquer ordem.

Se a saída for a sequência vazia, simplesmente não fornecer saída é válida, se isso fizer sentido para sua implementação. (por exemplo, você não precisa realmente chamar printuma string vazia.)

Exemplos

  • Se a entrada for B, a saída deve ser CAou ACdesde Ae Cnão está presente na entrada.
  • Se a entrada for a sequência vazia, a saída deverá ser ABCou qualquer permutação, pois nenhuma das três letras está presente na entrada.
  • Se a entrada for CAB, a saída deve ser a sequência vazia, porque todas as três letras estão presentes na entrada.

Casos de teste

Existem tão poucos casos de entrada que podemos enumerar todos eles:

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

Todas as saídas válidas para cada entrada são fornecidas, separadas por |'s. ""representa a cadeia vazia

Pontuação

O código mais curto em bytes vence. Mas lembre-se de que você pode obter mais reconhecimento por resolver o desafio de uma maneira única , e não de uma maneira curta;)

Passatempos de Calvin
fonte
1
Formato de E / S
complicado
1
A tarefa é definida como diferença entre uma constante e uma entrada. Exigir que tudo seja feito em strings é complicado no que diz respeito à dificuldade da tarefa real.
Mego 16/02
2
Lembro-me vagamente de uma correspondência mais exata, em que era necessário subtrair a entrada de um conjunto constante.
Xnor
1
As entradas podem conter letras fora de "ABC"? A especificação: "Uma sequência que contém no máximo uma de cada uma das letras A, B e C" não exclui essas entradas.
21717 The13lygusti
1
@theonlygusti A entrada deve conter apenas ABC
Calvin's Hobbies

Respostas:

20

Python 3, 29 27 22 bytes

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

-2 bytes graças a Jonathan Allan

-5 bytes graças a Rod

Trelzevir
fonte
print(*{*"LEJ"}-{*input()})salva 2. (testado em 3.5 e 3.6).
Jonathan Allan
14
Eu amo python ❤️
theonlygusti
@theonlygusti O que aconteceu com <3 e ♥?
Wizzwizz4
@theonlygusti: Eu adoraria python se eu posso substituir lambda com λ
Fahim Parkar
10

Gelatina , 4 bytes

Obrigado a @DuctrTape pelo prod sobre a mudança e a presença de "ABC" no dicionário de Jelly.

“ḃ»ḟ

Experimente online!

“ḃ»procura a entrada "ABC" no dicionário de Jelly, é o díodo de descarte do arquivador que descarta os caracteres encontrados na entrada dessa lista de caracteres. O resultado é impresso implicitamente.


Para uma versão em minúscula, a entrada do dicionário a ser usada pode ser "abac" ( “c») ou "abaca" ( “i»).


Quando o desafio era "LEJ", apenas 6 bytes podiam ser alcançados na variante maiúscula, pois não existem entradas de dicionário com esse conjunto de caracteres, deixando-nos criar a lista de caracteres “LEJ”(ou uma permutação dos mesmos).

A variante minúscula apresentou melhor desempenho em 5 bytes devido à presença da palavra "gelatina" ( “ẎṄ»).

Jonathan Allan
fonte
1
Eu gosto de como a maior parte do código gera a string "ABC", e o próprio programa é um caractere. Geléia clássica.
2391717
6

Bash + coreutils, 15 bytes

tr -d x$1<<<LEJ

Experimente online!

Gostaria de omitir o x, mas tr -destaria faltando um argumento quando a string de entrada estivesse vazia. (Ele xnão causa nenhum dano, pois não há x no LEJ da string aqui.) Normalmente tr -d "$1", eu escreveria , mas fazê-lo da maneira que fiz é um byte menor que isso.

Mitchell Spector
fonte
Eu tive os mesmos pensamentos - mesmo com as aspas - imediatamente também.
Rexkogitans
6

Retina , 14 bytes

A contagem de bytes assume a codificação ISO 8859-1.

$
¶ABC
D`.
A1`

Experimente online!

Explicação

$
¶ABC

Acrescente uma segunda linha contendo ABC.

D`.

Desduplicar os caracteres. Isso exclui todos os caracteres da segunda linha que já aparece na primeira linha.

A1`

Descarte a primeira linha.

Martin Ender
fonte
Como exatamente a 1`parte do estágio antigrep funciona?
Kritixi Lithos
@KritixiLithos Os números na cadeia de configuração são limites. 1geralmente significa "apenas faça X uma vez". Como exatamente os limites funcionam (ou seja, o que é X) depende do tipo de estágio que você está usando. Para estágios antigrep, Retina primeiro verifica quais linhas correspondem ao regex (aqui, todas as linhas, uma vez que o regex está vazio), mas o limite significa "apenas descartar a primeira linha correspondente". Da mesma forma, se fosse um estágio grep, significaria "apenas manter a primeira linha correspondente". A semântica de todos os limites está listada no wiki .
Martin Ender
6

05AB1E , 6 4 bytes

2 bytes salvos usando o novo žRcomando, conforme sugerido por Kevin Cruijssen

žRsм

Experimente online! ou como testes

Explicação

   м  # remove the character of
  s   # the input
žR    # from the string "ABC"
Emigna
fonte
Uma entrada não deve Jretornar apenas EL, LE?
Urna de polvo mágico
2
Agradável! Assim como um FYI, as entradas também podem ser representadas como """{input}""", o que também funciona para cadeias vazias :).
Adnan
@carusocomputing: Ele pode retornar (neste caso, ele retorna LE).
Emigna
1
Agora podem ter 4 bytes
Kevin Cruijssen 26/03
1
@Emigna Tbh no. Acho que foi adicionado por causa desse desafio, talvez, mas pessoalmente não o usei antes.
Kevin Cruijssen 26/03
5

Java 7, 73 58 bytes

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

15 bytes salvos graças a @KritixiLithos .

Código do teste:

Experimente aqui.

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(""));
  }
}

Saída:

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
Kevin Cruijssen
fonte
1
Você pode fazer em "["+s+"]"vez de s.replaceAll("(.)","$1|")?
Kritixi Lithos
@KritixiLithos Smart. Ele falha na String vazia, mas adicionando um espaço (ou qualquer outro caractere que não seja EJL), ele funciona novamente, o que ainda é muito mais curto. :)
Kevin Cruijssen
5

Pitão, 5 bytes

-"ABC

Teste aqui

Expande para

-"ABC"Q
-       # Filter on absence
 "ABC"  # Literal string 
      Q # Input
Cajado
fonte
abc pode ser escrito como<G3
Maltysen
@ Maltysen sim muddyfish usou isso, mas é minúscula de qualquer maneira = \
Rod
4

MATL, 10 8 bytes

Economizou dois bytes graças a Suever. setdiffé mais curto que ismember.

'ABC'iX-

Experimente aqui!

Explicação

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

Sim, isso pode ter sido uma tarefa trivial, mas estou bastante satisfeito por conseguir resolvê-lo sozinho com o MATL. Eu nunca disse que era a solução mais curta ... Obrigado Suever!

Stewie Griffin
fonte
4

JavaScript ES6, 41 39 38 bytes

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

Economizou 2 bytes graças a Arnauld. Economizou 1 bytes graças ao LarsW.

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

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

Tom
fonte
Estou no celular, então não posso testar o meu código, mas isto deve funcionar eu penso:s=>eval`'ABC'.replace(/[${s}]/g,'')`
LarsW
Bom trabalho! Ser capaz de dizer .join``poupa dois personagens sobre a solução que eu tinha vindo acima com: f=s=>"ABC".replace(RegExp(`[${s}]`,'g'),"").
Nnnnnn
1
@LarsW Esse código exato não parecia funcionar, mas adicionar colchetes ao redor da sequência de modelos funcionou e salvou um byte. Obrigado!
Tom
3

V , 10 bytes

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

Experimente online!

Hexdump:

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

Explicação

A entrada está na primeira linha do buffer. Então, algo como:

EL

e o cursor está no primeiro caractere. Portanto, excluímos a entrada (que a armazena no registro ") e entramos no modo de inserção simultaneamente usando C.

Uma vez no modo de inserção, os caracteres LEJsão inseridos, após o que eu volto ao modo normal usando <ESC>.

Agora temos que remover todos os caracteres presentes na entrada.

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

E uma vez que isso acontece, ficamos com as letras restantes no buffer.

Kritixi Lithos
fonte
3

Ruby, 27 19 18 bytes

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

-1 byte graças a Martin Ender

GB
fonte
3

Haskell , 27 26 bytes

import Data.List
("ABC"\\)

Experimente online! Uso: ("ABC"\\) "CB"rendimentos "A".

\\é o operador de diferença definida, os parênteses formam uma seção chamada que é uma forma abreviada para a lamda (\x -> "ABC" \\ x).


Sem importação: (mesma contagem de bytes graças a @nimi)

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

Experimente online! Uso: f "CB"rendimentos "A".


Outras abordagens:

f x=filter(`notElem`x)"ABC"
(`filter`"ABC").flip notElem
f x=[c|c<-"ABC",notElem c x]
Laikoni
fonte
1
Espero (\\)que seja transferido para o Prelude em breve.
2181717 theellygusti
@theonlygusti Espero que não; essa não é realmente uma operação sensata para listas (pelo menos não, a menos que você indique explicitamente que deseja a lista como definida). A operação padrão para essa tarefa deve ser Data.Set.difference.
deixou de girar contra-relógiowis
@ceasedtoturncounterclockwis por que não é sensato? Além disso, a única razão pela qual desejo que ele se mova é porque é útil, frequentemente.
21417 The16ly17
1
@theonlygusti não é sensato no sentido de que, se você estiver usando, é um sinal de que provavelmente está usando a estrutura de dados errada. As listas podem ter elementos duplicados, uma ordem e podem ser construídas preguiçosamente (até infinitas). (\\)não respeita nada disso. Os tipos de dados que se destinam a esse comportamento têm uma estrutura que os torna geralmente um pouco mais eficientes, mais seguros (porque nenhuma suposição possível de estabilidade etc. pode ser quebrada) e expondo uma interface mais confortável.
deixou de girar contra-relógiowis
@ceasedtoturncounterclockwis o que, sim, ele faz. "A primeira instância de ..." mas nvm
theonlygusti 16/02
3

GNU sed , 34 29 bytes

Inclui +1 para -r

-5 graças ao Digital Trauma

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

Experimente online!

Por alguma razão, o TIO não funciona com o regex estendido ( -r), então tive que envolvê-lo no 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
Riley
fonte
A nova linha -ne Psão desnecessários. Também é possível agrupar isso no bash para que ele funcione no TIO. Não -rfaço ideia por que não funciona. tio.run/nexus/bash#DcmxDYAwDATA/qdIR4JELCjp7F8jooIFCPubb@/…
Digital Trauma
@DigitalTrauma Thanks! Eu estava pensando que haveria personagens além de A, B e C quando escrevi isso.
Riley
3

Flak cerebral , 120 + 3 = 123 bytes

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

É executado com o -csinalizador, adicionando 3 bytes

Experimente online!

Explicação

No geral, esse programa praticamente faz o conjunto da pilha direita menos a pilha esquerda, com a pilha direita inicializada CBAe a pilha esquerda inicializada na entrada.

Código anotado

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

Mais explicações por vir ...

0 '
fonte
2

Mathematica, 37 bytes

Complement@@Characters@{"ABC",#}<>""&
Martin Ender
fonte
Existe uma razão para você usar cadeias aqui em vez de listas de caracteres?
Greg Martin
@GregMartin hábito, eu acho
Martin Ender
só que eu acho que ele sai mais curto, se você pode evitarCharacters
Greg Martin
2

Cenoura , 15 bytes, não concorrente

não concorrente por causa de um erro que encontrei ao retornar correspondências e seqüências de caracteres vazias. Então eu apenas consertei

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

Experimente online! (copiar colar)

Explicação

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
Kritixi Lithos
fonte
2

CJam , 7 bytes

"ABC"l-

Experimente online! (Como um conjunto de testes separado por avanço de linha.)

Martin Ender
fonte
2

Oitava, 29 27 bytes

Economizou dois bytes graças ao Suever, criando a string 'ABC'dentro da ismemberchamada.

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

Usamos ~ismember()como índices lógicos para a variável x. O que é peculiar é que criamos x='ABC' dentro ismember , não na frente dele. A ordem em que o Octave vê isso:

@(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
Stewie Griffin
fonte
2

C #, 50 bytes 32 bytes 47 bytes 35 bytes

Onde iestá a entrada:

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

Aplicativo completo testado no 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));
}

Resultado dos testes

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

Michael Coxon
fonte
1
Essa não é uma resposta válida, deve ser uma função ou um programa, não um trecho de código.
2141717
Ah Minha culpa. Primeiro temporizador aqui. Então, eu preciso da parte impressa?
Michael Coxon
@ MichaelCoxon: Você precisa fazer a entrada em um programa inteiro, que é compilado (não recomendado em C #, ele possui muitos clichês) ou em uma função que pode ser chamada várias vezes; no momento é apenas uma declaração. Em C #, é quase sempre mais fácil transformá-lo em uma função criando um lambda, que recebe entrada por meio de seus argumentos e retorna por seu valor de retorno.
string.Join("",...)-> string.Concat(...)Salva 1 byte
Modalidade de Ignorância
1

APL, 7 bytes

'ABC'∘~

~é definida como subtração, é composta, portanto, esta é uma função que retorna ABCmenos os caracteres em sua entrada.

marinus
fonte
1

Água-viva , 9 bytes

PNI
 "ABC

Experimente online!

Em notação mais convencional, este programa se traduz em:

P(N("ABC", I))

Ié a entrada, Né a diferença da lista e Pé emitida.

Martin Ender
fonte
1

Perl 5.9.9 79 38 37 35 bytes

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

(não tenho certeza das regras de contagem aqui - incluímos opções, mas não o comando perl).

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

(contagem ajustada após comentário de adjudicação abaixo)

Tom Tanner
fonte
Will that work for empty input?
Titus
Now I fixed the transcription error (had "..", typed {,,} here...)
Tom Tanner
Your code is 35 bytes long. (34 +1 for the -l flag). :)
Paul Picard
Thanks. The -l is for prettification (as in a newline at the end of the output.). wasn't sure if that was necessary from the contest rules.
Tom Tanner
With 5.14+, you can do perl -pe'$_=eval"ABC=~y/$_//dr"' for only 23 bytes (22 + 1 for -p).
ThisSuitIsBlackNot
1

Common Lisp, 71 bytes

The largest entry at the moment, but at least it is readable ;-)

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

Japt, 13 12 bytes

"ABC"r"[{U}]

Saved a byte thanks to ETHproductions.

Try it online!

Tom
fonte
Nice, thanks for using Japt! You can remove the trailing quote to save a byte.
ETHproductions
1

Pyth, 4 bytes

-<G3

Try it here!

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

Note this uses lower case which might not be acceptable

Blue
fonte
1

C, 53 bytes

b=64;c(char*a){while(b<67)putchar(++b*!strchr(a,b));}

If implicit declarations of string.h are not allowed, 72 bytes, to add #include<string.h>

Try it online!


or something a bit more fun at 75 bytes

a[128]={};b=64;c(char*d){while(*d)++a[*d++];while(b<67)putchar(b*!a[++b]);}

Try it online!

Ahemone
fonte
52 bytes
ceilingcat
1

Batch, 101 bytes

@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

Takes input on STDIN, which means that %1 is empty when the code falls through into the helper subroutine and nothing gets printed.

Neil
fonte
1

R, 47 40 bytes

gsub(paste0("[",scan(,""),"]"),"","ABC")

Try it online!

Replaces any letters in the input string with the empty string.

BLT
fonte