ABCのように簡単


28

入力

文字のそれぞれの最も1に含まれている文字列ABC。それらの順序は任意です。空の文字列は有効な入力です。

注:このチャレンジの以前のバージョンでは、LEJ代わりに文字ABCが使用されていましたが、必要に応じて引き続き使用できます。

出力

文字列ABC入力には存在していなかった手紙。それらの順序は任意です。

出力が空の文字列である場合、それが実装にとって意味がある場合、単に出力を与えないことは有効です。(たとえば、実際にprint空の文字列を呼び出す必要はありません。)

  • 入力された場合B、出力のいずれかでなければならないCA、またはAC以降AC入力には存在しません。
  • 入力が空の文字列である場合、入力にはABC3文字が存在しないため、出力は任意の順列である必要があります。
  • 入力がCAB3つの文字すべてが入力に存在するため、入力がその場合、出力は空の文字列になります。

テストケース

入力ケースが非常に少ないため、すべてを列挙できます。

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
タスクは定数と入力の差を設定します。すべてを文字列で行うことを要求することは、実際のタスクの難易度に関して面倒です。
メゴ

2
定数セットから入力を減算する必要があった、より正確なだまされたマッチを漠然と覚えています。
xnor

1
入力に「ABC」以外の文字を含めることはできますか?「A、B、Cの各文字を最大1つ含む文字列」という仕様では、このような入力は除外されません。
theonlygusti

1
@theonlygusti入力にはABCのみを含める必要があります
カルビンの趣味

回答:


20

Pythonの3、29の 27 22バイト

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

-ジョナサンアランのおかげで2バイト

Rodのおかげで-5バイト


print(*{*"LEJ"}-{*input()})2を節約します(3.5および3.6でテスト済み)。
ジョナサンアラン


14
私はpython❤️が大好き
theonlygusti

@theonlygusti <3と♥に何が起こったのですか?
wizzwizz4

@theonlygusti:私は、ラムダを置き換えることができれば、私は、Pythonを大好きだλ
Fahimパーカー

10

ゼリー、4バイト

Jellyの辞書にある「ABC」の変更と存在に関する問題を解決してくれた@DuctrTapeに感謝します。

“ḃ»ḟ

オンラインでお試しください!

“ḃ»Jellyのディクショナリでエントリ「ABC」を検索します。これは、その文字リストから入力で見つかった文字を破棄するファイラ破棄ダイアッドです。結果は暗黙的に出力されます。


小文字バージョンの場合、使用する辞書エントリは「abac」(“c»)または「abaca」()のいずれかです“i»


チャレンジが「LEJ」であった場合、大文字のバリアントでは6バイトしか達成できませんでした。これは、その文字セットの辞書エントリが存在せず、文字のリスト“LEJ”(またはその順列)を作成できるためです。

小文字のバリアントは、単語「jell」()の存在により、5バイトでより適切にフェアリングしました“ẎṄ»


1
ほとんどのコードが文字列「ABC」を生成するだけで、実際のプログラム自体は1文字です。古典的なゼリー。
sagiksp

6

Bash + coreutils、15バイト

tr -d x$1<<<LEJ

オンラインでお試しください!

私は省略したいのですxが、その後、tr -d入力文字列が空だったときの引数が欠落することでしょう。(xここの文字列LEJにはxがないので、害はありません。)通常は書き込みますがtr -d "$1"、それを行う方法は、それより1バイト短くなります。


私も同じことを考えていました-引用があっても-すぐに。
rexkogitans

6

網膜、14バイト

バイトカウントはISO 8859-1エンコードを前提としています。

$
¶ABC
D`.
A1`

オンラインでお試しください!

説明

$
¶ABC

を含む2行目を追加しABCます。

D`.

文字を重複排除します。これにより、最初の行にすでに表示されている2番目の行からすべての文字が削除されます。

A1`

最初の行を破棄します。


1`antigrepステージの一部はどのように機能しますか?
KritixiのLithos

@KritixiLithos構成文字列の数字は制限です。1通常、「Xを1回だけ実行する」という意味です。正確に制限が機能する方法(Xが何であるか)は、使用しているステージのタイプによって異なります。Antigrepステージの場合、Retinaは最初にどの行が正規表現に一致するか(ここでは、正規表現が空なのですべての行)をチェックしますが、制限は「最初に一致する行のみを破棄する」ことを意味します。同様に、grepステージの場合、「最初に一致した行のみを保持する」ことを意味します。すべての制限のセマンティクスはwikiにリストされています
マーティンエンダー

6

05AB1E6 4バイト

Kevin CruijssenがžR提案した新しいコマンドを使用して2バイトを保存しました

žRsм

オンラインでお試しください! またはテストスイートとして

説明

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

入力のみのJ戻り値ではありEL, LEませんか?
魔法のタコUr

2
いいね!参考までに、入力はとして表すこともでき"""{input}"""ます。これは空の文字列でも機能します:)。
アドナン

@carusocomputing:どちらかを返すことができます(この場合はを返しますLE)。
エミグナ


1
@Emigna Tbhいいえ。おそらくこの挑戦​​のために追加されたと思いますが、私は個人的にそれを使用したことがありません。
ケビンクルーッセン

5

Java 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|")か?
クリティキシリソス

@KritixiLithosスマート。空の文字列に対しては失敗しますが、スペース(またはそうでない他の文字)を追加するEJLことで再び機能しますが、それでもかなり短くなります。:)
ケビンクルーイッセン



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で解決できたことに非常に満足しています。私はそれが最短の解決策だとは言いませんでした...ありがとう


4

JavaScript 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``ば、私が思いついた解決策よりも2人のキャラクターを節約できますf=s=>"ABC".replace(RegExp(`[${s}]`,'g'),"")
nnnnnn

1
@LarsWその正確なコードは機能しなかったようですが、テンプレート文字列の周りに括弧を追加すると、1バイト節約できました。ありがとう!
トム

3

V、10バイト

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

オンラインでお試しください!

Hexdump:

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,""}

マーティン・エンダーのおかげで-1バイト


3

Haskell27 26バイト

import Data.List
("ABC"\\)

オンラインでお試しください!使用法:("ABC"\\) "CB"yields "A"

\\は差集合演算子であり、括弧はlamdaの短縮形であるいわゆるセクションを形成し(\x -> "ABC" \\ x)ます。


インポートなし:(@nimiのおかげで同じバイトカウント)

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

オンラインでお試しください!使用法:f "CB"yields "A"


その他のアプローチ:

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

1
(\\)すぐにプレリュードに移されることを願っています。
theonlygusti

@theonlygustiしないことを願っています。これは、実際にはリストの賢明な操作はありません(少なくとも、リストとして設定することを明示的に指定しない限り)。そのタスクのデフォルトの操作はである必要がありますData.Set.difference
反時計回りに

@ceasedtoturncounterclockwisなぜ賢明ではないのですか?それに、私がそれを動かしたい唯一の理由は、頻繁に役立つからです。
theonlygusti

1
@theonlygustiそれを使用していることに気付いた場合、おそらく間違ったデータ構造を使用しているという兆候であるという意味では賢明ではありません。リストには、重複した要素、順序を含めることができ、遅延的に構築することもできます(無限であっても)。(\\)これはどれも尊重しません。この動作を目的とするデータ型は、一般的にかなり効率的で安全な構造を持ち(安定性などの仮定が破られないため)、より快適なインターフェイスを公開します。
反時計回りを回すのをやめた

@ceasedtoturncounterclockwis何、そうです。「...の最初のインスタンス」がnvm
theonlygusti

3

GNU sed34 29バイト

+1を含む -r

-5 Digital Traumaに感謝

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

オンラインでお試しください!

何らかの理由でTIOは拡張正規表現(-r)で動作しないため、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

改行、-nおよびP不要です。また、これをbashでラップしてTIOで機能させることもできます。なぜ-r機能しないのかわかりません。tio.run/nexus/bash#DcmxDYAwDATA/qdIR4JELCjp7F8jooIFCPubb@/...
デジタルトラウマ

@DigitalTraumaありがとう!これを書いたとき、A、B、C以外のキャラクターがあると思っていました。
ライリー

3

Brain-Flak、120 + 3 = 123バイト

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

-cフラグ付きで実行され、3バイトが追加されます

オンラインでお試しください!

説明

全体として、このプログラムは、右スタックセットから左スタックを引いたもので、右スタックは初期化さCBAれ、左スタックは入力に初期化されます。

注釈付きコード

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

さらなる説明...



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バイト

Sueverのおかげで'ABC'ismember呼び出し内に文字列を作成することで2バイトを節約しました。

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

あ。私の悪い。最初のタイマーはこちら。だから私はそれに印刷部分が必要ですか?
マイケルコクソン

@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

(以下の判定コメント後の調整済みカウント)


空の入力でも機能しますか?
タイタス

今私は(持っていた「..」、{,,}型付けここに...)転写エラーを修正
トム・タナーに

コードの長さは35バイトです。(-lフラグの場合は34 +1 )。:)
ポールピカード

ありがとう。-lは、プリティフィケーション用です(出力の最後の改行のように)。コンテストのルールからそれが必要かどうかはわかりませんでした。
トム・タナー

5.14+では、perl -pe'$_=eval"ABC=~y/$_//dr"'わずか23バイト(22の場合は1 + 1 -p)しかできません。
ThisSuitIsBlackNot

1

Common Lisp、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.