Semudah ABC


28

Memasukkan

Sebuah string yang berisi paling banyak satu dari masing-masing huruf A, Bdan C. Mereka mungkin dalam urutan apa pun. String kosong adalah input yang valid.

Catatan: Versi sebelumnya dari tantangan ini menggunakan huruf dan LEJbukan ABCdan mereka masih dapat digunakan jika diinginkan.

Keluaran

Sebuah string dari A, B, Churuf yang tidak hadir dalam input. Mereka mungkin dalam urutan apa pun.

Jika output akan menjadi string kosong maka tidak memberikan output valid, jika itu masuk akal untuk implementasi Anda. (mis. Anda tidak perlu benar-benar memanggil printstring kosong.)

Contohnya

  • Jika inputnya Bmaka output harus CAatau ACkarena Adan Ctidak ada dalam input.
  • Jika input adalah string kosong maka output harus ABCatau permutasi karena tidak ada dari ketiga huruf yang ada dalam input.
  • Jika inputnya CABmaka output harus berupa string kosong karena ketiga huruf ada dalam input.

Uji Kasus

Ada begitu sedikit kasus masukan yang dapat kami sebutkan semuanya:

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

Semua output yang valid untuk setiap input diberikan, dipisahkan oleh |'s. ""mewakili string kosong

Mencetak gol

Kode terpendek dalam byte menang. Namun perlu diingat bahwa Anda mungkin mendapatkan lebih banyak pengakuan untuk menyelesaikan tantangan dengan cara yang unik daripada dengan cara yang singkat;)



1
Tugas ini mengatur perbedaan antara konstanta dan input. Meminta agar segala sesuatunya dilakukan dalam string itu rumit sehubungan dengan kesulitan tugas yang sebenarnya.
Mego

2
Samar-samar saya ingat pertandingan dupe yang lebih tepat di mana Anda harus mengurangi input dari set konstan.
xnor

1
Bisakah input berisi huruf di luar "ABC"? Spesifikasi: "String yang berisi paling banyak satu dari masing-masing huruf A, B, dan C" tidak mengecualikan input tersebut.
theonlygusti

1
@theonlygusti Input hanya boleh berisi ABC
Hobi Calvin

Jawaban:


20

Python 3, 29 27 22 byte

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

-2 byte terima kasih kepada Jonathan Allan

-5 byte terima kasih kepada Rod


print(*{*"LEJ"}-{*input()})menghemat 2. (diuji pada 3.5 dan 3.6).
Jonathan Allan


14
Saya suka python ❤️
theonlygusti

@theonlygusti Apa yang terjadi pada <3 dan ♥?
wizzwizz4

@theonlygusti: Saya akan sangat suka python jika saya dapat mengganti lamda dengan 𝛌
Fahim Parkar

10

Jelly , 4 byte

Terima kasih kepada @DuctrTape untuk dorongan tentang perubahan dan kehadiran "ABC" dalam kamus Jelly.

“ḃ»ḟ

Cobalah online!

“ḃ»mencari entri "ABC" dalam kamus Jelly, adalah angka dua membuang filer yang membuang karakter yang ditemukan dalam input dari daftar karakter. Hasilnya dicetak secara implisit.


Untuk versi huruf kecil, entri kamus yang digunakan dapat berupa "abac" ( “c») atau "abaca" ( “i»).


Ketika tantangannya adalah "LEJ" hanya 6 byte yang dapat dicapai dalam varian huruf besar, karena tidak ada entri kamus dengan set karakter tersebut, meninggalkan kami untuk membuat daftar karakter “LEJ”(atau permutasi daripadanya).

Varian huruf kecil lebih baik pada 5 byte karena kehadiran kata "jell" ( “ẎṄ»).


1
Saya suka bagaimana sebagian besar kode hanya menghasilkan string "ABC", dan program yang sebenarnya itu sendiri adalah satu karakter. Jeli klasik.
sagiksp

6

Bash + coreutils, 15 byte

tr -d x$1<<<LEJ

Cobalah online!

Saya ingin menghilangkan x, tetapi kemudian tr -dakan kehilangan argumen ketika string input kosong. (Tidak xada salahnya, karena tidak ada x di sini-string LEJ.) Saya biasanya menulis tr -d "$1", tetapi melakukannya dengan cara yang saya lakukan adalah satu byte lebih pendek dari itu.


Saya memiliki pikiran yang sama - bahkan dengan tanda kutip - segera juga.
rexkogitans

6

Retina , 14 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

$
¶ABC
D`.
A1`

Cobalah online!

Penjelasan

$
¶ABC

Tambahkan baris kedua yang berisi ABC.

D`.

Gandakan karakter. Ini menghapus setiap karakter dari baris kedua yang sudah muncul di baris pertama.

A1`

Buang baris pertama.


Bagaimana tepatnya cara 1`kerja tahap antigrep?
Kritixi Lithos

@KritixiLithos Angka dalam string konfigurasi adalah batas. 1umumnya berarti "hanya lakukan X sekali". Bagaimana tepatnya membatasi kerja (yaitu apa X) tergantung pada jenis tahap yang Anda gunakan. Untuk tahap antigrep, Retina terlebih dahulu memeriksa garis mana yang cocok dengan regex (di sini, setiap baris, karena regex kosong), tetapi kemudian batasnya berarti "hanya membuang garis yang cocok pertama". Demikian pula, jika itu adalah tahap grep itu berarti "hanya menjaga baris yang cocok pertama". Semantik semua batas tercantum di wiki .
Martin Ender

6

05AB1E , 6 4 byte

Disimpan 2 byte menggunakan žRperintah baru seperti yang disarankan oleh Kevin Cruijssen

žRsм

Cobalah online! atau sebagai Test Suite

Penjelasan

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

Bukankah seharusnya input hanya Jkembali EL, LE?
Magic Octopus Urn

2
Bagus! Sama seperti FYI, input juga dapat direpresentasikan sebagai """{input}""", yang juga berfungsi untuk string kosong :).
Adnan

@carusocomputing: Ia dapat kembali (dalam hal ini kembali LE).
Emigna


1
@Emigna Tbh no. Saya pikir itu ditambahkan karena tantangan ini mungkin, tetapi saya pribadi belum menggunakannya sebelumnya.
Kevin Cruijssen

5

Java 7, 73 58 byte

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

15 byte disimpan berkat @KritixiLithos .

Kode uji:

Coba di sini.

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

Keluaran:

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
Dapat Anda lakukan "["+s+"]"bukan s.replaceAll("(.)","$1|")?
Kritixi Lithos

@KritixiLithos Smart. Gagal untuk String kosong, tetapi dengan menambahkan spasi (atau karakter lain yang tidak EJL) berfungsi lagi, yang masih jauh lebih pendek. :)
Kevin Cruijssen


5

Pyth, 5 byte

-"ABC

Uji di sini

Perluas ke

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

abc dapat ditulis sebagai<G3
Maltysen

@Maltysen ya muddyfish menggunakan itu, tetapi itu adalah huruf kecil pula = \
Rod

4

MATL, 10 8 byte

Disimpan dua byte berkat Suever. setdifflebih pendek dari ismember.

'ABC'iX-

Coba di sini!

Penjelasan

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

Ya, ini mungkin tugas yang sepele, tapi saya cukup puas saya berhasil menyelesaikannya dengan MATL sendirian. Saya tidak pernah mengatakan itu adalah solusi terpendek ... Terima kasih Suever!


4

JavaScript ES6, 41 39 38 Bytes

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

Disimpan 2 byte berkat Arnauld. Disimpan 1 byte berkat LarsW.

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

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


Saya menggunakan ponsel, jadi saya tidak dapat menguji kode saya, tetapi saya pikir ini akan berhasil:s=>eval`'ABC'.replace(/[${s}]/g,'')`
LarsW

Kerja bagus! Bisa mengatakan .join``menghemat dua karakter atas solusi saya datang dengan: f=s=>"ABC".replace(RegExp(`[${s}]`,'g'),"").
nnnnnn

1
@ LarsW Itu kode yang tepat tampaknya tidak berfungsi, tetapi menambahkan tanda kurung di sekitar string template berhasil dan menyimpan satu byte. Terima kasih!
Tom

3

V , 10 byte

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

Cobalah online!

Hexdump:

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

Penjelasan

Input ada di baris pertama buffer. Jadi sesuatu seperti:

EL

dan kursor berada pada karakter pertama. Jadi kami menghapus input (yang menyimpannya dalam register ") dan masuk ke mode insert secara bersamaanC .

Setelah dalam mode penyisipan, karakter LEJ dimasukkan, setelah itu saya kembali ke mode normal menggunakan <ESC>.

Sekarang kita harus menghapus semua karakter yang ada di input.

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

Dan begitu ini terjadi, kita akan tinggal dengan huruf-huruf yang tersisa di buffer.


3

Ruby, 27 19 18 byte

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

-1 byte terima kasih kepada Martin Ender


3

Haskell , 27 26 byte

import Data.List
("ABC"\\)

Cobalah online! Penggunaan: ("ABC"\\) "CB"hasil "A".

\\adalah operator perbedaan set, tanda kurung membentuk bagian yang disebut yang merupakan bentuk pendek untuk lamda (\x -> "ABC" \\ x).


Tanpa impor: (jumlah byte yang sama berkat @nimi)

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

Cobalah online! Penggunaan: f "CB"hasil "A".


Pendekatan lain:

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

1
Saya harap (\\)akan segera dipindahkan ke Prelude.
theonlygusti

@theonlygusti Saya harap tidak; ini sebenarnya bukan operasi yang masuk akal untuk daftar (setidaknya tidak kecuali Anda secara eksplisit menyatakan Anda ingin daftar-sebagai-set). Operasi default untuk tugas itu seharusnya Data.Set.difference.
Berhenti menghidupkan counterclockwis

@ceasedtoturncounterclockwis mengapa itu tidak masuk akal? Selain itu, satu-satunya alasan saya ingin pindah adalah karena berguna, sering.
theonlygusti

1
@ theonlygusti itu tidak masuk akal dalam arti bahwa jika Anda menemukan diri Anda menggunakannya, itu pertanda bahwa Anda mungkin menggunakan struktur data yang salah. Daftar dapat memiliki elemen duplikat, pesanan, dan mereka dapat dibangun dengan malas (bahkan tak terbatas). (\\)menghormati semua ini. Tipe data yang dimaksudkan untuk perilaku ini memiliki struktur yang membuat mereka secara umum sedikit lebih efisien, lebih aman (karena tidak ada stabilitas, dll. Asumsi dapat dipatahkan) dan memperlihatkan antarmuka yang lebih nyaman.
Berhenti menghidupkan counterclockwis

@ceasedtoturncounterclockwhat apa, ya itu. "Contoh pertama dari ..." tetapi nvm
theonlygusti

3

GNU sed , 34 29 byte

Termasuk +1 untuk -r

Terima kasih untuk Trauma Digital

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

Cobalah online!

Untuk beberapa alasan TIO tidak bekerja dengan regex diperpanjang ( -r), jadi saya harus membungkusnya dalam 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

Baris baru, -ndan Ptidak perlu. Anda juga dapat membungkusnya dengan bash untuk membuatnya bekerja di TIO. Tidak tahu mengapa -rtidak berhasil. tio.run/nexus/bash#DcmxDYAwDATA/qdIR4JELCjp7F8jooIFCPubb@/…
Digital Trauma

@DigitalTrauma Thanks! I was thinking there would be characters besides A, B, and C when I wrote this.
Riley

3

Brain-Flak, 120 + 3 = 123 bytes

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

It is run with the -c flag, adding 3 bytes

Try it online!

Explanation

Overall this program pretty much does the right stack set minus the left stack with the right stack initialized to CBA and the left stack initialized to the input.

Annotated Code

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

More explanation to come...


2

Mathematica, 37 bytes

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

Is there a reason you used strings here rather than lists of characters?
Greg Martin

@GregMartin habit, I guess
Martin Ender

just that I think it comes out shorter if you can avoid Characters
Greg Martin

2

Carrot, 15 bytes, non-competing

non-competing because of a bug I found with returning matches and empty strings. So I just fixed it

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

Try it online! (copy & paste)

Explanation

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

Octave, 29 27 bytes

Saved two bytes thanks to Suever, by creating the string 'ABC', inside the ismember call.

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

We use ~ismember() as logical indices to the variable x. The peculiar thing is, we create x='ABC' inside ismember, not in front of it. The order Octave sees this:

@(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

where i is the input:

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

Full app tested 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));
}

Test results

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
That's not a valid answer, it has to be a function or a program, not a code snippet.
theonlygusti

Ah. My bad. First timer here. So i need the print part in it?
Michael Coxon

@MichaelCoxon: You either need to make the entry into an entire program, which compiles (not recommended in C#, it has a lot of boilerplate), or into a function that can be called multiple times; at the moment it's just a statement. In C#, it's nearly always easiest to make it into a function by creating a lambda, that takes input via its arguments, and returns via its return value.

string.Join("",...) -> string.Concat(...) Saves 1 byte
Embodiment of Ignorance

1

APL, 7 bytes

'ABC'∘~

~ is set subtraction, is compose, so this is a function that returns ABC minus the characters in its input.



1

Perl 5.9.9 79 38 37 35 bytes

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

(not sure of the counting rules here - have included switches but not the perl command).

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

(adjusted counts after adjudication comment below)


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


1

Pyth, 4 bytes

-<G3

Try it here!

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

Note this uses lower case which might not be acceptable


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!



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.


1

R, 47 40 bytes

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

Try it online!

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.