6が7を恐れていたのはなぜですか?


61

6が7を恐れていたのはなぜですか?なぜなら7 8 9!

文字列を指定すると、次の変換が適用されます。

  • 7の隣に6がある場合、6を削除します(6は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

130
Vistaが7を恐れていたのはなぜですか?7 8 10なぜなら
lirtosiast

2
別のテストケース68978966897896=>68977
Brad Gilbert b2gills

19
@ThomasKwaああ、わかった:MicrosoftはWindows 9をなぞっていたので、Windows 9をスキップした。;)
ETHproductions

43
なぜ7を恐れたのは5だったのですか?6 7 8
寂退

2
6人は7人を恐れていました。
コナーオブライエン

回答:



12

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])

12
グレート、および9が食べれるので、あなただけの2つのバイトを持っており、この答えで勝つ:P
ピエールArlaud

12

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

テスト可能なUngolfedコード:

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

2
ラムダを使用してみませんか?少なくとも15のバイトが保存されます
GamrCorps

@GamrCorpsそれを表現する方法がわからない-関数を使用しないでください。
アディソンクランプ

1
クラスではなくインターフェイスのポイントは何ですか?
eis

3
@eis Interfaceは、mainをパブリックとして宣言する必要をなくします。これにより、わずかな利点が得られます。参照:codegolf.stackexchange.com/a/64713/44713
Addison Crump

1
@ user902383削減は、に変更.equalsすることで、同じこと行わ!=れませ==(または!=)値ではなく、オブジェクトの16進数の場所で比較します。それ以外は同じ長さです。while()7バイト、for(;;)7バイトです。
アディソンクランプ

9

GNU Sed、17

スコアには-rオプションの+1が含まれます。

s/6*7(6|89)*/7/g

以下のために動作しません67789返す必要があります77が、それは代わりに返します677
ブラッド・ギルバートがb2gills

1
あなたは使用することができます s/67|7(6|89)/7/代わりにs/6?7(6|89)/7/
ブラッド・ギルバートb2gills

1
ジー、私はラリーがどこで思いついたのだろうs///gか?
ブラッドギルバートb2gills

8

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]は、Perl 5の(6|89)よう(?:6|89)に綴られている非キャプチャバージョンです。Perl5のように綴られ<[6|89]>ているものをどのように書くかです[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ですか?
デジタル外傷

2
@DigitalTraumaスワップ7して7から次の位置で再び開始し、最後まで動作します。notの:g略です。:globalrepeat until it doesn't match anymore
ブラッドギルバートb2gills

1
@DigitalTrauma作業を始めるs/67|76|789/7/667は、効果のあるものとして書かwhile s/67|76|789/7/ {}なければなりません。もちろん、while s/6*7[6|89]*/7/ {}期待通りに書けば、それは止まらないでしょう。また、以前のコメントの最後にはそれがある、元気、平均オフに来るかもしれない、それがintededたか
ブラッド・ギルバートはb2gills

1
[]に変更されるべきではありません()か?パイプまたはに一致させたくない79999
jwodder

1
いいえ@jwodder []のPerl 6の非捕捉したバージョンである()、何を考えているのがと綴られ<[6|89]>たPerl 6で
ブラッド・ギルバートはb2gills



4

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.

8
ゴルフコードは説明コードよりも明確です。.:)
ロブ

@Rob以前は多くの説明をしておらず、体系的なアプローチをとっています。
LegionMammal978

私はただからかっていた、仲間:)
ロブ

3

さび、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のいつものように、絶望的に長い...

ゴルフをしていない:

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ではありません

3

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

3

ルビー、27バイト

このソリューションは、Brad Gilbert b2gillsの功績によるコメントからのものです

->s{s.gsub /6*7(6|89)*/,?7}

ルビー、37バイト

(旧ソリューション)

このソリューションでは、文字列内の文字よりも多くの回数を置き換える必要がないという事実を使用しています。

->s{s.chars{s.sub! /67|76|789/,?7};s}

chars代わりにsize.timesを使用して、数バイトを節約できます。
ドアノブ

Rubyには正規表現置換のグローバルフラグがないのですか、それとも有効にするにはより多くのバイトが必要ですか?
ブラッドギルバートb2gills

Rubyの@ BradGilbertb2gillsはAwkのようなものです。最初またはすべてを置き換える個別のメソッドsub()gsub()メソッドがあります。したがって、グローバルは1文字だけ長くなります。
マナトワーク

1
@manatworkそれから、次のように記述します:->s{s.gsub /6*7(6|89)*/,'7'}gsubすべてのループ処理を行います。
ブラッドギルバートb2gills

私が正しくコマンドラインフラグのルールを理解していれば、あなたはそれを作る-pコマンドラインフラグ(1)を使用して、16のバイトを救うことができるgsub /6*7(6|89)*/,?7使用にruby -pe "gsub /6*7(6|89)*/,?7"20 + 1バイトの合計
アレクシス・アンデルセン


2

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

を利用する:

  • 他人の正規表現パターン
  • -replacePowerShellでデフォルトでグローバル置換を行う方法
  • ループを展開します。すべての要素に個別に適用して-regex演算子を配列$argsに適用します。スクリプトパラメーターが1つしかないため、ここには1つの要素しかありません。したがって、正常に機能し、elementにインデックスを付ける必要がなくなります[0]

グローバルな置き換えを実現する前の新しい試みはそれを行うでしょう。文字列の長さと同じ数の文字列の乗算を使用して「-replace -replace -replace」のチェーンを構築し、それをeval()する74バイト:

"'$($args)'"+("{0}6|6(?=7)'{0}89'"-f"-replace'(?<=7)")*$args[0].Length|iex

(置換の数を短縮するために、文字列を少し置換します)。


2

CJam、70 64バイト

切断するための@Peterテイラーに感謝{"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言語のような言語に慣れているときにスタックの観点から考えると、多少の適応が必要になることに注意してください。例えば{"789":I}{"76":I}?、なるために割り当てを引き出す"789""76"?:Iことができます、それはさらにゴルフすることができます78976`3/?:I
ピーターテイラー

ありがとうございました!ただし、2番目の提案の使用方法を理解できませんでした。
コンラッドクレーツ

すみません、私の間違いです。78976`3/配列を返し["789" "76"]ます。使用?するのではなく、=インデックスに使用する必要があります。しかし、バックツーフロントなので、インデックスを逆にする必要があり、利点が失われます。
ピーターテイラー

2

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

これは、元の文字列に文字がある限り、正規表現の置換を適用することで機能します。置換ごとに文字数が減るため、これで十分です。


1

真剣に、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"

1

Thue、26バイト

67::=7
76::=7
789::=7
::=

末尾の改行を含む。

入力は、プログラムを開始する前にプログラムに追加されます。
チューリングマシンと同様に、終了時に出力はプログラム状態から読み取られます。
(Thueに出力ストリームがありますが、正しく使用するのは難しいため、これが許容可能な出力方法であるかどうかはわかりません)


そうは思いません。STDOUTへの道があるなら、そうしなければなりません。ごめんなさい!

はい、これはメタ投稿に従って許可されています。
geokavel

1

バッシュ、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に感謝します!


非拡張版(82バイト)

x=$1
while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done
echo $v

これはファイルに入れられ、例えばで呼び出されることを意図しています./789.sh 65678989656

パラメータ展開を使用して、ループ内で検索および置換します。拡張をより効果的にチェーンする方法がわからないので、置換を行うために一連の拡張を行いました。


PPCGへようこそ!
メゴ

@BinaryZebraああ、@()構文をありがとう。それらを組み合わせる方法が必要だと思いました。そして@Mego、歓迎してくれてありがとう!
プーピング

1

R、35バイト

cat(gsub("6*7(6|89)*",7,scan(,"")))

私はgsubこの方法を使うことができるとは知りませんでした、ここで私が何か新しいことを学ぶようになったすべての答えに感謝します。


0

PHP 51文字

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条件が満たされた場合、結果の比較の左側が更新されます。改善点をお知らせください。



0

PHP、36バイト

preg_replace('/6*7(6|89)*/','7',$a);

正規表現ソリューションは、文字列を取得し、式を介して置き換えます。


GETパラメーターは、PHPの入力メソッドとして受け入れられません。これを関数にして、入力を関数パラメーターとして渡すか、$argvまたはSTDIN から入力を取得する必要があります。
メゴ

@Megoあなたがリンクした投稿にはコンセンサスがないようです。
user253751

@immibis正しい。I / Oメソッドを受け入れ可能にするためには、コンセンサスが必要です。1つの不足は、それが許容できないことを意味します。
メゴ

TL; DR codegolfにPHPを使用すると、深刻な欠点があります。
HamZa

0

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

0

///、19バイト(非競合)

/67/7//76/7//789/7/

実際にこの言語で入力を提供することはできないため、想定される入力はコードの右側になります。


Itflabtijtslwiはスラッシュですが、入力があることに注意してください。
FryAmTheEggman

@FryAmTheEggman 1つは入力が文字を、ない文字列
エリックアウトゴルファー

リンクにスラッシュが1つ欠けているようです。
デリオス


0

Japt v2.0a0、12バイト

e/6?7(6|89/7

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

使い方

String.e再帰的な置換関数です。Japt 2には、新しい正規表現構文と正規表現内の括弧の自動補完があり、ここで1バイト節約されます。(Japt 1.xでは、正規表現の代わりに文字列を渡す必要がありましたが、これはちょっと不格好でした。)


0

Dyalog APL、17バイト

'6*7(6|89)*'⎕R'7'

'6*任意の数の6の
7 後に7が 続く
()*'ゼロ以上のシーケンスが続く...
6|89 6または8の9

⎕R置き換える

'7' 7


0

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