ABC만큼 쉬운


28

입력

대부분의 각 글자 중 하나가 들어있는 문자열 A, B등을 C. 그들은 어떤 순서로든있을 수 있습니다. 빈 문자열은 유효한 입력입니다.

참고 : 이 챌린지의 이전 버전은 문자 LEJ대신 문자 를 사용했으며 ABC원하는 경우 계속 사용할 수 있습니다.

산출

의 문자열 A, B, C입력에 존재하지 않는 문자. 그들은 어떤 순서로든있을 수 있습니다.

출력이 빈 문자열이면 출력에 아무런 영향을주지 않으면 구현에 적합합니다. (예를 들어 실제로 print빈 문자열을 호출 할 필요는 없습니다 .)

  • 입력이있는 경우 B그 출력은 하나이어야 CA하거나 AC사람 AC입력에 존재하지 않는다.
  • 입력이 빈 문자열 인 경우 입력 ABC에 3 개의 문자가 없으므로 출력은 또는 순열 이어야합니다 .
  • 입력이 입력 인 경우 CAB세 문자가 모두 입력 되므로 출력은 빈 문자열이어야합니다.

테스트 사례

입력 사례가 너무 적어서 모두 열거 할 수 있습니다.

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

각 입력에 대해 유효한 모든 출력이로 구분되어 제공됩니다 |. ""빈 문자열을 나타냅니다

채점

바이트 단위의 가장 짧은 코드가 이깁니다. 그러나 짧은 방법이 아닌 고유 한 방법으로 문제를 해결 한 것에 대해 더 많은 인정을받을 수 있습니다 .)



1
작업은 상수와 입력의 차이를 설정합니다. 실제 작업의 어려움과 관련하여 모든 작업을 문자열로 수행해야하는 것은 번거 롭습니다.
Mego

2
상수 세트에서 입력을 빼야하는 더 정확한 dupe 일치를 모호하게 기억합니다.
xnor

1
입력에 "ABC"이외의 문자가 포함될 수 있습니까? 사양 : "각 문자 A, B 및 C 중 하나 이상을 포함하는 문자열"에는 이러한 입력이 포함되지 않습니다.
theonlygusti

1
@theonlygusti 입력은 ABC 만 포함해야합니다
Calvin 's Hobbies

답변:



10

젤리 , 4 바이트

Jelly의 사전에서 "ABC"의 변화와 존재에 대한 자극에 대해 @DuctrTape에게 감사드립니다.

“ḃ»ḟ

온라인으로 사용해보십시오!

“ḃ»Jelly의 사전에서 "ABC"항목을 조회하고 해당 문자 목록의 입력에서 찾은 문자를 삭제하는 파일러 폐기 다이아 드입니다. 결과는 암시 적으로 인쇄됩니다.


소문자 버전의 경우 사용할 사전 항목은 "abac"( “c») 또는 " abaca"( ) 일 수 있습니다 “i».


챌린지가 "LEJ"인 경우, 대문자 변형에서 6 바이트 만 달성 될 수 있는데, 그 문자 세트에 사전 항목이 없기 때문에 문자 목록 “LEJ”(또는 그 순열) 을 작성할 수 있습니다 .

소문자 변형 은 단어 "jell"( ) 의 존재로 인해 5 바이트 에서 더 잘 나타납니다 “ẎṄ».


1
나는 대부분의 코드가 문자열 "ABC"를 생성하는 방법을 좋아하며 실제 프로그램 자체는 하나의 문자입니다. 클래식 젤리.
sagiksp 2012

6

배쉬 + coreutils, 15 바이트

tr -d x$1<<<LEJ

온라인으로 사용해보십시오!

나는를 생략하고 싶습니다 x,하지만 tr -d입력 문자열이 비어있을 때 인수 누락 될 것이다. ( x여기 문자열 LEJ에는 x가 없기 때문에 아무런 해를 끼치 지 않습니다.) 나는 일반적으로 씁니다 tr -d "$1". 그러나 내가 한 방식으로 수행하는 것은 그보다 1 바이트 짧습니다.


나는 따옴표조차도 같은 생각을 즉시했습니다.
rexkogitans 2012

6

레티 나 , 14 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

$
¶ABC
D`.
A1`

온라인으로 사용해보십시오!

설명

$
¶ABC

을 포함하는 두 번째 줄을 추가하십시오 ABC.

D`.

문자를 복제하십시오. 첫 번째 줄에 이미 나타나는 두 번째 줄에서 모든 문자를 삭제합니다.

A1`

첫 줄을 버리십시오.


1`안티 그립 단계 의 일부는 정확히 어떻게 작동합니까?
Kritixi Lithos

@KritixiLithos 구성 문자열의 숫자는 제한입니다. 1일반적으로 "X를 한 번만 수행"을 의미합니다. 작업을 정확히 제한하는 방법 (즉, X가 무엇인지)은 사용중인 스테이지 유형에 따라 다릅니다. 안티 그렙 단계의 경우, Retina는 먼저 정규식과 일치하는 행을 확인합니다 (여기서 정규식이 비어 있기 때문에 모든 행). 마찬가지로 grep 단계 인 경우 "첫 번째 일치하는 줄만 유지"를 의미합니다. 모든 제한의 의미 는 위키에 나열 되어 있습니다.
Martin Ender

6

05AB1E , 6 4 바이트

Kevin Cruijssen이žR 제안한 새 명령을 사용하여 2 바이트를 절약했습니다.

žRsм

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

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

입력 만 J반환 해서는 안 EL, LE됩니까?
Magic Octopus Urn

2
좋은! 참고로 입력은로 표현 될 수 있으며 """{input}"""빈 문자열에도 적용됩니다. :).
Adnan

@carusocomputing : 둘 중 하나를 반환 할 수 있습니다 (이 경우에는을 반환 LE).
Emigna


1
@Emigna Tbh 번호 아마도이 도전으로 인해 추가 된 것으로 생각하지만 개인적으로는 이전에 사용하지 않았습니다.
케빈 크루이 센

5

자바 7, 73 58 바이트

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

@KritixiLithos 덕분에 15 바이트가 절약 되었습니다 .

테스트 코드 :

여기에서 시도하십시오.

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

산출:

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
"["+s+"]"대신에 할 수 있습니까 s.replaceAll("(.)","$1|")?
Kritixi Lithos

@KritixiLithos Smart. 빈 문자열에 대해서는 실패하지만 공백 (또는 그렇지 않은 다른 문자)을 추가하면 EJL다시 작동하지만 여전히 훨씬 짧습니다. :)
Kevin Cruijssen



4

MATL, 10 8 바이트

Suever 덕분에 2 바이트를 절약했습니다. setdiff보다 짧습니다 ismember.

'ABC'iX-

여기 사용해보십시오!

설명

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

예, 이것은 사소한 작업 일 수도 있지만 MATL로 혼자서 해결할 수 있다고 매우 만족합니다. 나는 그것이 가장 짧은 해결책이라고 말한 적이 없다 ... 고마워 Suever!


4

자바 스크립트 ES6, 41 39 38 바이트

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

Arnauld 덕분에 2 바이트를 절약했습니다. LarsW 덕분에 1 바이트를 절약했습니다.

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

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


저는 모바일에 있으므로 코드를 테스트 할 수 없지만 작동합니다.s=>eval`'ABC'.replace(/[${s}]/g,'')`
LarsW

잘 하셨어요! 말할 .join``수 있으면 내가 생각해 낸 솔루션보다 두 글자를 절약 할 수 있습니다 f=s=>"ABC".replace(RegExp(`[${s}]`,'g'),"").
nnnnnn 2012

1
@LarsW 그 정확한 코드는 작동하지 않는 것 같지만 템플릿 문자열 주위에 대괄호를 추가하면 1 바이트가 절약되었습니다. 감사!
Tom

3

V , 10 바이트

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

온라인으로 사용해보십시오!

16 진 덤프 :

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

설명

입력은 버퍼의 첫 번째 라인에 있습니다. 그래서 같은 :

EL

커서는 첫 번째 문자에 있습니다. 따라서 우리는 입력을 (레지스터에 저장하는) 삭제하고를 "사용하여 삽입 모드로 동시에 들어갑니다 C.

삽입 모드에 들어가면 문자 LEJ가 삽입 된 후을 사용하여 일반 모드로 돌아갑니다 <ESC>.

이제 입력에있는 모든 문자를 제거해야합니다.

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

그리고 이런 일이 발생하면 버퍼에 남은 글자가 남습니다.


3

루비, 27 19 18 바이트

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

Martin Ender 덕분에 -1 바이트


3

하스켈 , 27 26 바이트

import Data.List
("ABC"\\)

온라인으로 사용해보십시오! 사용법 : ("ABC"\\) "CB"수확량 "A".

\\는 차분 연산자이며, 괄호 는 lamda의 짧은 형식 인 소위 섹션 입니다 (\x -> "ABC" \\ x).


가져 오기없이 : (@nimi 덕분에 동일한 바이트 수)

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

온라인으로 사용해보십시오! 사용법 : f "CB"수확량 "A".


다른 접근법 :

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

1
(\\)곧 Prelude로 옮겨 갈 수 있기를 바랍니다 .
theonlygusti

@theonlygusti 나는 그것이되지 않기를 바랍니다. 이것은 실제로 목록에 대한 합리적인 조작이 아닙니다 (적어도 세트별로 목록을 명시 적으로 명시하지 않는 한). 해당 작업의 기본 작업은입니다 Data.Set.difference.
반 시계 회전을 중지

왜 안 되겠 어? 게다가, 내가 원하는 유일한 이유는 유용하고 자주 있기 때문입니다.
theonlygusti

1
@theonlygusti 당신이 그것을 사용하면 자신이 아마 잘못된 데이터 구조를 사용하고 있다는 신호라는 의미에서 합리적인 것은 아닙니다. 리스트는 중복 된 요소, 순서를 가질 수 있으며 게으르게 구성 될 수 있습니다 (무한대까지). (\\)이 중 어느 것도 존중하지 않습니다. 되는 데이터 유형 구성 이 동작은 (어떤 가능한 안정성 등이 가정이 파괴되지 않을 수 있기 때문에) 안전, 그들 일반적으로 매우 조금 더 effecient하게 구조와 더 편안한 인터페이스를 노출 있습니다.
반 시계 회전을 중단

@ceasedtoturncounterclockwis 무엇을합니까? "첫 번째 인스턴스 ..."그러나 nvm
theonlygusti

3

GNU sed , 34 29 바이트

에 +1 포함 -r

Digital Trauma 덕분에 -5

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

온라인으로 사용해보십시오!

어떤 이유로 TIO는 확장 정규식 ( -r) 과 함께 작동하지 않으므로 BIO 로 래핑해야했습니다.


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

개행, -nP불필요하다. 또한 이것을 bash로 감싸서 TIO에서 작동하도록 할 수 있습니다. 왜 -r작동하지 않는지 모르겠습니다 . tio.run/nexus/bash#DcmxDYAwDATA/qdIR4JELCjp7F8jooIFCPubb@/…
디지털 외상

@DigitalTrauma 감사합니다! 나는 이것을 쓸 때 A, B 및 C 이외의 문자가있을 것이라고 생각했습니다.
라일리

3

Brain-Flak , 120 + 3 = 123 바이트

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

-c3 바이트를 추가 하여 플래그 와 함께 실행됩니다.

온라인으로 사용해보십시오!

설명

전반적 으로이 프로그램은 오른쪽 스택이 오른쪽 스택이 초기화되고 CBA왼쪽 스택이 입력으로 초기화 된 왼쪽 스택 에서 오른쪽 스택 세트를 뺀 것 입니다.

주석이 달린 코드

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

앞으로 더 설명 ...


2

수학, 37 바이트

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

문자 목록이 아닌 여기에 문자열을 사용한 이유가 있습니까?
Greg Martin

@ GregMartin 습관, 나는 추측한다
마틴 엔더

피할 수 있다면 더 짧게 나온다고 생각합니다Characters
Greg Martin

2

당근 , 15 바이트, 비경쟁

일치와 빈 문자열을 반환하는 버그로 인해 경쟁하지 않습니다. 방금 고 쳤어요

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

온라인으로 사용해보십시오! (복사 붙여 넣기)

설명

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

옥타브, 29 27 바이트

호출 'ABC'내에서 문자열을 작성하여 Suever 덕분에 2 바이트를 절약했습니다 ismember.

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

우리 ~ismember()는 변수에 대한 논리적 지표로 사용 합니다 x. 특이한 점은 우리 가 앞이 아니라 x='ABC' 내부 를 만듭니다 ismember. 옥타브 순서는 이것을 본다 :

@(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 바이트 32 바이트 47 바이트 35 바이트

i입력은 어디에 있습니까?

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

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

시험 결과

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
그것은 올바른 대답이 아니며 코드 스 니펫이 아닌 함수 또는 프로그램이어야합니다.
theonlygusti

아 내 잘못이야. 첫 번째 타이머입니다. 인쇄 부분이 필요합니까?
Michael Coxon

@MichaelCoxon : 컴파일하는 전체 프로그램 (C #에서는 권장하지 않지만 많은 상용구가 있음) 또는 여러 번 호출 할 수있는 함수로 항목을 작성해야합니다. 지금은 단지 진술 일뿐입니다. C #에서는 인수를 통해 입력을 받고 반환 값을 통해 반환되는 람다를 만들어 함수를 만드는 것이 가장 쉬운 방법입니다.

string.Join("",...)-> string.Concat(...)1 바이트 절약
무지의 구현

1

APL, 7 바이트

'ABC'∘~

~빼기를 설정하고 작성하므로 ABC입력의 문자를 뺀 값 을 반환하는 함수입니다 .



1

Perl 5.9.9 79 38 37 35 바이트

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

(여기서 계산 규칙을 ​​잘 모르는 경우-스위치는 포함하고 perl 명령은 포함하지 않았습니다).

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

(아래의 조정 의견 수에 따라 조정 된 수)


빈 입력에도 작동합니까?
Titus

지금은 (했다 "..", {,,} 입력 여기에 ...) 전사 오류를 수정
톰 태너에게

코드 길이는 35 바이트입니다. ( -l플래그의 경우 34 +1 ). :)
Paul Picard

감사. -l은 출력을위한 줄 바꿈과 같이 정화를위한 것입니다. 컨테스트 규칙에 필요한지 확실하지 않았습니다.
Tom Tanner

5.14+ 를 사용하면 perl -pe'$_=eval"ABC=~y/$_//dr"'23 바이트 (에 대해서는 22 + 1 -p) 만 수행 할 수 있습니다 .
ThisSuitIsBlackNot

1

공통 리스프, 71 바이트

현재 가장 큰 항목이지만 읽을 수는 있습니다 ;-)

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




1

배치, 101 바이트

@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

STDIN에서 입력을 %1받습니다. 즉 , 코드가 헬퍼 서브 루틴으로 빠져 나와 아무것도 인쇄되지 않을 때 비어 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.