6が7を恐れたのはなぜですか? 7 8 9!
文字列が与えられたら、次の変換を適用します。
- 7の横に6がある場合は、6を削除します(6は恐れています) of 7)
- シーケンス「789」が表示された場合は、8と9を削除します(7 ate 9)
(私が間違っていなければ、間違いはありません」変換を実行する順序に関係なく)
これらの変換を適用できなくなるまで適用し続けます。
例:
78966
最初に「789」が表示されるため、文字列は「766」になります。次に「76」が表示されるので、6を取り出すと、文字列は「76」になります。次に、「76」が再び表示されるため、「7」が残ります。
テストケース:
-
987
= >987
(順序が正しくありません。何もしません。) -
6 7
=>6 7
(空白は6から7の間のバッファーとして機能します) -
676
=>7
-
7896789
=>77
-
7689
=>7
-
abcd
=>abcd
コメント
回答
回答
Javascript ES6、29バイト
s=>s.replace(/6*7(89|6)*/g,7)
テスト:
f=s=>s.replace(/6*7(89|6)*/g,7) ;`987 -> 987 6 7 -> 6 7 676 -> 7 7896789 -> 77 7689 -> 7 abcd -> abcd` .split`\n`.every(t=>(t=t.split` -> `)&&f(t[0])==t[1])
コメント
- すばらしい。9が食べられるので、2バイトしかなく、この答えで勝つ:P
回答
Java、 126 81 66 58バイト
このコードのラムダバージョンを提供してくれた@GamrCorpsに感謝します!
オートボクシングのトリックを指摘してくれた@ user902383に感謝します!
。 ..うん。
実際には私より長い期待される-Javaは、文字列内の項目をreplaceAll()
に一致ごとに1回置き換えますが、変更が停止するまで繰り返しは置き換えません。そのため、派手なforループを使用する必要がありました。
ラムダ形式:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
関数形式:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
テスト可能なゴルフなしコード:
class B{ public static void main(String[]a){ System.out.print(new B().s(a[0])); } String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;} }
コメント
- ラムダを使ってみませんか?少なくとも15バイト節約できます
- @GamrCorps ‘その表現方法がわからない-関数を使用しないでください。
- what ‘はクラスではなくインターフェースのポイントですか?
- @eisインターフェースでは、mainをパブリックとして宣言する必要がなくなり、わずかな利点が得られます。参照: codegolf.stackexchange.com/a/64713/44713
- @ user902383削減量’再作成は、
.equals
を!=
に変更することによって行われます。これは同じことをしません。==
(または!=
)は、値ではなく、オブジェクトの16進位置で比較します。 ‘それ以外は同じ長さです。while()
は7バイト、for(;;)
は7バイトです。
回答
GNU Sed、17
スコアには-r
オプションの+1が含まれます。
s/6*7(6|89)*/7/g
コメント
- ‘はは
77
を返す必要がありますが、代わりに677
- iv id =を使用できます
s/6?7(6|89)/7/
- の代わりに “5927c22883”>
ねえ、ラリーがs///g
?
回答
Perl 6 、 19 18バイト
{S:g/6*7[6|89]*/7/} # 19 bytes
$ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes
([6|89]
はキャプチャーではないことに注意してくださいPerl5で(?:6|89)
と綴られる(6|89)
のバージョン。<[6|89]>
は、Perl5で[6|89]
と綴られるものを記述する方法です)
使用法:
$ perl6 -pe "s:g/6*7[6|89]*/7/" <<< " 987 6 7 6676689 7896789 7689 abcd 68978966897896 79|689 "
987 6 7 7 77 7 abcd 68977 79|689
コメント
- Perl 6を知らない’これは繰り返しの置換です。
6*
と[6|89]*
が’に一致しない場合、7
が7
ad infinitumの代わりに使用されるのを防ぐにはどうすればよいですか? - @DigitalTrauma と
7
は、次の位置から再開し、最後まで機能します。:g
は:global
repeat until it doesn't match anymore
ではありません。 - @DigitalTrauma
s/67|76|789/7/
を取得するには次のような効果をもたらすものとして記述する必要があります:while s/67|76|789/7/ {}
もちろん、ご想像のとおり。また、前のコメントの終わりは意地悪なものとして外れる可能性があります。つまり、意図された方法ではありません - すべきではありません’
[]
を()
に変更しますか? ‘パイプまたは79999
を一致させたくない。 - @jwodderいいえ
[]
はPerl6の非キャプチャバージョンの()
であり、あなたが考えているのはPerl6では<[6|89]>
と綴られています。 。
回答
Pyth、17バイト
u:G"67|76|789"\7z
Leaky Nunは、コメントでこれを1バイト上回っています。
コメント
回答
Perl 5 、17バイト
perl -pe "s/6*7(6|89)*/7/g" # 16 + 1
使用法:
$ perl -pe "s/6*7(6|89)*/7/g" <<< " 987 6 7 6676689 7896789 7689 abcd 68978966897896 "
987 6 7 7 77 7 abcd 68977
回答
Mathematica、52バイト
StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&
説明:
& A function returning & a function returning # its first argument StringReplace[ , ] with "67" "67" | or "76" "76" | or "789" "789" -> replaced with "7" "7" ~FixedPoint~ applied to # its first argument until it no longer changes.
コメント
- ゴルフのコードは説明コードよりも明確です。.:)
- @Rob Haven ‘以前は多くの説明をしていて、体系的なアプローチを採用していました。
- 私はただからかっていました、仲間:)
回答
錆、96バイト
fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}
Rustの場合と同じように、長すぎます…
Ungolfed:
fn seven_ate_nine(mut str: String) -> String { for _ in 0..str.len() { for to_replace in &["67","76","789"] { str = str.replace(to_replace, "7"); } } s }
コメント
- 少なくとも’はJavaではありません
回答
Emacs Lisp、59バイト
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))
スペースを使用すると少し明確になります:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
回答
ルビー、27バイト
このソリューションはコメントからのもので、 Brad Gilbert b2gills の功績によるものです。
->s{s.gsub /6*7(6|89)*/,?7}
ルビー、37バイト
(古いソリューション)
このソリューションは、文字列内の文字よりも多くの回数を置き換える必要がないという事実を利用しています。
->s{s.chars{s.sub! /67|76|789/,?7};s}
コメント
-
size.times
の代わりにchars
を使用していくつかを節約できますバイト。 - ‘ t Rubyには正規表現置換のグローバルフラグがありますか、それとも有効にするのにさらにバイトが必要ですか?
- @ BradGilbertb2gills 、RubyではAwkと同様です。最初またはすべてを置き換えるために、個別の
sub()
メソッドとgsub()
メソッドがあります。したがって、グローバルは1文字長くなります。 - @manatwork次に、次のように記述します:
->s{s.gsub /6*7(6|89)*/,'7'}
、gsub
すべてのループ作業を行います。 - コマンドラインフラグのルールを正しく理解している場合は、-pコマンドラインフラグ(+1)を使用して16バイト節約でき、
gsub /6*7(6|89)*/,?7
で使用法ruby -pe "gsub /6*7(6|89)*/,?7"
合計20 + 1バイト
回答
回答
PowerShell、27バイト
$args-replace"6*7(89|6)*",7 e.g. PS C:\temp> .\ate.ps1 "7689" 7 PS C:\temp> .\ate.ps1 "abcd" abcd PS C:\temp> .\ate.ps1 "68978966897896" 68977
以下を利用する:
- 他の誰かの正規表現パターン
- 方法
-replace
は、PowerShellでデフォルトでグローバル置換を行います - ループ展開では、
-regex
演算子が配列に適用されます$args
すべての要素に個別に適用します。スクリプトパラメーターが1つしかないため、ここには要素が1つしかないため、正常に機能し、要素[0]
にインデックスを付けます。
グローバルな置き換えを実現する前の新しい試みはそれを行います。文字列の長さの倍数の文字列乗算を使用して「-replace-replace-replace」のチェーンを構築し、それをeval()する74バイト:
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex
(置換の数を短くするために文字列を少し置換します)
回答
MATL 、17バイト
jt""789|76"55cYX]
例
>> matl > jt""789|76"55cYX] > > 7896789 77
編集: オンラインでお試しください!
説明
j % input string t % duplicate " % for each character. Iterates as many times as the string length "789|76" % regular expression for replacement 55c % string to insert instead: character "7" YX % regexprep ] % end for
これは、元の文字列の文字数と同じ回数だけ通常の式の置換を適用することで機能します。置換するたびに文字数が減るので、これで十分です。
回答
まじめな話、29バイト
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n
"6789"
のように、入力を二重引用符で囲まれた文字列として受け取ります。 オンラインでお試しください(入力を手動で引用する必要があります)。
説明:
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n ,;l get input and push its length (we"ll call it n) ` `n call the following function n times: "7;;"67"(Æ replace all occurrences of "67" with "7" "76"(Æ replace all occurrences of "76" with "7" "789"(Æ replace all occurrences of "789" with "7"
回答
PHP、36バイト
preg_replace("/6*7(6|89)*/","7",$a);
正規表現ソリューション。$ a文字列を受け取り、式を介して置き換えます。
コメント
- GET PHPの入力メソッドとしてパラメータを使用することはできません。これを関数にして入力を関数パラメーターとして渡すか、
$argv
またはSTDINから入力を取得する必要があります。 - @Megoないようですリンクした投稿に関するコンセンサス。
- @immibis正解です。 I / O方式を受け入れられるようにするには、コンセンサスが必要です。 1つがないということは、それが受け入れられないことを意味します。
- TL; DRコードゴルフにPHPを使用すると、深刻な欠点があります。
回答
火、26バイト
67::=7 76::=7 789::=7 ::=
末尾の改行を含みます。
入力はプログラムを開始する前にプログラムに追加されます。
出力は、チューリングマシンと同様に、終了時にプログラムの状態から読み取られます。
(火 出力ストリームはありますが、正しく使用するのが難しいため、これが許容できる出力方法かどうかわかりません)
コメント
- そうは思いません’。 STDOUTへの方法がある場合は、そうする必要があります。申し訳ありません!
- はい、これはメタ投稿に従って許可されています。
回答
CJam、 70 64バイト
{"789":I}{"76:":I}?
を"789""76"?:I
"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I={"789":I}{"76":I}?];}?}/A
"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I="789""76"?:I];}?}/A
わかっていますおそらくもっとゴルフをすることができ、あなたの助けを大いに感謝しますが、率直に言って、私は答えを得ることができてうれしいです。これはCJamを書く最初の試みでした。
説明:
"67":I e# Assign the value of 67 to I q:A e# Read the input and assign to A { e# Opening brackets for loop AI#:B) e# Get the index of I inside A and assign to B. The increment value by 1 to use for if condition (do not want to process if the index was -1) { e# Open brackets for true result of if statement AB< e# Slice A to get everything before index B 7+ e# Append 7 to slice A{BI,+}~> e# Slice A to get everything after index B plus the length of string I (this will remove I entirely) +s:A e# Append both slices, convert to string, and assign back to A ]; e# Clear the stack } e# Closing brackets for the if condition { e# Open brackets for false result of if statement "76"I= e# Check if I is equal to 76 "789" e# If I is 76, make I 789 "76"?:I e# If I is not 76, make I 76 ]; e# Clear the stack if I does not exist inside A }? e# Closing brackets for false result of if statement }/ e# Loop A e# Output A
コメント
- この質問を試みたことがない’自分自身なので、’これが最善のアプローチかどうかはわかりませんが、分割と結合を行う場合は、
/
と*
。また、Cのような言語に慣れている場合は、スタックの観点から考えると’ sいくつかの適応。例えば。{"789":I}{"76":I}?
は、割り当てを引き出して"789""76"?:I
にし、さらに78976`3/?:I
に移動できます。 。 - ありがとうございます! ‘ 2番目の提案の使用方法を完全に理解できませんでした。
- 申し訳ありませんが、私の間違いです。
78976`3/
は配列を与えます["789" "76"]
;次に、?
を使用するのではなく、=
を使用してインデックスを作成する必要があります。ただし、’は後ろから前にあるため、インデックスを反転する必要があり、利点が失われます。
回答
R、35バイト
cat(gsub("6*7(6|89)*",7,scan(,"")))
このように、私が何か新しいことを学ばせてくれたすべての回答に感謝します。
回答
/// 、19バイト(非競合)
/67/7//76/7//789/7/
この言語で実際に入力を提供することはできないため、想定される入力はコードの右側に配置されます。
コメント
-
Itflabtijtslwi はスラッシュですが、入力があります。
- @FryAmTheEggmanただし、文字列ではなく文字を入力します。 i>。
- リンクにスラッシュが1つ欠けているようです。
回答
PHP51文字
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}
長い手で書かれたテストケース
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7;
これにより、while条件で文字列の比較と文字列の置換が行われます。 while条件が満たされると、比較の左側が結果で更新されます。改善点があれば教えてください。
回答
ジョルフ、15バイト
ここで試してみてください!本当に説明する必要がありますか?
pi"6*7(6|89)*"7 p replace any entity in i the input "6*7(6|89)*" that matches this regex 7 with 7 implicit output
回答
Clojure、71バイト
Clojureは、そのためゴルフには理想的とは言えません。冗長な性質-しかし、それでも興味深い演習です:
Java相互運用機能を使用したゴルフバージョン:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))
ゴルフなしバージョン、 Java相互運用機能の使用:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x))))
ゴルフなしの”純粋なClojure “バージョン:
(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x))))
回答
バッシュ、 102 82 67(+7)?バイト
extglobバージョン
x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v
これはファイルに入れられ、たとえばbash -O extglob 789.sh 6567678989689789656
。 (+7)?バイトは、extglobオプションがバイトにカウントされる場合に使用されます。
extglob機能を指摘してくれた@BinaryZebraに感謝します!
非extglobバージョン(82バイト)
x=$1 while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done echo $v
これはファイルに入れて、egで呼び出すことを目的としています。 ./789.sh 65678989656
。
パラメータ展開を利用して、ループ内で検索および置換します。拡張をより効果的にチェーンする方法がわからないため、置換を行うために一連の拡張を行いました。
コメント
- ようこそPPCG!
- @BinaryZebraああ、
@()
構文に感謝します。これらを組み合わせる方法が必要だとわかっていました。@ Mego、歓迎してくれてありがとう!
回答
Python 3、46バイト
import re lambda s:re.sub(r"6*7(6|89)*","7",s)
回答
Japt v2.0a0、12バイト
e/6?7(6|89/7
仕組み
String.e
は再帰的な置換関数です。Japt2には新しいregex構文と自動補完があります。 regex内の括弧の数で、ここで1バイト節約できます(Japt 1.xでは、regexeの代わりに文字列を渡す必要がありました。これはちょっと不格好でした。)
回答
Dyalog APL 、17バイト
"6*7(6|89)*"⎕R"7"
"6*
任意の数の6
7
の後に7
(
…)*"
の後に0個以上のシーケンスが続きます…
6|89
6または89
⎕R
R これを
"7"
セブン
回答
05AB1E 、12 バイト
Δ67‚7:789¬:
説明:
Δ # Continue doing the following until it no longer changes: 67 # Push 67 to the stack  # Bifurcate (short for Duplicate & Reverse); which pushes 76 to the stack ‚ # Pair them up 7: # Replace all occurrences of 67 or 76 with 7 in the (implicit) input # i.e. 17893762 → 1789372 789 # Push 789 to the stack ¬ # Take the head (without popping); which pushes 7 to the stack : # Replace all 789 with 7 # i.e. 1789372 → 17372 # (And implicitly output the result after the loop)
68978966897896
= >68977