Facile come ABC


28

Ingresso

Una stringa che contiene al massimo una di ciascuna delle lettere A, Be C. Possono essere in qualsiasi ordine. La stringa vuota è un input valido.

Nota: una versione precedente di questa sfida utilizzava le lettere LEJanziché ABCe, se lo si desidera, possono comunque essere utilizzate.

Produzione

Una stringa di A, B, Clettere che non erano presenti nell'input. Possono essere in qualsiasi ordine.

Se l'output sarebbe la stringa vuota, allora semplicemente dare nessun output è valido, se questo ha senso per la tua implementazione. (ad es. non è necessario chiamare effettivamente printuna stringa vuota.)

Esempi

  • Se l'input è Ballora l'output dovrebbe essere CAo ACpoiché Ae Cnon è presente nell'input.
  • Se l'input è la stringa vuota, allora dovrebbe essere l'output ABCo qualsiasi permutazione poiché nessuna delle tre lettere è presente nell'input.
  • Se l'input è CABallora l'output dovrebbe essere la stringa vuota perché tutte e tre le lettere sono presenti nell'input.

Casi test

Ci sono così pochi casi di input che possiamo elencarli tutti:

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

Vengono forniti tutti gli output validi per ciascun input, separati da |'s. ""rappresenta la stringa vuota

punteggio

Vince il codice più breve in byte. Ma tieni presente che potresti ottenere più riconoscimenti per risolvere la sfida in un modo unico piuttosto che in un modo breve;)



1
L'attività imposta la differenza tra una costante e un input. Richiedere che tutto sia fatto nelle stringhe è ingombrante per quanto riguarda la difficoltà del compito effettivo.
Mego,

2
Ricordo vagamente un match dupe più esatto in cui dovevi sottrarre l'input da un set costante.
xnor

1
Gli input possono contenere lettere al di fuori di "ABC"? La specifica: "Una stringa che contiene al massimo una delle lettere A, B e C" non esclude tali input.
theonlygusti,

1
@theonlygusti L'ingresso dovrebbe contenere solo ABC
Calvin's Hobbies,

Risposte:



10

Gelatina , 4 byte

Grazie a @DuctrTape per l'informazione sul cambiamento e la presenza di "ABC" nel dizionario di Jelly.

“ḃ»ḟ

Provalo online!

“ḃ»cerca la voce "ABC" nel dizionario di Jelly, è il filer scartare la diade che scarta i caratteri trovati nell'input da quell'elenco di caratteri. Il risultato viene stampato implicitamente.


Per una versione in minuscolo la voce del dizionario da utilizzare può essere "abac" ( “c») o "abaca" ( “i»).


Quando la sfida era "LEJ", nella variante maiuscola potevano essere raggiunti solo 6 byte, poiché non esiste alcuna voce del dizionario con quel set di caratteri, lasciandoci a creare la lista di caratteri “LEJ”(o una sua permutazione).

La variante minuscola è migliorata a 5 byte a causa della presenza della parola "gelatina" ( “ẎṄ»).


1
Mi piace come la maggior parte del codice generi solo la stringa "ABC", e il programma stesso stesso è un carattere. Gelatina classica
sagiksp,

6

Bash + coreutils, 15 byte

tr -d x$1<<<LEJ

Provalo online!

Vorrei omettere il x, ma poi mi tr -dmancherebbe un argomento quando la stringa di input era vuota. ( xNon fa alcun danno, dal momento che non ci sono x nella LEJ qui-stringa.) Normalmente scrivo tr -d "$1", ma farlo nel modo che ho fatto è un byte più corto di quello.


Ho avuto gli stessi pensieri, anche con le virgolette, immediatamente.
rexkogitans,

6

Retina , 14 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

$
¶ABC
D`.
A1`

Provalo online!

Spiegazione

$
¶ABC

Aggiungi una seconda riga contenente ABC.

D`.

Deduplica i personaggi. Questo elimina tutti i caratteri dalla seconda riga che appare già nella prima riga.

A1`

Elimina la prima riga.


Come funziona esattamente la 1`parte dello stadio antigrep?
Kritixi Lithos,

@KritixiLithos I numeri nella stringa di configurazione sono limiti. 1generalmente significa "esegui X una volta sola". Come funzionano esattamente i limiti (ovvero cos'è X) dipende dal tipo di palco che stai utilizzando. Per gli stadi antigrep, Retina controlla innanzitutto quali linee corrispondono alla regex (qui, ogni riga, poiché la regex è vuota), ma il limite significa "scarta solo la prima linea corrispondente". Allo stesso modo, se fosse uno stadio grep, significherebbe "mantenere solo la prima riga corrispondente". La semantica di tutti i limiti è elencata sul wiki .
Martin Ender,

6

05AB1E , 6 4 byte

Salvato 2 byte usando il nuovo žRcomando come suggerito da Kevin Cruijssen

žRsм

Provalo online! o come una suite di test

Spiegazione

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

Un input di solo Jritorno non dovrebbe EL, LE?
Magic Octopus Urn,

2
Bello! Proprio come una FYI, gli input possono anche essere rappresentati come """{input}""", che funziona anche per stringhe vuote :).
Adnan,

@carusocomputing: può restituire uno dei due (in questo caso restituisce LE).
Emigna,


1
@Emigna Tbh no. Penso che sia stato aggiunto a causa di questa sfida forse, ma personalmente non l'ho mai usato prima.
Kevin Cruijssen,

5

Java 7, 73 58 byte

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

15 byte salvati grazie a @KritixiLithos .

Codice di prova:

Provalo qui.

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

Produzione:

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
Puoi fare "["+s+"]"invece di s.replaceAll("(.)","$1|")?
Kritixi Lithos,

@KritixiLithos Smart. Non riesce per la stringa vuota, ma aggiungendo uno spazio (o qualsiasi altro carattere che non lo è EJL) funziona di nuovo, che è ancora molto più breve. :)
Kevin Cruijssen,



4

MATL, 10 8 byte

Due byte salvati grazie a Suever. setdiffè più corto di ismember.

'ABC'iX-

Provalo qui!

Spiegazione

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

Sì, questo potrebbe essere stato un compito banale, ma sono abbastanza soddisfatto di essere riuscito a risolverlo con MATL da solo. Non ho mai detto che fosse la soluzione più breve ... Grazie Suever!


4

JavaScript ES6, 41 39 38 byte

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

Salvato 2 byte grazie ad Arnauld. Salvato 1 byte grazie a LarsW.

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

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


Sono su cellulare, quindi non riesco a testare il mio codice, ma questo dovrebbe funzionare penso:s=>eval`'ABC'.replace(/[${s}]/g,'')`
LarsW

Bel lavoro! Essere in grado di dire che .join``si salva due caratteri oltre la soluzione che avevo messo a punto: f=s=>"ABC".replace(RegExp(`[${s}]`,'g'),"").
nnnnnn,

1
@LarsW Quel codice esatto non sembrava funzionare, ma l'aggiunta di parentesi attorno alla stringa del modello ha consentito di salvare un byte. Grazie!
Tom,

3

V , 10 byte

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

Provalo online!

hexdump:

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

Spiegazione

L'input è sulla prima riga del buffer. Quindi qualcosa del tipo:

EL

e il cursore si trova sul primo carattere. Quindi eliminiamo l'input (che lo memorizza nel registro ") e accediamo contemporaneamente alla modalità insert C.

Una volta in modalità inserimento, i caratteri LEJvengono inseriti, dopodiché torno alla modalità normale usando <ESC>.

Ora dobbiamo rimuovere tutti i caratteri presenti nell'input.

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

E una volta che ciò accade, ci rimangono le lettere rimanenti nel buffer.


3

Rubino, 27 19 18 byte

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

-1 byte grazie a Martin Ender


3

Haskell , 27 26 byte

import Data.List
("ABC"\\)

Provalo online! Utilizzo: ("ABC"\\) "CB"rese "A".

\\è l'operatore differenza impostata, la parentesi forma una cosiddetta sezione che è una forma abbreviata per il lamda (\x -> "ABC" \\ x).


Senza importazione: (stesso conteggio dei byte grazie a @nimi)

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

Provalo online! Utilizzo: f "CB"rese "A".


Altri approcci:

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

1
Spero (\\)che presto venga trasferito a Prelude.
theonlygusti,

@theonlygusti Spero di no; questa non è un'operazione sensata per gli elenchi (almeno non a meno che non si dichiari esplicitamente di voler un elenco come set). L'operazione predefinita per tale attività dovrebbe essere Data.Set.difference.
cessò di girare in senso antiorario il

@ceasedtoturncounterclockwis perché non è sensato? Inoltre, l'unica ragione per cui desidero che si sia mossa è perché è utile, spesso.
theonlygusti,

1
@theonlygusti non è sensato nel senso che se ti ritrovi a usarlo, è un segno che probabilmente stai usando una struttura di dati sbagliata. Gli elenchi possono avere elementi duplicati, un ordine e possono essere pigramente costruiti (anche infiniti). (\\)non rispetta nulla di tutto ciò. I tipi di dati destinati a questo comportamento hanno una struttura che li rende generalmente un po 'più efficienti, più sicuri (perché non è possibile infrangere ipotesi sulla stabilità ecc.) Ed esponendo un'interfaccia più comoda.
cessò di girare in senso antiorario il

@ceasedtoturncounterclockwis cosa, sì, lo fa. "Il primo caso di ..." ma nvm
theonlygusti,

3

GNU sed , 34 29 byte

Include +1 per -r

-5 grazie a Digital Trauma

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

Provalo online!

Per qualche motivo TIO non funziona con regex esteso ( -r), quindi ho dovuto inserirlo in 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

Il newline -ne Pnon sono necessari. Inoltre puoi concludere questo in bash per farlo funzionare in TIO. Non -rho idea del perché non funzioni. tio.run/nexus/bash#DcmxDYAwDATA/qdIR4JELCjp7F8jooIFCPubb@/…
Digital Trauma

@DigitalTrauma Grazie! Stavo pensando che ci sarebbero stati personaggi oltre a A, B e C quando ho scritto questo.
Riley,

3

Brain-Flak , 120 + 3 = 123 byte

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

Viene eseguito con il -cflag, aggiungendo 3 byte

Provalo online!

Spiegazione

Nel complesso questo programma fa praticamente lo stack di destra meno lo stack di sinistra con lo stack di destra inizializzato su CBAe lo stack di sinistra inizializzato sull'input.

Codice annotato

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

Altre spiegazioni a venire ...


2

Mathematica, 37 byte

Complement@@Characters@{"ABC",#}<>""&

C'è un motivo per cui hai usato le stringhe qui piuttosto che gli elenchi di caratteri?
Greg Martin,

Abit di @GregMartin, immagino
Martin Ender,

solo che penso che se ne possa evitare di menoCharacters
Greg Martin,

2

Carota , 15 byte, non competitiva

non competitiva a causa di un bug che ho trovato con le partite di ritorno e le stringhe vuote. Quindi l'ho appena risolto

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

Provalo online! (copia incolla)

Spiegazione

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

Ottava, 29 27 byte

Salvato due byte grazie a Suever, creando la stringa 'ABC', all'interno della ismemberchiamata.

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

Usiamo ~ismember()come indici logici per la variabile x. La cosa peculiare è che creiamo x='ABC' dentro ismember , non di fronte. L'ordine Octave vede questo:

@(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 byte 32 byte 47 byte 35 byte

dov'è il'input:

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

App completa testata in 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));
}

Risultati del test

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
Questa non è una risposta valida, deve essere una funzione o un programma, non uno snippet di codice.
theonlygusti,

Ah. Colpa mia. Primo timer qui. Quindi ho bisogno della parte stampata?
Michael Coxon,

@MichaelCoxon: O è necessario effettuare l'entrata in un intero programma, che viene compilato (non consigliato in C #, ha un sacco di boilerplate) o in una funzione che può essere chiamata più volte; al momento è solo un'affermazione. In C #, è quasi sempre più semplice trasformarlo in una funzione creando un lambda, che accetta input tramite i suoi argomenti e restituisce tramite il suo valore di ritorno.

string.Join("",...)-> string.Concat(...)Salva 1 byte
Incarnazione dell'ignoranza il

1

APL, 7 byte

'ABC'∘~

~viene impostata la sottrazione, è composta, quindi questa è una funzione che restituisce ABCmeno i caratteri nel suo input.


1

Medusa , 9 byte

PNI
 "ABC

Provalo online!

In notazione più convenzionale, questo programma si traduce in:

P(N("ABC", I))

Iè l'input, Nè la differenza dell'elenco e Pviene emesso.


1

Perl 5,9,9 79 38 37 35 byte

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

(non sono sicuro delle regole di conteggio qui - hanno incluso gli switch ma non il comando perl).

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

(conteggi corretti dopo il commento di aggiudicazione di seguito)


Funzionerà con input vuoti?
Tito

Ora ho corretto l'errore di trascrizione (aveva "..", digitato {,,} qui ...)
Tom Tanner

Il tuo codice è lungo 35 byte. (34 +1 per la -lbandiera). :)
Paul Picard,

Grazie. -L è per la prettificazione (come in una nuova riga alla fine dell'output). non ero sicuro che fosse necessario dalle regole del concorso.
Tom Tanner,

Con 5.14+ , puoi farlo perl -pe'$_=eval"ABC=~y/$_//dr"'per soli 23 byte (22 + 1 per -p).
ThisSuitIsBlackNon

1

Lisp comune, 71 byte

La voce più grande al momento, ma almeno è leggibile ;-)

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

1

Japt , 13 12 byte

"ABC"r"[{U}]

Salvataggio di un byte grazie a ETHproductions.

Provalo online!


Bene, grazie per aver usato Japt! È possibile rimuovere la virgoletta finale per salvare un byte.
ETHproductions

1

Pyth, 4 byte

-<G3

Provalo qui!

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

Nota che utilizza lettere minuscole che potrebbero non essere accettabili


1

C, 53 byte

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

Se non sono consentite dichiarazioni implicite di string.h, 72 byte , da aggiungere#include<string.h>

Provalo online!


o qualcosa di un po 'più divertente a 75 byte

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

Provalo online!



1

Lotto, 101 byte

@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

Accetta input su STDIN, il che significa che %1è vuoto quando il codice rientra nella subroutine helper e non viene stampato nulla.


1

R , 47 40 byte

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

Provalo online!

Sostituisce qualsiasi lettera nella stringa di input con la stringa vuota.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.