最高の発生回数または最低の発生回数


13

チャレンジ:

入力:

  • 印刷可能なASCIIを含む文字列(スペース、タブ、改行を除く)
  • ブール値

出力:

文字列の部分は4つのグループに分けられます。

  • 小文字
  • 大文字
  • その他

ブール値に基づいて、これらの4つのグループの1つ(または複数)の最高オカレンスを出力するか、他のすべてをスペースで置き換えて最低オカレンスを出力します。

例えば:

入力:"Just_A_Test!"
含まれるもの:
-大文字3文字:JAT
-小文字6文字:ustest
-0桁
-その他3 文字:__!

これらは、trueまたはの出力になりますfalse

true:   " ust    est "

// digits have the lowest occurrence (none), so everything is replaced with a space
false:  "            "

(注:末尾のスペースを無視することが許可されているため、出力はそれぞれに" ust est"なり""ます。)

チャレンジルール:

  • 入力が空になっていないか、スペースを含む、および範囲のみで印刷可能なASCIIで構成されますん33-126'!''~'
  • 必要に応じて、入力や出力を文字配列またはリストとして使用できます。
  • ブール値には、2つの一貫した異なる値を使用できます:true/ false; 1/ 0; 'H'/ 'L'; "highest"/ "lowest"; など。これらの個別の値はブール値として(多少)使用する必要があることに注意してください。したがって、2つの完全なプログラムを入力することはできません。1つは正しい結果を提供し、もう1つtruefalse、そして、あなたの実際のコードは唯一ことなります<run input with parameter>関連する新しいデフォルトの抜け穴を追加しましたが、定義に関して多くの微調整を使用できます。
  • 2つ以上のグループのオカレンスが同じ場合、それらすべてのオカレンスを出力します。
  • 必要な末尾のスペースはオプションで、単一の末尾の改行もオプションです。必要な先行スペースは必須です。また、他の先行スペースまたは改行は許可されません。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿することを妨げないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターを持つ関数/メソッド、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

Inputs:                              Output:

"Just_A_Test!", true                 " ust    est "     (or " ust    est")
"Just_A_Test!", false                "            "     (or "")
"Aa1!Bb2@Cc3#Dd4$", either           "Aa1!Bb2@Cc3#Dd4$"
"H@$h!n9_!$_fun?", true              " @$ !  _!$_   ?"
"H@$h!n9_!$_fun?", false             "H     9        "  (or "H     9")
"A", true                            "A"
"A", false                           " "                (or "")
"H.ngm.n", true                      "  ngm n"
"H.ngm.n", false                     "       "          (or "")
"H.ngm4n", false                     "H.   4 "          (or "H.   4")

most / fewestを個別のエントリとして出力することは許容されますか?たとえば、「ハッシュが楽しい」テストケースでは"H "、?の" 9 "代わりにand (適切なスペースを使用して)を出力できます"H 9"
-AdmBorkBork

@AdmBorkBorkあなたの言うことはわかりません。H9は両方とも「最少」の一部です。
エリックアウトゴルファー

ブール入力値は"max"/ "min"にすることができます。これは、またはMath[b]を参照するために使用されますか?Math.maxMath.min
ジャスティンマリナー

@JustinMarinerご存じのように。JS用ですか?多くのプログラミング言語がこのようなものを利用できると思うので、既存の答えの多くを変更する必要があります。だから、申し訳ありません、あなたは維持する必要がありますb?"max":"min"あなたの答えに...それは私が推測する罰金ラインだ、多分私はちょうどtruthy / falsey値次回を使用する必要があります...
ケビンCruijssen

回答:


3

27 26 24 22バイト

Zgarbのおかげで-2バイト

レオのおかげで-2バイト

テイク ' 'ようにFalse'a'のようにTrue(Truthyあるにおいて籾殻、空白Faslyおよび他のすべての文字)

Fż▲→ġ#¬Ö#≡⁰Ṫḟë½D±o¬□m;

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

どのように機能しますか?

Fż▲→ġ#¬Ö#≡⁰Ṫḟë½D±o¬□m;   Function, takes a character c and a string S as arguments
                    m;   Wrap each character in S into it's own string
             ë           List of four functions returning booleans:
              ½D±o¬      Lower case?,Upper case?,Digit?,Not alphanumeric?
           Ṫḟ            Outer product with find†
       Ö#≡⁰              Sort on how many characters have the same Truthyness as c
    ġ#¬                  Group strings with equal numbers of spaces
   →                     Take the last group
Fż▲                      Squash it all into one list

述語とる関数でありp、リストをLとの最初の要素を返しLを満たすはppデフォルトの引数を満たす要素がない場合は、返されます。この場合' '1文字の文字列に適用することにより、基本的にはif p c then c else ' 'ます。

機能とる関数であるf2つのリストはL1L2。これは、テーブルを返すfすべてのペアの上に塗布L1し、をL2。この場合fL14つの機能の私たちのリストであり、L2一つの文字列のリストです。

Ṫḟ、私たちは、各文字列が持つルールのいずれかを満たしていない文字を置換した結果である文字列のリストを持っています' '

注意: Huskの新しいバージョンでは、3バイトの節約のためġ#¬Ö#≡⁰に置き換えることができますk#≡⁰


好奇心から:なぜ' ''a'?Huskが読めないので、説明を追加すると理解しやすいかもしれません。;)
ケビンクルーイッセン

いいね!ここだ24バイト使用しては
-Zgarb

@Zgarbありがとう!自分が何Mmmをしていたのか本当に理解できませんでした:)
H.PWiz

残念ながら、これは本当にゴルフを支援しませんが、S`?' より簡単なことかもしれません?IK'
レオ

私はの使用を避ける傾向がありI、時にはインタープリターが永遠に時間がかかるようにします。また、無駄だ。
H.PWiz

7

ゼリー、31 バイト

ØṖḟØBṭØBUs26¤f€³Lİ⁴¡$ÐṀFf
¹⁶Ç?€

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

ブール値は2and 1(または他の正の偶数/奇数のペア)でありTrueFalseそれぞれます。さらにゴルフをした後に説明を加えようと思います。

2バイトを節約してくれたcaird coinheringaahingに感謝します。リン 4つのバイトを保存するために!エリックのトリックの一つに感謝、4バイトを節約するようになりました!

使い方

これは35バイトバージョンの説明であることに注意してください。新しいものはほぼ同じことを行います(ただし、Lynnによって少し調整されています)ので、変更しません。

ØBUs26f€³µ³ḟØBW,µẎLİ⁴¡$ÐṀF - Niladic helper link.
ØB                         - String of base digits: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
                             abcdefghijklmnopqrstuvwxyz'. 
  U                        - Reverse.
   s26                     - Chop into sublists of length 26, preserving shorter
                             trailing substrings.
      f€³                  - For each, keep the common characters with the input.
            ØB             - Base digits.
          ³ḟ               - Get the signs in the input. Filter the characters of the
                             input that aren't alphanumeric.
              W,µẎ         - Concatenate (wrap, two element list, tighten).
                       ÐṀ  - Keep the elements with maximal link value.
                  L        - Length.
                    ⁴¡     - Do N times, where N is the second input.
                   İ       - Inverse. Computes 1 ÷ Length. 2 maps to the length itself,
                             because 1 ÷ (1 ÷ Length) = length; 1 yields
                             (1 ÷ Length), swapping the maximal numbers with minimal ones.
                         F - Flatten.

¹⁶e¢$?€ - Main link.
      € - For each character.
   e¢?  - If it is contained by the last link (called niladically), then:
¹       - Identity, the character itself, else:
 ⁶      - A space.


@cairdcoinheringaahingありがとう!:)私は一部が今まで私は答えを掲載以来というゴルフしたかったが、それが機能しなかった理由を私は把握できなかった...私は余分だったµ:D
ミスターXcoder

31バイト:クラスをとして生成し、ØṖḟØBṭØBUs26¤その後でfとのÇ代わりにメンバーシップをテストしe¢$ます。
リン


5

R193 186 179 158バイト

NofPと彼の提案のおかげで-7バイト cbind

-6使用バイトouter、-1バイト切替[^a-zA-Z0-9][[:punct:]]

文字のリストを指摘するMickyTのおかげで-21バイトが許可されます

function(S,B){y=outer(c("[a-z]","[A-Z]","\\d","[[:punct:]]"),S,Vectorize(grepl))
S[!colSums(y[(s=rowSums(y))=="if"(B,max,min)(s),,drop=F])]=" "
cat(S,sep='')}

すべてのテストケースを検証する

取り1/Ttruthy(ようmax)と0/Ffalseyとして(min)、となりますS単一文字のリストとして。

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

私の元のバージョン(NofPの提案による)では、それぞれのをy評価grepl(regex, S)regex、それらを行列の列として連結することにより、行列が構築されます。これにより、が複数回呼び出されますがgreplS修正されたように、他に何かを行う必要があるように思われました。私が述べたように:

潜在的に短いアプローチがあります。mapply、 例えば:

y=mapply(grepl,c("[a-z]","[A-Z]","\\d","[^a-zA-Z0-9]"),list(S))

残念ながら、これはの1文字の例のマトリックスとして単純化されません"A"

私が使用outerするのではなくmapplyれ、常に配列(ここで行列)を返し、そしてすることを余儀なくされましたVectorize grepl本当にただです、mapplyそれのラッパー。

また、[:punct:]句読点(非スペース、非英数字)に一致する定義済みの文字グループも発見しました。


1
マトリックスをcbindに置き換えると、186バイトに減らすことができます。y= cbind(g( "[az]"、S)、g( "[AZ]"、S)、g( "\\ d"、 S)、g( "[^ a-zA-Z0-9]"、S))
NofP

@NofPああ、とてもいい。また、コードをバックティック( `)で囲んで表示することもできますlike this。:)
ジュゼッペ

ルールには、文字配列またはリストを入力として使用できることが記載されているため、おそらくS=el(strsplit(G,""))
-MickyT

@MickyTああ、見落としていました、ありがとう。
ジュゼッペ

4

ハスク31 29 28バイト

SMS?' `ṁ§foSM≠?▲▼⁰M#Kë½D±o¬□

最小文字数には0を、最大文字数には1を使用します。 オンラインでお試しください!

説明

関数のリストはクールです。

SMS?' `ṁ§foSM≠?▲▼⁰M#Kë½D±o¬□  Inputs are bit B and string S.
                     ë        Make a list L of the four functions
                      ½       is-lowercase-letter,
                       D      is-uppercase-letter,
                        ±     is-digit, and
                         o¬□  not is-alphanumeric.
                  M#          For each of them, take number of matches in S,
              ?▲▼⁰            take maximum or minimum depending on B,
          oSM≠                and mark those entries that are not equal to it.
        §f          K         Remove from L the functions that correspond to marked entries, call the result L2.
                              These functions test whether a character should be replaced by a space.
SM                            Do this for each character C in S:
      `ṁ                      Apply each function in L2 to C and sum the results.
  S?'                         If the result is positive, return space, otherwise return C.

4

Python 2、140バイト

g=lambda x:x.isalnum()-~(x>'Z')*x.isalpha()
def f(s,m):k=map(g,s).count;print''.join([' ',c][k(g(c))==sorted(map(k,range(4)))[m]]for c in s)

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

Jonathan Frechがバイトを節約しました。ありがとう!

最高はm=-1、最低はm=0


1
に置き換えること+x.isalpha()*-~(x>'Z')でバイトを節約できると思います-~(x>'Z')*x.isalpha()
ジョナサンフレッチ


3

JAVA(OpenJDKの8) 448 439 432 362 361の 354 352 348 343 320バイト

s->b->{int w[]=new int[4],m=0,n=-1>>>1,l;s.chars().forEach(c->{if(c>96&c<123)w[0]++;else if(c>64&c<91)w[1]++;else if(c>47&c<58)w[2]++;else++w[3];});for(int W:w){m=W>m?W:m;n=W<n?W:n;}l=m-n;m=b?m:n;return l<1?s:s.replaceAll("["+(w[0]!=m?"a-z":"")+(w[1]!=m?"A-Z":"")+(w[2]!=m?"\\d]":"]")+(w[3]!=m?"|[^a-zA-Z0-9]":"")," ");}

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



追加の-1バイトの+in \\|+$を削除できます。
ケビンCruijssen

最後の部分をに変更すると、さらに3バイト節約できますString r=(w[0]!=m?"[a-z]|":"")+(w[1]!=m?"[A-Z]|":"")+(w[2]!=m?"[0-9]|":"")+(w[3]!=m?"[^a-zA-Z0-9]|":"");return r.isEmpty()?s:s.replaceAll(r.replaceAll(".$","")," ");}
ケビンCruijssen

ああ、とn=s.length()することができn=-1>>>1、追加のために-4。
ケビンクルーッセン

ああ、ゴルフのもう一つの小さなこと:[0-9]->\\d
ケビンクルーッセン

3

ルビー118 116バイト

2番目の引数として0(最低)または-1(最高)を取ります。

Lynnのおかげで-2バイト。

->s,t{s.gsub(/./){|c|[/\d/,/[a-z]/,/[A-Z]/,/[^\da-z]/i].group_by{|x|s.scan(x).size}.sort[t][1].any?{|x|x=~c}?c:" "}}

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

非ゴルフ

->s,t{
  s.gsub(/./) {|c|
    [ /\d/,
      /[a-z]/,
      /[A-Z]/,
      /[^\da-z]/i
    ]
    .group_by {|x| s.scan(x).size }
    .sort[t][1]
    .any? {|x| x =~ c } ? c : " "
  }
}

非常にクールな答え!あなたは使用することができ-1、「最高」の値としてと置き換えるminmax[t]ことでsort[t]
リン

3

Pythonの2、190の 183 174 173バイト

短縮してくれたJonathan Frechに感謝

from re import*
def f(i,c):
 q='[a-z]','[A-Z]','\d','[\W_]';l=[len(set(finditer(p,i)))for p in q]
 for j,k in enumerate(l):
	if k-eval(c):i=compile(q[j]).sub(' ',i)
 print i

これは文字列'max(l)''min(l)'trueおよびfalseとして受け取ります。(これがルールに違反するとは思わない...?)これは他の2つのpythonの回答よりも長いですが、違うので投稿したいと思いました。私は素晴らしいゴルファーではないので、これをさらに改善できると思いますが、試したことはすべてうまくいきませんでした。

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


こんにちは、サイトへようこそ!これを実行しようとすると、エラーが発生しますが、その理由は完全にはわかりません。一つの理由はそうあるsum(1for m...べきかもしれませんがsum(1 for m...、他の問題もあると思います。オンラインインタープリター(tioなど)へのリンクを提供して、これを呼び出している方法を示し、エラーではないことを示すことができますか?
ジェームズ

@DJMcMayhemリンクを追加しました。リンクを提供してくれてありがとう、どうすればいいのかわかりませんでした。そこで実行してもエラーは発生しません。
ディルナン

ああ、私はあなたが文字列として入力しているmax(l)とは言えませんでしたmin(l)。だから私はエラーを受け取っていました。それを片付けてくれてありがとう!現在、これはルール#3に違反していますが、 `これらの個別の値は(多少)ブール値として使用されることに注意してください`ですが、間違いなく少し灰色の領域です。
ジェームズ

ところで、ここにTIOのヒントがあります:関数呼び出しをフッターフィールドに入れた場合、それらはバイトカウントにカウントされないので、答えがどれくらいの長さかを簡単に確認できます:オンラインで試してみてください!
ジェームズ

@DJMcMayhemああありがとう。私はそれが一種の灰色の領域であることに同意します。私は 'max'と 'min'を真の偽として取り、その後6バイトを追加してより受け入れられるように見えるeval(c + '(l)')を行うことができますが、OPが私の答えを拒否するまでは大丈夫だと思います。
ディルナン

2

JavaScript(ES6)、151 149バイト

g=
(s,f,a=[/\d/,/[A-Z]/,/[a-z]/,/[_\W]/],b=a.map(r=>s.split(r).length))=>s.replace(/./g,c=>b[a.findIndex(r=>r.test(c))]-Math[f?"max":"min"](...b)?' ':c)
<input id=s oninput=o.textContent=g(s.value,f.checked)><input id=f type=checkbox onclick=o.textContent=g(s.value,f.checked)><pre id=o>

悲しいことに、ルールは、おそらく私が合格することはできませんMath.maxMath.minフラグとして。編集:@JustinMarinerのおかげで2バイト保存されました。


1

ゼリー、37バイト

ØWṖs26µẎØṖḟW⁸;
¢f@³L$ÐṂFe@Ѐ³¬¹⁴?a³o⁶

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

エリクの投稿から「借りる」-6バイト:D


スペースを保存するLolは、本質的にプログラムの半分です:D
Mr. Xcoder

説明を追加してもらえますか、それとも最初にゴルフに取り組んでいますか?
ケビンCruijssen

@KevinCruijssenゴルフ初:D
HyperNeutrino

1

Java(OpenJDK 8)307 + 34 306 + 27 295バイト

私の「面白い」挑戦に挑戦します。

おかげケビンCruijssenのためのバイトの輸入を減らし輸入を完全に削除します!

s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,z=0,y=-1>>>1;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<s.length();i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}

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

説明:

String t=s.replaceAll("\\d","2")
          .replaceAll("[a-z]","0")
          .replaceAll("[A-Z]","1")
          .replaceAll("\\D","3")

最初に、いくつかの単純な正規表現を使用して各グループを0〜3の整数に置き換え、これを新しい文字列に格納します。

int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;

後で使用する他の整数と同様に、整数の配列を初期化します。y符号なし右ビットシフトを使用して、変数を最大intサイズに設定します。

t.chars().forEach(j->{a[j%4]++;});

変更された文字列の各文字について、これは4を法とするASCII値を使用して、増加する前述の配列のインデックスを計算します。

for(int x:a){
    z=x>z?x:z;
    y=x<y?x:y;
}

次に、配列に保存されている各グループのカウントをループし、最小値(y)と最大値()を計算しますz

for(;i<s.length();i++)
    v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);

文字列内のすべての文字を再度ループし、その文字グループのグループが最小/最大に等しいかどうかを確認します(前述のモジュロトリックを使用)。等しくない場合、文字の場所の新しい文字列にスペースが追加され、そうでない場合は元の文字が追加されます。

return v;

最後に新しい文字列を返します!


1
いい答え、私からの+1!ゴルフの2つの小さなこと:import java.util.stream.IntStream;可能性がimport java.util.stream.*;あり、,i可能性が,i=0あります。その後i=0、forループから削除できます。ああ、(s,b)->できますs->b->
ケビンCruijssen

@KevinCruijssenありがとう!ラムダを連鎖できるとは思いませんでした
ルークスティーブンス

カレーと呼ばれます。:)このようにすることができますjava.util.function.Function<String, java.util.function.Function<Boolean, String>> g = s->b->{...};
ケビンCruijssen

1
ああ、そしてゴルフに別のもの:IntStream z=IntStream.of(a);m=(b?z.max():z.min()).getAsInt();なることはできませんl=s.length(),x=0,y=lし、for(int x:a){z=x>z?x:z;y=x<y?x:y;}(b?z:y)あなたはもはや輸入を必要とするので、。すべてをまとめると、s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,l=s.length(),z=0,y=l;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<l;i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}294バイト)になります。
ケビンCruijssen

1
@KevinCruijssen Oooooh nice thinking! I might wait a bit before changing it just in case you come up with anything else ;)
Luke Stevens

1

Bash, 229 227 212 bytes

LANG=C;g="A-Z a-z 0-9 !A-Za-z0-9";declare -A H
f()(((i=$2?99:-1));r=$1;for h in $g;{ t=${r//[$h]};t=${#t};(($2?t<i:t>i))&&i=$t&&H=([$h]=1);((t-i))||H[$h]=1;};for h in $g;{((${H[$h]}))||r=${r//[$h]/ };};echo "$r")

Try it Online


I'm not sure how the spaces around brackets and square-blocks work in Bash, but it still seems to work without the space at f(){((.
Kevin Cruijssen

1
yes, space is mandatory generally except for (, also 2 bytes could be saved using ( instead of {, degrading performance because creating a subshell
Nahuel Fouilleul

1

PHP, 161 158 bytes

for([,$s,$z]=$argv;~$c=$s[$i++];)foreach([punct,upper,lower,digit]as$f)(ctype_.$f)($c)?$$i=$f:$g[$f]++;while(~$c=$s[$k++])echo$g[$$k]-($z?min:max)($g)?" ":$c;

Run with -nr or try it online.

  • first loop: for each position, remember the group of the character
    and count the occurences of groups that the current character is not in.
    (that negation saved 3 bytes)
  • depending on second parameter, pick min non-count for truthy, max non-count for falsy.
  • second loop: if (group of current character) non-count differs
    from min/max non-count then print space, else print character.

1
@KevinCruijssen Make sure you have the latest PHP version (7.1.0) selected.
Titus

1

JavaScript (ES6), 139 bytes

s=>b=>s.map(c=>++a[g(c)]&&c,a=[0,0,0,0],g=c=>c>-1?0:/[a-z]/i.test(c)?c<"a"?2:1:3).map(c=>a.map(v=>v-Math[b?"max":"min"](...a))[g(c)]?" ":c)

Input and output is an array of characters. Takes actual boolean values for input.

A different approach from @Neil's answer; almost avoiding regular expressions. Instead, I used a series of checks to determine the category of each character:

  • Digits return true for c>-1 because non-digits fail mathematical comparisons
  • Uppercase letters match the regex /[a-z]/i and have codepoints less than "a"
  • Lowercase letters match that regex but have codepoints not less than "a"
  • Symbols pass none of those tests

Test Cases

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