Dễ như ABC


28

Đầu vào

Một chuỗi có chứa ít nhất một trong mỗi của các chữ cái A, BC. Họ có thể theo thứ tự bất kỳ. Chuỗi rỗng là đầu vào hợp lệ.

Lưu ý: Phiên bản trước của thử thách này đã sử dụng các chữ cái LEJthay vì ABCvà chúng vẫn có thể được sử dụng nếu muốn.

Đầu ra

Một chuỗi của A, B, Cchữ cái không có mặt ở đầu vào. Họ có thể theo thứ tự bất kỳ.

Nếu đầu ra sẽ là chuỗi rỗng thì đơn giản là không có đầu ra nào hợp lệ, nếu điều đó có ý nghĩa đối với việc triển khai của bạn. (ví dụ: bạn không cần phải thực sự gọi printvào một chuỗi trống.)

Ví dụ

  • Nếu đầu vào là Bsau đó đầu ra hoặc là nên CAhay ACtừ ACkhông có mặt trong các đầu vào.
  • Nếu đầu vào là chuỗi rỗng thì đầu ra phải ABChoặc bất kỳ hoán vị nào vì không có ba chữ cái nào xuất hiện trong đầu vào.
  • Nếu đầu vào là CABđầu ra phải là chuỗi trống vì cả ba chữ cái đều có trong đầu vào.

Các trường hợp thử nghiệm

Có rất ít trường hợp đầu vào mà chúng ta có thể liệt kê tất cả chúng:

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

Tất cả các đầu ra hợp lệ cho mỗi đầu vào được đưa ra, cách nhau bởi |. ""đại diện cho chuỗi trống

Chấm điểm

Mã ngắn nhất tính bằng byte thắng. Nhưng hãy nhớ rằng bạn có thể được công nhận nhiều hơn để giải quyết thử thách theo cách độc đáo hơn là theo cách ngắn;)



1
Tác vụ được đặt chênh lệch giữa hằng số và đầu vào. Yêu cầu tất cả mọi thứ được thực hiện trong chuỗi là cồng kềnh liên quan đến độ khó của nhiệm vụ thực tế.
Mego

2
Tôi mơ hồ nhớ một trận đấu dupe chính xác hơn, nơi bạn phải trừ đi đầu vào từ một bộ không đổi.
xnor

1
Đầu vào có thể chứa các chữ cái bên ngoài "ABC" không? Đặc tả: "Một chuỗi chứa nhiều nhất một trong các chữ cái A, B và C" không loại trừ các đầu vào như vậy.
theonlygusti

1
@theonlygusti Đầu vào chỉ nên chứa ABC
Sở thích của Calvin

Câu trả lời:


20

Python 3, 29 27 22 byte

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

-2 byte nhờ Jonathan Allan

-5 byte nhờ Rod


print(*{*"LEJ"}-{*input()})tiết kiệm 2. (thử nghiệm trên 3.5 và 3.6).
Jonathan Allan


14
Tôi yêu con trăn
theonlygusti

@theonlygusti Bất cứ điều gì đã xảy ra với <3 và ♥?
wizzwizz4

@theonlygusti: Tôi sẽ thích trăn nếu tôi có thể thay thế lamda bằng 𝛌
Fahim Parkar

10

Thạch , 4 byte

Cảm ơn @DuctrTape cho prod về sự thay đổi và sự hiện diện của "ABC" trong từ điển của Jelly.

“ḃ»ḟ

Hãy thử trực tuyến!

“ḃ»tra cứu mục "ABC" trong từ điển của Jelly, là trình quay phim loại bỏ dyad loại bỏ các ký tự được tìm thấy trong đầu vào từ danh sách các ký tự đó. Kết quả được in ngầm.


Đối với phiên bản chữ thường, mục từ điển cần sử dụng có thể là "abac" ( “c») hoặc "abaca" ( “i»).


Khi thử thách là "LEJ" chỉ có thể đạt được 6 byte trong biến thể chữ hoa, vì không có mục từ điển nào tồn tại với bộ ký tự đó, khiến chúng ta tạo danh sách các ký tự “LEJ”(hoặc hoán vị của chúng).

Biến thể chữ thường công bằng tốt hơn ở mức 5 byte do sự hiện diện của từ "jell" ( “ẎṄ»).


1
Tôi thích cách hầu hết các mã chỉ tạo ra chuỗi "ABC" và bản thân chương trình thực tế là một ký tự. Thạch cổ điển.
sagiksp

6

Bash + coreutils, 15 byte

tr -d x$1<<<LEJ

Hãy thử trực tuyến!

Tôi muốn bỏ qua x, nhưng sau đó tr -dsẽ thiếu một đối số khi chuỗi đầu vào trống. (Điều xnày không gây hại gì cả, vì không có bất kỳ x nào trong chuỗi LEJ ở đây.) Tôi thường viết tr -d "$1", nhưng thực hiện theo cách tôi đã làm ngắn hơn một byte.


Tôi đã có cùng suy nghĩ - ngay cả với các trích dẫn - ngay lập tức, quá.
rexkogitans

6

Võng mạc , 14 byte

Số lượng byte giả định mã hóa ISO 8859-1.

$
¶ABC
D`.
A1`

Hãy thử trực tuyến!

Giải trình

$
¶ABC

Nối một dòng thứ hai chứa ABC.

D`.

Nhân đôi các nhân vật. Thao tác này sẽ xóa mọi ký tự khỏi dòng thứ hai đã xuất hiện trong dòng đầu tiên.

A1`

Hủy dòng đầu tiên.


Làm thế nào chính xác 1`một phần của giai đoạn antigrep hoạt động?
Kritixi Lithos

@KritixiLithos Số trong chuỗi cấu hình là giới hạn. 1thường có nghĩa là "chỉ làm X một lần". Làm thế nào chính xác giới hạn hoạt động (tức là X là gì) phụ thuộc vào loại giai đoạn bạn đang sử dụng. Đối với các giai đoạn antigrep, trước tiên Retina kiểm tra các dòng nào khớp với regex (ở đây, mọi dòng, vì regex trống), nhưng sau đó giới hạn có nghĩa là "chỉ loại bỏ dòng khớp đầu tiên". Tương tự, nếu đó là giai đoạn grep, điều đó có nghĩa là "chỉ giữ dòng khớp đầu tiên". Các ngữ nghĩa của tất cả các giới hạn được liệt kê trên wiki .
Martin Ender

6

05AB1E , 6 4 byte

Đã lưu 2 byte bằng žRlệnh mới theo đề xuất của Kevin Cruijssen

žRsм

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

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

Không nên đầu vào chỉ Jtrở lại EL, LE?
Bạch tuộc ma thuật Urn

2
Tốt đẹp! Giống như một FYI, các đầu vào cũng có thể được biểu diễn dưới dạng """{input}""", cũng hoạt động cho các chuỗi rỗng :).
Ad Nam

@carusocomputing: Nó có thể trả về một trong hai (trong trường hợp này nó trả về LE).
Emigna


1
@Emigna Tbh không. Tôi nghĩ rằng nó đã được thêm vào vì thử thách này có lẽ, nhưng cá nhân tôi chưa từng sử dụng nó trước đây.
Kevin Cruijssen

5

Java 7, 73 58 byte

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

15 byte được lưu nhờ @KritixiLithos .

Mã kiểm tra:

Hãy thử nó ở đây.

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

Đầu ra:

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
Bạn có thể làm "["+s+"]"thay vì s.replaceAll("(.)","$1|")?
Kritixi Lithos

@KritixiLithos Thông minh. Nó không thành công cho Chuỗi trống, nhưng bằng cách thêm một khoảng trắng (hoặc bất kỳ ký tự nào khác không có EJL), nó sẽ hoạt động trở lại, nó vẫn ngắn hơn rất nhiều. :)
Kevin Cruijssen


5

Bình thường, 5 byte

-"ABC

Kiểm tra nó ở đây

Mở rộng để

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

abc có thể được viết như sau<G3
Maltysen

@Maltysen yeah bùn đã sử dụng cái đó, nhưng dù sao nó cũng là chữ thường = \
Rod

4

MATL, 10 8 byte

Đã lưu hai byte nhờ Suever. setdiffngắn hơn ismember.

'ABC'iX-

Hãy thử nó ở đây!

Giải trình

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

Vâng, đây có thể là một nhiệm vụ tầm thường, nhưng tôi khá hài lòng, tôi đã tự mình giải quyết nó bằng MATL. Tôi chưa bao giờ nói đó là giải pháp ngắn nhất ... Cảm ơn Suever!


4

JavaScript ES6, 41 39 38 byte

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

Đã lưu 2 byte nhờ Arnauld. Đã lưu 1 byte nhờ LarsW.

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

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


Tôi đang sử dụng điện thoại di động, vì vậy tôi không thể kiểm tra mã của mình, nhưng điều này sẽ hoạt động tôi nghĩ:s=>eval`'ABC'.replace(/[${s}]/g,'')`
LarsW

Công việc tốt đẹp! Có thể nói .join``giúp bạn tiết kiệm hai nhân vật qua giải pháp tôi đã đưa ra : f=s=>"ABC".replace(RegExp(`[${s}]`,'g'),"").
nnnnnn

1
@LarsW Mã chính xác đó dường như không hoạt động, nhưng việc thêm dấu ngoặc quanh chuỗi mẫu đã làm và lưu một byte. Cảm ơn!
Tom

3

V , 10 byte

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

Hãy thử trực tuyến!

Hexdump:

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

Giải trình

Đầu vào là trên dòng đầu tiên của bộ đệm. Vì vậy, một cái gì đó như:

EL

và con trỏ ở ký tự đầu tiên. Vì vậy, chúng tôi xóa đầu vào (lưu trữ nó trong đăng ký ") và nhập chế độ chèn đồng thời bằng cách sử dụng C.

Khi ở chế độ chèn, các ký tự LEJđược chèn, sau đó tôi trở lại chế độ bình thường bằng cách sử dụng <ESC>.

Bây giờ chúng ta phải loại bỏ tất cả các ký tự có trong đầu vào.

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

Và một khi điều này xảy ra, chúng ta còn lại các chữ cái còn lại trong bộ đệm.


3

Ruby, 27 19 18 byte

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

-1 byte nhờ Martin Ender


3

Haskell , 27 26 byte

import Data.List
("ABC"\\)

Hãy thử trực tuyến! Công dụng: ("ABC"\\) "CB"sản lượng "A".

\\là toán tử khác biệt được thiết lập, dấu ngoặc đơn tạo thành một phần được gọi là phần ngắn của lamda (\x -> "ABC" \\ x).


Không nhập: (cùng số byte nhờ @nimi)

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

Hãy thử trực tuyến! Công dụng: f "CB"sản lượng "A".


Các cách tiếp cận khác:

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

1
Tôi hy vọng (\\)sẽ được chuyển đến Prelude sớm.
theonlygusti

@theonlygusti Tôi hy vọng nó sẽ không; đây thực sự không phải là một hoạt động hợp lý cho các danh sách (ít nhất là không trừ khi bạn tuyên bố rõ ràng bạn muốn liệt kê theo thiết lập). Các hoạt động mặc định cho nhiệm vụ đó nên được Data.Set.difference.
đã ngừng quay ngược chiều

@ceasetoturnc gặpclockwis tại sao nó không hợp lý? Bên cạnh đó, lý do duy nhất tôi mong muốn nó di chuyển là vì nó hữu ích, thường xuyên.
theonlygusti

1
@theonlygusti không hợp lý theo nghĩa là nếu bạn thấy mình sử dụng nó, đó là một dấu hiệu cho thấy bạn có thể đang sử dụng cấu trúc dữ liệu sai. Danh sách có thể có các yếu tố trùng lặp, một trật tự và chúng có thể được xây dựng một cách lười biếng (thậm chí là vô hạn). (\\)không tôn trọng điều này Các kiểu dữ liệu dành cho hành vi này có cấu trúc khiến chúng nhìn chung khá hiệu quả, an toàn hơn (vì không thể ổn định, v.v. các giả định có thể bị phá vỡ) và để lộ giao diện thoải mái hơn.
đã ngừng quay ngược chiều

@ceasetoturncountclockwis cái gì, đúng vậy. "Bản án đầu tiên của ..." nhưng nvm
theonlygusti

3

GNU sed , 34 29 byte

Bao gồm +1 cho -r

-5 nhờ Chấn thương kỹ thuật số

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

Hãy thử trực tuyến!

Vì một số lý do, TIO không hoạt động với regex ( -r) mở rộng , vì vậy tôi phải gói nó trong 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

Các dòng mới, -nPkhông cần thiết. Ngoài ra, bạn có thể gói nó trong bash để làm cho nó hoạt động trong TIO. Không biết tại sao -rnó không hoạt động. tio.run/nexus/bash#DcmxDYAwDATA/qdIR4JELCjp7F8jooIFCPubb@/...
Digital Chấn thương

@DigitalTrauma Cảm ơn! Tôi đã nghĩ rằng sẽ có các nhân vật ngoài A, B và C khi tôi viết bài này.
Riley

3

Brain-Flak , 120 + 3 = 123 byte

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

Nó được chạy với -ccờ, thêm 3 byte

Hãy thử trực tuyến!

Giải trình

Nhìn chung, chương trình này thực hiện khá nhiều ngăn xếp bên phải trừ đi ngăn xếp bên trái với ngăn xếp bên phải được khởi tạo CBAvà ngăn xếp bên trái được khởi tạo cho đầu vào.

Mã chú thích

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

Thêm lời giải thích sắp tới ...


2

Toán học, 37 byte

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

Có một lý do bạn sử dụng chuỗi ở đây hơn là danh sách các ký tự?
Greg Martin

@GregMartin thói quen, tôi đoán
Martin Ender

chỉ là tôi nghĩ rằng nó sẽ xuất hiện ngắn hơn nếu bạn có thể tránhCharacters
Greg Martin

2

Cà rốt , 15 byte, không cạnh tranh

không cạnh tranh vì một lỗi tôi tìm thấy với các kết quả trùng khớp và chuỗi trống. Vì vậy, tôi chỉ sửa nó

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

Hãy thử trực tuyến!(sao chép dán)

Giải trình

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

Tháng mười, 29 27 byte

Đã lưu hai byte nhờ Suever, bằng cách tạo chuỗi 'ABC', bên trong ismembercuộc gọi.

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

Chúng tôi sử dụng ~ismember()như các chỉ số logic cho biến x. Điều đặc biệt là, chúng tôi tạo ra x='ABC' bên trong ismember , không phải ở phía trước của nó. Đơn hàng Octave thấy điều này:

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

nơi ilà đầu vào:

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

Ứng dụng đầy đủ được thử nghiệm trong 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));
}

Kết quả kiểm tra

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
Đó không phải là một câu trả lời hợp lệ, nó phải là một chức năng hoặc một chương trình, không phải là một đoạn mã.
theonlygusti

À. Lỗi của tôi. Hẹn giờ đầu tiên ở đây. Vì vậy, tôi cần phần in trong đó?
Michael Coxon

@MichaelCoxon: Bạn cần phải thực hiện mục nhập vào toàn bộ chương trình, nó biên dịch (không được đề xuất trong C #, nó có rất nhiều bản tóm tắt) hoặc vào một chức năng có thể được gọi nhiều lần; tại thời điểm này nó chỉ là một tuyên bố. Trong C #, hầu như luôn dễ dàng nhất để biến nó thành một hàm bằng cách tạo lambda, lấy đầu vào thông qua các đối số của nó và trả về thông qua giá trị trả về của nó.

string.Join("",...)-> string.Concat(...)Lưu 1 byte
Hiện thân của sự thiếu hiểu biết

1

APL, 7 byte

'ABC'∘~

~được đặt trừ, được soạn thảo, vì vậy đây là hàm trả về ABCtrừ các ký tự trong đầu vào của nó.



1

Perl 5.9.9 79 38 37 35 byte

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

(không chắc chắn về các quy tắc đếm ở đây - đã bao gồm các công tắc nhưng không bao gồm lệnh perl).

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

(số lượng điều chỉnh sau khi bình luận xét xử dưới đây)


Điều đó sẽ làm việc cho đầu vào trống?
Tít

Bây giờ tôi đã sửa lỗi sao chép (đã "..", gõ {,,} ở đây ...)
Tom Tanner

Mã của bạn dài 35 byte. (34 +1 cho -lcờ). :)
Paul Picard

Cảm ơn. -L là để hoàn thiện (như trong một dòng mới ở cuối đầu ra.). không chắc chắn nếu điều đó là cần thiết từ các quy tắc của cuộc thi.
Tom Tanner

Với 5.14+ , bạn có thể làmperl -pe'$_=eval"ABC=~y/$_//dr"' với 23 byte (22 + 1 cho -p).
ThisSuitIsBlackNot

1

Lisp thông thường, 71 byte

Mục lớn nhất tại thời điểm này, nhưng ít nhất nó có thể đọc được ;-)

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




1

Mẻ, 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

Đưa đầu vào vào STDIN, có nghĩa %1là trống khi mã rơi vào chương trình con của trình trợ giúp và không có gì được in.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.