Odd'em out:手紙


11

目的

ランダムサイズのマトリックス内の奇数文字を整理して返すプログラムまたは関数(または同等のもの)を作成します。

詳細

このようなランダムな次元の入力として(文字列として)マトリックスが渡されます。

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

あなたの仕事は、残りと一致しない文字(この場合、d2行目、6桁目)を見つけ、その文字を出力として返すことです。マトリックスは、文字で構成されますA-Za-z、改行(\n、行のみの両端に)及び5×5から10×10までの範囲の大きさ(25〜100文字)を有します。

標準の抜け穴が適用されます。これはコードゴルフチャレンジです。最小バイトのコードを持つエントリが優先されます。

入力

入力は、プログラムの場合は文字列として、または関数(または同様の)の場合は引数として標準入力を介して渡されます。

出力

行列の「奇数」である単一の文字 NonenilNUL、または文字列"None"なし「奇数」の文字が存在しない場合。

その他の例

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

回答: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

回答: q

ぷうuuuuuuuu
ううううううううう
ううううううううう
ううううううううう
ううううううううう
ううううううううう
ううううううううう
ううううううううう
ううううううううう
ううううううううう

回答: p

発生器

Pythonで作成されたランダムマトリックスジェネレーターは、プログラムのテストに使用できます。注:ミスをして、奇妙な文字を入力しない可能性がわずかにあります。


1
ここで JSにあなたのPythonコードの直訳です。
アーナルド

1
@juniorRubyistの「ボーナスの削除」は、「ボーナスの必須化」とは異なります。これまでオプションであった部分をチャレンジの要件に移動することにより、既存の回答の大部分を無効にしました。
マーティンエンダー

回答:



6

J12 10 7バイト

-.}./.~

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

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

10バイトバージョン

-._1 1{\:~

ヒス...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input

2
@ FrownyFrogこれは奇妙なキャラクターを見つけるための巧妙な方法です
ガレンイワノフ

私が好きなものを決定することはできません:この素敵なフックまたはあなたのドラゴンのジョーク
ジョナ

4

Brachylog8 4バイト

oḅ∋≠

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

説明

Brachylogを使用したことがないので、これは最適ではないかもしれません。

oḅ∋≠  Input is a string.
o     Sort the input.
 ḅ    Split it into blocks of equal elements.
  ∋   There is a block
   ≠  whose elements are all different.
      That block is the output.

∋≠after を使用して長さ1の結果を取得するのは非常に賢い方法です。Brachylogのヒントの質問に必ず投稿してください。
致命的

@Fatalizeありがとう、ヒントを追加しました。
ズガーブ

3

K(oK)7 6バイト

解決

*<#:'=

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

例:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

説明:

少し短いアプローチが見つかりました:右から左に評価:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

ノート:

私はこのチャレンジのボーナスの側面がドロップされることを期待していますが、この解決策は\n奇妙な文字がなければ改行文字を返します:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"

3

プロローグ(SWI)、46バイト

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

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

または、プロローグクエリからの標準の真の出力に問題がある場合:

プロローグ(SWI)、48バイト

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

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

説明

Find the first element X in the input  
that when removed, results in output  
that does not contain X

then depending on the version above either:  
print X as a character  
or  
return X as an atom

3

C(gcc)93 92 90 66 62バイト

関数としてはるかに短い

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

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

テストコード

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

古いバージョンはプログラムです

C 86バイト

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

奇数文字を出力するか、何も出力しません。このように実行します。

C:\eng\golf>python matrix_gen.py | a.exe
X
C:\eng\golf>python matrix_gen.py | a.exe
G
C:\eng\golf>python matrix_gen.py | a.exe
x
C:\eng\golf>python matrix_gen.py | a.exe

C:\eng\golf>python matrix_gen.py | a.exe
J

gets()\ n文字を削除して入力をサニタイズするので、テストドライバーに入れることが非常に公平であることはわかりません。これは、関数が元の入力で機能しないようにいくつかの作業を行っています。
マイケルドーガン

@MichaelDorgan TIOの入力だけでなく、Pythonスクリプトからのパイプ入力でも機能します。他の人は、チャレンジの精神に反して見えなかった入力を単にハードコーディングしました。
cleblanc

3

05AB1E 4  2バイト

Adnanのおかげで2バイト節約

.m

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

説明

.m   # push a list of the least frequent character(s) in input

入力が少なくとも5行の長さになることが保証されているので、改行を削除する必要がありますか?
シャギー

@シャギー:いいえ。それは2x2行列を処理することでした。私はその部分を逃し5x5ました。ありがとう!
エミグナ

nil「奇妙なもの」がない場合は、戻らなければなりませんか?
魔法のタコUr

@MagicOctopusUrnこの回答が投稿されたとき、その部分はオプションでした。私は...今、その変更の無効化ほとんどの答えを推測する
マーティン・エンダー


2

、2バイト

◄=

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

これは、入力として文字列を受け取り、文字を返す関数です。文字が等しいかどうかを比較するときに、入力文字列の最小値を使用します(つまり、他の文字の最小数に等しい文字を返します)。


2

C、94バイト

ポインターで戻る。存在しない場合、を返し\0ます。

これにより、メモリリークが発生します。想定intは4バイトです。

*t;f(c,p,i)char*c,*p;{t=calloc(64,8);for(*p=-1;*c;c++)t[*c]--;for(i=0;++i<128;)!~t[i]?*p=i:0;}

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



@Shaggy実際、私はそのルールを解釈する方法を知りません。一部の(他の)ユーザーはそのルールを明示的に知っているが、このような答えを投稿しているように見えます。
user202729

2
@ user202729、他の人がそれを行うからといって、それが正しいことを意味するわけではありません;)そのようなソリューションを見つけた場合は、それらを指摘するのが最善です。
シャギー

@Shaggyまあ、私はルールを明示的に指摘しましたが、そのユーザーは「ルールはこのルールが有効であると明示的に言っている」と言いました。何て言えばいいのかわかりません。| この場合、関数tは最初ではなく毎回呼び出す前に配列をゼロにする必要があります。
-user202729

@Shaggy Thanks、修正。
コレラSu


2

Bash15 20バイト

fold -1|sort|uniq -u

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

説明: fold s 11行あたりの文字への入力、sorts一致する文字のグループへの入力、およびuniqueである行のみを出力します。

@Nahuel Fouilleul、このアプローチで問題を見つけて解決するのを手伝ってくれてありがとう


奇数の文字が2番目または半人前である場合は機能しません
ナウエルフイユル

@NahuelFouilleul良いキャッチ...現時点ではそれを修正する方法がわかりませんが、修正案がなければ修正または削除します。
ジャスティンマリナー

それは単に修正することができます|sort|が、より良い解決策があるかもしれません
ナウエルフイユ

また、grepを使用した解決策を見つけましたが、それよりも長いですgrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
ナウエルフイユ

@NahuelFouilleul sort修正を行っています、ありがとう。ただし、必要に応じて、そのgrepの回答を自分のものとしていつでも投稿できます。
ジャスティンマリナー



1

Matlab、25バイト

a=input('');a(a~=mode(a))

入力「a」。「a」は「a」のモードではありません。奇数ボールのない空の配列を出力します。


1

Haskell、33 * 0.75 = 24.75バイト

f s=[c|[c]<-(`filter`s).(==)<$>s]

奇数文字がない場合、空のリストを返します。

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

cマトリックス内の各文字(文字列として与えられるs)について、長さが1の文字sと等しいすべての文字の文字列を作成しますc


1

JavaScript(ES6)、37バイト

null奇数文字がない場合に返します。

s=>s.match(`[^
${s.match(/(.)\1/)}]`)

テストケース


1

Japt、6バイト

入力を複数行の文字列として受け取り、単一の文字列を出力します。解決策がない場合は空の文字列を出力します。

k@èX É

それを試してみてください


説明

入力内の現在の要素()の出現をカウント()し、1()を減算kする関数(@)を通過したときに、真理値()を返す文字を削除します。èXÉ



1

ゼリー、4バイト

ċ@ÐṂ

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

\n奇数文字がない場合に(単一の改行)を返します。明らかに\n印刷可能なキャラクターではありません。

偶然にも、これはMr.Xcoder Pythonの答えとまったく同じアルゴリズムです。(私はそれを独自に思いついた)

説明:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

それが機能するのは、m×nマトリックス内で:

  • 奇妙な文字が存在する場合:ありm-1改行、1つの奇数文字とm×n-1通常の文字は、および1 < m-1 < m×n-1理由5 ≤ m, n ≤ 10
  • 奇妙な文字が存在しない場合:m-1改行とm×n通常の文字がありm-1 < m×nます。


1

C(gcc)91 86 82 79 71バイト

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

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

  • xorと?についてGastropnerに感謝します。トリック(-3バイト)
  • 比較バージョンを修正してバグを修正し、コメントからGastropnerマジックを使用しました

説明:

改行をスキップしながら、現在の文字と前の文字を比較します。異なる場合は、次の文字と比較してください。これは、現在の文字を返すか前の文字を返すかを示します。関数は、存在する場合は「奇数」文字値を返し、配列が奇数でない場合は0を返します。\0charの前には常に改行があるため、「次の」charチェックを回避します。奇数のcharがない場合、forループから\ 0を本質的に返します。


古い、よりセクシーなXORコード説明:

次の3つの文字列値の実行中のxorマスクを作成します。それらがすべて同じ場合、値は3つのいずれかに等しくなります。それらが異なる場合、2つの同一のものは互いにキャンセルし、一意のものを残します。

xorの前に/ nを因数分解する必要があります。そうしないと、混乱します。また、s [0]が奇数値の場合は、2文字の不等式をチェックする必要があります。これには余分な費用がかかります|| 小切手。

v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^‌​*s++||v^*s)break;}}

79にいくつかの調整。フォールスルーリターンは私のコンパイラと一致しないため、TIOでのみテストされましたv;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^*s++||v^*s)break;}}
。– gastropner

私が書いているがらくたのために、TIOは私が固執するものです。ありがとう!
マイケルドーガン

いくつかの式を整理すると、他のことができます-2 77のために:v;f(char*s){while(s[2]==10?s+=3:0,v=*s^s[1]^s[2],s[3])if(v^*s++||v^*s)break;} あなたは73のために、少しそれをいじる場合は、あなたの優勝馬が他の一つは、次のとおりです。v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
gastropner

ええ、でもXORはとてもセクシーに見えます。:)
マイケルドーガン

提案するs+=*++s-10?0:2代わりに*++s==10?s+=2:0
ceilingcat


0

アリス、16 * 75%= 12バイト

/-.nDo&
\i..*N@/

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

Jabberwocky重複する文字がない場合に出力します。

説明

/...@
\.../

これは、完全に順序(文字列処理モード)で動作する線形プログラムのフレームワークです。実際のコードはジグザグに実行され、次のように展開されます。

i..DN&-o

i   Read all input.
..  Make two copies.
D   Deduplicate one copy, giving only the two letters and a linefeed.
N   Multiset difference. Removes one copy of each letter and one linefeed.
    Therefore it drops the unique letter.
&-  Fold substring removal over this new string. This essentially removes
    all copies of the repeated letter and all linefeeds from the input,
    leaving only the unique letter.
.   Duplicate.
n   Logical NOT. Turns empty strings into "Jabberwocky" and everything else
    into an empty string.
*   Concatenate to the previous result.
o   Print the unique letter or "Jabberwocky".

の代わりに&-ey(空の文字列への音訳)も使用できます。または、スタック操作にもう1文字を費やすことで、入力を重複排除して、で不要な文字を削除することもできますNが、それでも同じバイトカウントです。

i.D.QXN.n*o@

アリス、13バイト

/N.-D@
\i&.o/

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

これはボーナスなしのソリューションで、単に欠落してい.n*ます。



0

APL + WIN、16バイト

(1=+/a∘.=a)/a←,⎕

画面入力を要求し、奇数文字が出力されるか、奇数文字がない場合は何も出力されません。


a/⍨1=+/a∘.=a←,⎕1バイト
Uriel

@Urielありがとう、私は演算子⍨が私の古いAPL + WINバージョン5で利用できないのではないかと思う:(
Graham

0

PowerShell、39バイト

([char[]]"$args"|group|sort c*)[0].Name

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

入力を(チャレンジで指定された)改行を含む文字列として受け取り、char-arrayに変換します。次にGroup-Object、キャラクターが名前によってグループ化され、その後、名前にsort基づいてグループ化されるようにしますc。これにより、孤独な文字が最初になることが保証されるため、[0]インデックスを取得してそのを出力し.Nameます。

改行が「nothing」に受け入れられる場合、これはボーナスの対象となります。


私はsort c*)[0]短くすることを望んでいましたが、思いついたのは同じバイト数でした? c* -eq 1)
ルート

の二重引用符を削除することで短縮できます$args。また、(改行ではなく)奇妙な文字がない場合に([char[]]$args|group|? c* -eq 1).Name正確に戻るため、より正確nullです。ただし、バイト単位では、これでも37未満にはなりません
。– cogumel0

@ cogumel0二重引用符なしでは実行されません。
ルート

あなたが正しい@ルート。しかし、要件の一つ渡す(マトリックスの「奇数」またはである単一の文字NonenilNUL、または文字列"None"なし「奇数」の文字が存在しない場合を。)それはまだ変更する必要があります。改行は許容可能な回答の一部ではありません。
cogumel0

@ cogumel0ああ、答えを投稿してからチャレンジが変わりました。「なし/なし/何でも」は以前は必須ではなく単なるボーナスでした。私は答えをそのままにしておきます。
AdmBorkBork

0

Perl 6の 27  24 -25%= 18バイト

*.comb.Bag.min(*.value).key

試して

{%(.comb.Bag.invert){1}}

試して

奇数の文字が入力されていない場合これは未定義の値返します。

拡張:

{  # bare block lambda with implicit parameter 「$_」

  %(        # coerce into a Hash

    .comb   # split the input into graphemes (implicit method call on 「$_」)
    .Bag    # turn into a weighted Set
    .invert # invert that (swap keys for values) returns a sequence

  ){ 1 }    # get the character that only occurs once
}


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.