So einfach wie das ABC


28

Eingang

Ein String, der höchstens eine von jedem des Buchstaben enthält A, Bund C. Sie können in beliebiger Reihenfolge sein. Die leere Zeichenfolge ist eine gültige Eingabe.

Hinweis: In einer früheren Version dieser Herausforderung wurden die Buchstaben LEJanstelle von verwendet, ABCund sie können weiterhin verwendet werden, wenn dies gewünscht wird.

Ausgabe

Eine Reihe von den A, B, CBuchstaben , die nicht in der Eingabe waren. Sie können in beliebiger Reihenfolge sein.

Wenn es sich bei der Ausgabe um eine leere Zeichenfolge handelt, ist es nur gültig, keine Ausgabe anzugeben, wenn dies für Ihre Implementierung sinnvoll ist. (Sie müssen beispielsweise keine printleere Zeichenfolge aufrufen .)

Beispiele

  • Wenn es sich bei der Eingabe um eine Eingabe handelt, sollte Bdie Ausgabe entweder "da" CAoder " ACda" sein Aund Cnicht in der Eingabe vorhanden sein.
  • Wenn die Eingabe eine leere Zeichenfolge ist, sollte die Ausgabe eine ABCbeliebige Permutation sein, da keiner der drei Buchstaben in der Eingabe vorhanden ist.
  • Wenn die Eingabe ist, sollte CABdie Ausgabe die leere Zeichenfolge sein, da alle drei Buchstaben in der Eingabe vorhanden sind.

Testfälle

Es gibt so wenige Eingabefälle, dass wir sie alle aufzählen können:

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

Alle gültigen Ausgaben für jede Eingabe werden durch |'s getrennt angegeben. ""steht für die leere Zeichenfolge

Wertung

Der kürzeste Code in Bytes gewinnt. Bedenken Sie jedoch, dass Sie möglicherweise mehr Anerkennung dafür erhalten, dass Sie die Herausforderung eher auf einzigartige als auf kurze Weise gelöst haben ;)



1
Die Aufgabe ist die Differenz zwischen einer Konstanten und einer Eingabe. Das Erfordernis, dass alles in Strings ausgeführt wird, ist im Hinblick auf die Schwierigkeit der eigentlichen Aufgabe umständlich.
Mego

2
Ich erinnere mich vage an ein genaueres Dup-Match, bei dem Sie die Eingabe von einer konstanten Menge subtrahieren mussten.
16.

1
Können Eingaben Buchstaben außerhalb von "ABC" enthalten? Die Angabe: "Eine Zeichenfolge, die höchstens einen der Buchstaben A, B und C enthält" schließt solche Eingaben nicht aus.
theonlygusti

1
@theonlygusti Die Eingabe sollte nur ABC enthalten
Calvins Hobbys

Antworten:



10

Gelee , 4 Bytes

Vielen Dank an @DuctrTape für den Artikel über die Änderung und das Vorhandensein von "ABC" in Jellys Wörterbuch.

“ḃ»ḟ

Probieren Sie es online!

“ḃ»schlägt den Eintrag "ABC" in Jellys Wörterbuch nach, ist die Filer-Discard-Dyade, die die in der Eingabe gefundenen Zeichen aus dieser Zeichenliste verwirft. Das Ergebnis wird implizit gedruckt.


Für eine Kleinbuchstabenversion kann der zu verwendende Wörterbucheintrag entweder "abac" ( “c») oder "abaca" ( “i») sein.


Wenn die Herausforderung "LEJ" war, konnten in der Großbuchstabenvariante nur 6 Bytes erreicht werden, da mit diesem Zeichensatz keine Wörterbucheinträge vorhanden sind, so dass wir die Liste der Zeichen “LEJ”(oder eine Permutation davon) erstellen müssen .

Die Kleinbuchstabenvariante lag aufgrund des Wortes "jell" ( ) besser bei 5 Bytes “ẎṄ».


1
Mir gefällt, wie der Großteil des Codes nur die Zeichenfolge "ABC" generiert und das eigentliche Programm selbst aus einem Zeichen besteht. Klassisches Gelee.
Sagiksp

6

Bash + Coreutils, 15 Bytes

tr -d x$1<<<LEJ

Probieren Sie es online!

Ich möchte das weglassen x, aber dann tr -dwürde ein Argument fehlen, wenn die Eingabezeichenfolge leer war. (Das xschadet nicht, da im LEJ der Here-Zeichenfolge keine X enthalten sind.) Normalerweise würde ich schreiben tr -d "$1", aber so wie ich es getan habe, ist es ein Byte kürzer.


Ich hatte die gleichen Gedanken - auch mit den Zitaten - sofort auch.
rexkogitans

6

Retina , 14 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

$
¶ABC
D`.
A1`

Probieren Sie es online!

Erläuterung

$
¶ABC

Fügen Sie eine zweite Zeile hinzu, die Folgendes enthält ABC.

D`.

Deduplizieren Sie die Zeichen. Dies löscht jedes Zeichen aus der zweiten Zeile, die bereits in der ersten Zeile erscheint.

A1`

Verwerfen Sie die erste Zeile.


Wie genau funktioniert der 1`Teil der Antigrep-Phase?
Kritixi Lithos

@KritixiLithos Die Zahlen in der Konfigurationszeichenfolge sind Grenzwerte. 1bedeutet im Allgemeinen "nur einmal X tun". Wie genau die Grenzwerte funktionieren (dh was X ist), hängt vom verwendeten Bühnentyp ab. Bei Antigrep-Stufen prüft Retina zunächst, welche Zeilen mit dem regulären Ausdruck übereinstimmen (hier jede Zeile, da der reguläre Ausdruck leer ist), dann bedeutet das Limit "nur die erste übereinstimmende Zeile verwerfen". In ähnlicher Weise würde es bedeuten, "nur die erste übereinstimmende Zeile zu behalten", wenn es eine Grep-Stufe wäre. Die Semantik aller Limits finden Sie im Wiki .
Martin Ender

6

05AB1E , 6 4 Bytes

2 Bytes mit dem neuen žRBefehl gespeichert, wie von Kevin Cruijssen vorgeschlagen

žRsм

Probieren Sie es online! oder als Test Suite

Erläuterung

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

Sollte eine Eingabe von nur nicht Jzurückkehren EL, LE?
Magic Octopus Urn

2
Nett! Genau wie ein FYI können auch Eingaben als dargestellt werden """{input}""", was auch für leere Strings funktioniert :).
Adnan

@carusocomputing: Es kann entweder zurückgeben (in diesem Fall wird zurückgegeben LE).
Emigna


1
@Emigna Tbh nein. Ich denke, es wurde vielleicht wegen dieser Herausforderung hinzugefügt, aber ich persönlich habe es vorher nicht benutzt.
Kevin Cruijssen

5

Java 7, 73 58 Bytes

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

Dank @KritixiLithos werden 15 Bytes eingespart .

Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

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
Können Sie "["+s+"]"anstelle von tun s.replaceAll("(.)","$1|")?
Kritixi Lithos

@KritixiLithos Smart. Es schlägt für den leeren String fehl, aber durch Hinzufügen eines Leerzeichens (oder eines anderen Zeichens, das nicht vorhanden ist EJL) funktioniert es wieder, was immer noch viel kürzer ist. :)
Kevin Cruijssen


5

Pyth, 5 Bytes

-"ABC

Teste es hier

Erweitert sich zu

-"ABC"Q
-       # Filter on absence
 "ABC"  # Literal string 
      Q # Input

abc kann geschrieben werden als<G3
Maltysen

@Maltysen ja Muddyfish verwendet, aber es ist trotzdem Kleinbuchstaben = \
Rod

4

MATL, 10 8 Bytes

Zwei Bytes gespart dank Suever. setdiffist kürzer als ismember.

'ABC'iX-

Probieren Sie es hier aus!

Erläuterung

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

Ja, dies mag eine triviale Aufgabe gewesen sein, aber ich bin sehr zufrieden, dass ich es geschafft habe, sie mit MATL ganz alleine zu lösen. Ich habe nie gesagt, dass es die kürzeste Lösung ist ... Danke, Suever!


4

JavaScript ES6, 41 39 38 Bytes

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

2 Bytes dank Arnauld gespeichert. Dank LarsW 1 Byte gespeichert.

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

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


Ich bin auf dem Handy, kann also meinen Code nicht testen, aber ich denke, das sollte funktionieren:s=>eval`'ABC'.replace(/[${s}]/g,'')`
LarsW

Gute Arbeit! In der Lage zu sagen , .join``erspart Ihnen zwei Zeichen über die Lösung , die ich mit hatte kommen: f=s=>"ABC".replace(RegExp(`[${s}]`,'g'),"").
nnnnnn

1
@LarsW Dieser genaue Code schien nicht zu funktionieren, aber das Hinzufügen von Klammern um die Vorlagenzeichenfolge hat ein Byte gespeichert. Vielen Dank!
Tom

3

V , 10 Bytes

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

Probieren Sie es online!

Hexdump:

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

Erläuterung

Die Eingabe erfolgt in der ersten Zeile des Puffers. Also so etwas wie:

EL

und der Cursor befindet sich auf dem ersten Zeichen. Also löschen wir den Eingang (der ihn im Register speichert ") und gehen gleichzeitig mit in den Einfügemodus C.

Sobald LEJich mich im Einfügemodus befinde, werden die Zeichen eingefügt. Danach kehre ich mit in den normalen Modus zurück <ESC>.

Jetzt müssen wir alle Zeichen entfernen, die in der Eingabe vorhanden sind.

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

Und sobald dies passiert ist, verbleiben die restlichen Buchstaben im Puffer.


3

Ruby, 27 19 18 Bytes

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

-1 Byte dank Martin Ender


3

Haskell , 27 26 Bytes

import Data.List
("ABC"\\)

Probieren Sie es online! Verbrauch: ("ABC"\\) "CB"Erträge "A".

\\ist der gesetzte Differenzoperator, die Klammern bilden einen sogenannten Abschnitt, der eine Kurzform für das Lamda ist(\x -> "ABC" \\ x) .


Ohne Import: (gleiche Byteanzahl dank @nimi)

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

Probieren Sie es online! Verbrauch: f "CB"Erträge"A" .


Andere Ansätze:

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

1
Ich hoffe, (\\)dass wir bald zu Prelude wechseln.
theonlygusti

@theonlygusti Ich hoffe, es wird nicht; Dies ist keine wirklich sinnvolle Operation für Listen (zumindest nicht, wenn Sie nicht ausdrücklich angeben, dass Sie die Liste als gesetzt haben möchten). Die Standardoperation für diese Aufgabe sollte lauten Data.Set.difference.
aufgehört, gegen den Uhrzeigersinn

@ceasedtoturncounterclockwis warum ist es nicht sinnvoll? Außerdem ist der einzige Grund, warum ich möchte, dass es verschoben wird, dass es häufig nützlich ist.
theonlygusti

1
@theonlygusti Es ist nicht sinnvoll, wenn Sie feststellen, dass Sie die falsche Datenstruktur verwenden. Listen können doppelte Elemente und eine Reihenfolge haben, und sie können träge aufgebaut sein (sogar unendlich). (\\)respektiert nichts davon. Datentypen, die für dieses Verhalten vorgesehen sind, weisen eine Struktur auf, die sie im Allgemeinen effizienter, sicherer (da keine möglichen Annahmen zu Stabilität usw. verletzt werden können) und komfortabler macht.
aufgehört, gegen den Uhrzeigersinn

@ceasedtoturncounterclockwis was, ja es tut. "Die erste Instanz von ...", aber nvm
theonlygusti

3

GNU sed , 34 29 Bytes

Beinhaltet +1 für -r

-5 dank Digital Trauma

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

Probieren Sie es online!

Aus irgendeinem Grund funktioniert TIO nicht mit Extended Regex ( -r), daher musste ich es in BASH packen.


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

Die Zeilenumbrüche -nund Psind unnötig. Sie können dies auch in bash packen, damit es in TIO funktioniert. Keine Ahnung warum -rnicht funktioniert. tio.run/nexus/bash#DcmxDYAwDATA/qdIR4JELCjp7F8jooIFCPubb@/…
Digitales Trauma

@DigitalTrauma Danke! Ich dachte, es würde Zeichen neben A, B und C geben, als ich das schrieb.
Riley

3

Brain-Flak , 120 + 3 = 123 Bytes

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

Es wird mit dem -cFlag ausgeführt und fügt 3 Bytes hinzu

Probieren Sie es online!

Erläuterung

Insgesamt setzt dieses Programm so ziemlich den rechten Stapel minus den linken Stapel, auf den der rechte Stapel initialisiert ist CBA und der linke Stapel auf die Eingabe initialisiert wird.

Kommentierter Code

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

Weitere Erklärung zu kommen ...


2

Mathematica, 37 Bytes

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

Gibt es einen Grund, warum Sie hier Zeichenfolgen anstelle von Zeichenlisten verwendet haben?
Greg Martin

@ GregMartin Gewohnheit, denke ich
Martin Ender

nur, dass ich denke, es kommt kürzer, wenn Sie vermeiden könnenCharacters
Greg Martin

2

Karotte , 15 Bytes, nicht konkurrierend

Nicht konkurrierend wegen eines Fehlers, den ich bei der Rückgabe von Übereinstimmungen und leeren Zeichenfolgen gefunden habe. Also habe ich es einfach behoben

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

Probieren Sie es online! (Kopieren Einfügen)

Erläuterung

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

Oktave, 29 27 Bytes

Dank Suever konnten zwei Bytes gespart werden, indem die Zeichenfolge 'ABC'innerhalb des ismemberAufrufs erstellt wurde.

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

Wir verwenden ~ismember()als logische Indizes für die Variable x. Die eigentümliche Sache ist, wir erschaffen im x='ABC' Inneren ismember , nicht davor. Die Reihenfolge Octave sieht so aus:

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

Wo iist die Eingabe:

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

Vollständige App in LINQPad getestet

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

Testergebnisse

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
Das ist keine gültige Antwort, es muss eine Funktion oder ein Programm sein, kein Code-Snippet.
theonlygusti

Ah. Mein Fehler. Erster Timer hier. Also brauche ich den Print-Teil?
Michael Coxon

@MichaelCoxon: Sie müssen entweder den Eintrag in ein gesamtes Programm vornehmen, das kompiliert (nicht in C # empfohlen, es hat viel Boilerplate), oder in eine Funktion, die mehrfach aufgerufen werden kann. im Moment ist es nur eine Aussage. In C # ist es fast immer am einfachsten, eine Funktion daraus zu machen, indem ein Lambda erstellt wird, das Eingaben über seine Argumente entgegennimmt und über seinen Rückgabewert zurückgibt.

string.Join("",...)-> string.Concat(...)Spart 1 Byte
Verkörperung der Ignoranz

1

APL, 7 Bytes

'ABC'∘~

~Ist die Subtraktion gesetzt, wird komponiert. Dies ist eine Funktion, die ABCminus der Zeichen in ihrer Eingabe zurückgibt .



1

Perl 5.9.9 79 38 37 35 Bytes

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

(Ich bin mir der Zählregeln hier nicht sicher - habe Schalter enthalten, aber nicht den Perl-Befehl).

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

(Angepasste Zählungen nach dem Kommentar unten)


Funktioniert das für leere Eingaben?
Titus

Jetzt habe ich den Transkriptionsfehler behoben (hatte "..", {,,} hier eingegeben ...)
Tom Tanner

Ihr Code ist 35 Byte lang. (34 +1 für die -lFlagge). :)
Paul Picard

Vielen Dank. Das -l dient der Prettifizierung (wie in einer neuen Zeile am Ende der Ausgabe). Ich war mir nicht sicher, ob das nach den Wettbewerbsregeln notwendig war.
Tom Tanner

Mit 5.14+ können Sie perl -pe'$_=eval"ABC=~y/$_//dr"'nur 23 Bytes (22 + 1 für -p) ausführen .
ThisSuitIsBlackNot

1

Common Lisp, 71 Bytes

Der derzeit größte Eintrag, aber zumindest lesbar ;-)

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


1

Pyth, 4 Bytes

-<G3

Probieren Sie es hier aus!

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

Beachten Sie, dass Kleinbuchstaben verwendet werden, die möglicherweise nicht akzeptiert werden



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

Übernimmt die Eingabe in STDIN, was bedeutet, dass sie %1leer ist, wenn der Code in die Hilfsunterroutine gelangt und nichts gedruckt wird.


1

R , 47 40 Bytes

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

Probieren Sie es online!

Ersetzt alle Buchstaben in der Eingabezeichenfolge durch die leere Zeichenfolge.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.