Mengapa 6 takut dengan 7?

61

Mengapa 6 takut dengan 7? Karena 7 8 9!

Diberikan string, terapkan transformasi berikut:

  • Jika ada 6 di sebelah 7 hapus 6 (6 takut 7)
  • Jika urutan "789" muncul hapus 8 dan 9 (7 makan 9)

(Jika saya tidak salah, tidak masalah bagaimana Anda melakukan transformasi)

Terus terapkan transformasi ini sampai Anda tidak bisa lagi.

Contoh:

78966

Pertama kita melihat "789", jadi string menjadi "766". Kemudian kita melihat "76", jadi kita mengeluarkan 6, dan string menjadi "76". Kemudian kita melihat "76" lagi, jadi kita pergi dengan "7".

Kasus uji:

  • 987=> 987(Tidak dalam urutan yang benar. Tidak melakukan apa-apa.)
  • 6 7=> 6 7(Spasi bertindak sebagai penyangga antara 6 dan 7. Tidak ada yang terjadi)
  • 676 => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd => abcd
geokavel
sumber
130
Mengapa Vista takut dengan 7? Karena 7 8 10.
lirtosiast
2
Test case lain 68978966897896=>68977
Brad Gilbert b2gills
19
@ThomasKwa Oh, saya mengerti: Microsoft melewatkan Windows 9 karena mereka setuju dengan teka-teki itu. ;)
ETHproductions
43
Mengapa takut tujuh adalah lima? Karena enam tujuh delapan. --Yoda
Jakuje
2
Enam takut tujuh karena tujuh memiliki mata dingin dan mati.
Conor O'Brien

Jawaban:

12

Javascript ES6, 29 byte

s=>s.replace(/6*7(89|6)*/g,7)

Uji:

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])
Qwertiy
sumber
12
Hebat, dan karena 9 dimakan, Anda hanya memiliki 2 byte dan menang dengan jawaban ini: P
Pierre Arlaud
12

Java, 126 81 66 58 byte

Terima kasih kepada @GamrCorps untuk menyediakan versi lambda dari kode ini!

Terima kasih kepada @ user902383 untuk menunjukkan trik autoboxing!

...ya.

Ini sebenarnya lebih lama dari yang saya harapkan - Java mengganti item dalam string dengan replaceAll()sekali per pertandingan, tidak berulang kali sampai berhenti berubah. Jadi saya harus menggunakan fancy untuk loop.

Bentuk lambda:

x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}

Bentuk fungsi:

String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}

Kode Tidak Diuji yang Dapat Diuji:

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;}
}
Addison Crump
sumber
2
Mengapa tidak menggunakan lambda? Akan menghemat setidaknya 15 byte
GamrCorps
@GamrCorps Tidak tahu bagaimana mengucapkannya - jangan pernah menggunakan fungsi.
Addison Crump
1
apa gunanya antarmuka dan bukan kelas?
eis
3
@eis Interface menghilangkan kebutuhan untuk mendeklarasikan main sebagai publik, yang memberikan sedikit keuntungan. Lihat: codegolf.stackexchange.com/a/64713/44713
Addison Crump
1
@ user902383 Pengurangan Anda membuat adalah dengan mengubah .equalske !=, yang tidak tidak melakukan hal yang sama. ==(atau !=) membandingkan dengan lokasi objek hex, bukan dengan nilai. Panjangnya sama saja. while()adalah 7 byte, for(;;)adalah 7 byte.
Addison Crump
9

GNU Sed, 17

Skor termasuk +1 untuk -ropsi.

s/6*7(6|89)*/7/g
Trauma Digital
sumber
Tidak berhasil karena 67789harus kembali 77tetapi sebaliknya kembali677
Brad Gilbert b2gills
1
Anda dapat menggunakan s/67|7(6|89)/7/sebagai gantinyas/6?7(6|89)/7/
Brad Gilbert b2gills
1
Astaga, saya bertanya-tanya dari mana Larry datang dengan gagasan itu s///g?
Brad Gilbert b2gills
8

Perl 6 , 19  18 byte

{S:g/6*7[6|89]*/7/} # 19 bytes

$ perl6 -pe 's:g/6*7[6|89]*/7/' # 17 + 1 = 18 bytes

(Perhatikan bahwa itu [6|89]adalah versi non-menangkap (6|89)yang dieja seperti (?:6|89)dalam Perl 5. <[6|89]>adalah bagaimana Anda akan menulis apa yang dieja seperti [6|89]di Perl 5)

pemakaian:

$ 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
Brad Gilbert b2gills
sumber
Saya tidak tahu Perl 6, tetapi saya menganggap ini adalah penggantian berulang. Jika 6*dan [6|89]*tidak cocok, apa yang menghentikan 7yang diganti untuk 7iklan tak terhingga?
Trauma Digital
2
@DigitalTrauma Bertukar 7dengan 7kemudian mulai lagi di posisi berikutnya, bekerja dengan cara sampai akhir. :gkependekan dari :globaltidak repeat until it doesn't match anymore.
Brad Gilbert b2gills
1
@DigitalTrauma Untuk mulai s/67|76|789/7/bekerja 667saya harus menuliskannya sebagai sesuatu yang efeknya: while s/67|76|789/7/ {}yang tentu saja tidak akan pernah berhenti jika Anda menulisnya while s/6*7[6|89]*/7/ {}seperti yang Anda harapkan. Juga, akhir dari komentar sebelumnya dapat dianggap sebagai kejam, bukan itu yang diinginkan
Brad Gilbert b2gills
1
Bukankah []seharusnya diubah ()? Anda tidak ingin mencocokkan pipa atau 79999.
jwodder
1
@jwodder No []adalah versi Perl 6 yang tidak menangkap (), apa yang Anda pikirkan dieja <[6|89]>dalam Perl 6.
Brad Gilbert b2gills
7

Pyth, 17 byte

u:G"67|76|789"\7z

Coba di sini.

Leaky Nun telah mengungguli ini dengan byte dalam komentar.

Mike Bufardeci
sumber
4

Perl 5 , 17 byte

perl -pe 's/6*7(6|89)*/7/g' # 16 + 1

pemakaian:

$ 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
Brad Gilbert b2gills
sumber
4

Mathematica, 52 byte

StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&

Penjelasan:

                                                   &   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.
LegionMammal978
sumber
8
Kode golf lebih jelas daripada kode penjelasan .. :)
Rob
@Rob Belum pernah membuat banyak penjelasan sebelumnya, mencari pendekatan sistematis.
LegionMammal978
Saya hanya menggoda, sobat :)
Rob
3

Karat, 96 byte

fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}

Sangat panjang, seperti biasa untuk ...

Tidak Disatukan:

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
}
Gagang pintu
sumber
Setidaknya itu bukan Java
3

Emacs Lisp, 59 byte

(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))

Menjadi sedikit lebih jelas dengan spasi:

(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
Tuan Yuuma
sumber
3

Ruby, 27 byte

Solusi ini dari komentar, kredit kepada b2gills Brad Gilbert .

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

Ruby, 37 byte

(solusi lama)

Solusi ini menggunakan fakta bahwa Anda tidak perlu mengganti lebih dari karakter dalam string.

->s{s.chars{s.sub! /67|76|789/,?7};s}
MegaTom
sumber
Anda dapat menggunakan charsalih-alih size.timesmenyimpan beberapa byte.
Gagang Pintu
Bukankah Ruby memiliki bendera global untuk substitusi regex, atau akankah itu membutuhkan lebih banyak byte untuk diaktifkan?
Brad Gilbert b2gills
@ BradGilbertb2gills, di Ruby seperti di Awk: ada yang terpisah sub()dan gsub()metode untuk menggantikan pertama atau semua. Jadi global hanya satu karakter lebih lama.
manatwork
1
@manatwork Kemudian saya akan menulis ini seperti:, ->s{s.gsub /6*7(6|89)*/,'7'}dan biarkan gsubsemua looping berfungsi.
Brad Gilbert b2gills
Jika saya memahami aturan flag baris perintah dengan benar, Anda bisa menyimpan 16 byte dengan menggunakan flag baris perintah -p (+1) membuatnya gsub /6*7(6|89)*/,?7dengan penggunaan ruby -pe "gsub /6*7(6|89)*/,?7"total 20 + 1 byte
Alexis Andersen
2

Japt , 15 byte

Ur"6*7(89|6)*"7

Solusi RegEx sederhana

Cobalah online

Downgoat
sumber
2

PowerShell, 27 byte

$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

Memanfaatkan:

  • pola regex orang lain
  • cara -replaceglobal mengganti secara default di PowerShell
  • loop membuka gulungan, di mana ia akan menerapkan -regexoperator ke array $argsdengan menerapkannya ke semua elemen secara individual, dan hanya ada satu elemen di sini karena hanya ada satu parameter skrip, sehingga berfungsi OK dan kita dapat menghindari harus mengindeks elemen [0].

Upaya baru sebelumnya sebelum menyadari penggantian global akan melakukannya; 74 byte membangun rantai "-ganti-ganti-ganti" menggunakan perkalian string, sebanyak panjang string, kemudian eval ():

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

(Dengan sedikit penggantian string untuk mempersingkat jumlah penggantian).

TessellatingHeckler
sumber
2

CJam, 70 64 byte

Terima kasih kepada @ Peter Taylor untuk memotong {"789":I}{"76:":I}?ke"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

Saya tahu ini mungkin bisa bermain golf lebih jauh dan bantuan Anda akan sangat dihargai, tetapi terus terang saya senang saya berhasil mendapatkan jawabannya. Ini adalah upaya pertama saya untuk menulis CJam.

Penjelasan:

"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
Conrad Crates
sumber
Saya sendiri belum mencoba pertanyaan ini, jadi saya tidak yakin apakah ini adalah pendekatan terbaik, tetapi jika Anda ingin melakukan pemisahan dan bergabung maka lihat /dan *. Juga perhatikan bahwa berpikir dalam hal tumpukan ketika Anda terbiasa dengan bahasa C-like membutuhkan adaptasi. Misalnya {"789":I}{"76":I}?dapat menarik tugas menjadi "789""76"?:I, yang selanjutnya bisa di-golf 78976`3/?:I.
Peter Taylor
Terima kasih! Saya tidak bisa mengerti bagaimana menggunakan saran kedua Anda.
Conrad Crates
Maaf, kesalahan saya. 78976`3/memberikan array ["789" "76"]; kemudian daripada menggunakan ?Anda perlu menggunakan =untuk mengindeks; tapi ini back-to-front, jadi itu perlu indeks untuk dibalik, kehilangan keuntungan.
Peter Taylor
2

MATL , 17 byte

jt"'789|76'55cYX]

Contoh

>> matl
 > jt"'789|76'55cYX]
 > 
> 7896789
77

EDIT : Coba online!

Penjelasan

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

Ini bekerja dengan menerapkan penggantian ekspresi reguler sebanyak yang ada karakter dalam string asli . Ini cukup, karena setiap substitusi mengurangi jumlah karakter.

Luis Mendo
sumber
1

Serius, 29 byte

,;l`'7;;"67"(Æ"76"(Æ"789"(Æ`n

Mengambil input sebagai string yang dikutip ganda, seperti "6789". Cobalah online (Anda perlu mengutip input secara manual).

Penjelasan:

,;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"
Mego
sumber
1

Thue , 26 byte

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

termasuk baris baru yang tertinggal.

Input ditambahkan ke program sebelum memulai.
Output membaca status program saat berakhir, sama seperti mesin Turing.
(Thue memang memiliki aliran output, tetapi sulit untuk digunakan dengan benar, jadi saya tidak yakin apakah ini merupakan metode output yang dapat diterima)

pengguna253751
sumber
Saya kira tidak. Jika Anda memiliki cara untuk STDOUT, Anda harus melakukannya. Maaf!
Ya, ini diizinkan sesuai dengan pos meta.
geokavel
1

Bash, 102 82 67 (+7)? byte

versi extglob

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

Ini dimaksudkan untuk dimasukkan ke dalam file dan dipanggil dengan mis bash -O extglob 789.sh 6567678989689789656. (+7)? byte adalah untuk jika opsi extglob diperhitungkan terhadap byte.

Terima kasih kepada @BinaryZebra untuk menunjukkan fitur extglob!


Versi non-extglob (82 byte)

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

Ini dimaksudkan untuk dimasukkan ke dalam file dan dipanggil dengan mis ./789.sh 65678989656.

Itu menggunakan ekspansi parameter untuk mencari dan mengganti dalam satu lingkaran. Saya melibatkan serangkaian ekspansi untuk melakukan penggantian karena saya tidak mengetahui cara untuk secara efektif rantai ekspansi.

Buang air besar
sumber
Selamat datang di PPCG!
Mego
@ BinZebra Ah, terima kasih untuk @()sintaksnya. Saya tahu harus ada cara untuk menggabungkan itu. Dan @Mego, terima kasih atas sambutannya!
Pooping
1

R, 35 byte

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

Saya tidak tahu saya bisa menggunakan gsubcara ini, terima kasih banyak atas setiap jawaban di sini yang membuat saya belajar sesuatu yang baru.

Mutador
sumber
0

PHP 51 karakter

while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}

Test case ditulis dengan tangan panjang

$s = '78966';
while ($s != $r = str_replace([789, 67, 76], 7, $s) )
{
    $s = $r;
}
echo $s; // 7;

Ini melakukan perbandingan string dan string menggantikan keduanya dalam kondisi while. Jika sementara kondisi terpenuhi, itu memperbarui tangan kiri perbandingan dengan hasilnya. Beri tahu saya tentang perbaikan apa pun.

Angsa
sumber
0

Jolf , 15 byte

Coba di sini! Apakah saya benar-benar harus menjelaskan?

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
Conor O'Brien
sumber
0

PHP, 36 byte

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

solusi regex, mengambil $ a string dan menggantikannya melalui ekspresi.

daraeman
sumber
Parameter GET tidak dapat diterima sebagai metode input dalam PHP . Anda harus menjadikan fungsi ini dan meneruskan input sebagai parameter fungsi, atau mendapatkan input dari $argvatau STDIN.
Mego
@Mego Tampaknya tidak ada konsensus pada pos yang Anda tautkan.
user253751
@immibis Benar. Diperlukan konsensus untuk membuat metode I / O dapat diterima. Kurangnya satu berarti itu tidak dapat diterima.
Mego
TL; DR Anda memiliki kelemahan serius jika Anda menggunakan PHP untuk codegolf.
HamZa
0

Clojure, 71 byte

Clojure kurang ideal untuk bermain golf karena sifatnya yang verbose - tetapi tetap saja ini latihan yang menarik:

Versi golf, menggunakan Java interop:

(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))

Un-golfed version, menggunakan Java interop:

(defn six-fears-seven [s]
  (let [x (.replaceAll s "67|76|789" "7")]
    (if (= s x)
      s
      (recur x))))

Versi "pure Clojure" yang tidak golf:

(defn six-fears-seven [s]
  (let [x (clojure.string/replace s #"67|76|789" "7")]
    (if (= s x)
      s
      (recur x))))
Bob Jarvis
sumber
0

/// , 19 byte (tidak bersaing)

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

Anda tidak dapat benar-benar memberikan input dalam bahasa ini, sehingga input yang seharusnya berada di sebelah kanan kode.

Erik the Outgolfer
sumber
Perhatikan bahwa Itflabtijtslwi adalah garis miring tetapi dengan input.
FryAmTheEggman
@FryAmTheEggman Meskipun itu input karakter , bukan string .
Erik the Outgolfer
Tautan Anda tampaknya hilang satu tebasan.
Delioth
0

Python 3, 46 byte

import re
lambda s:re.sub(r'6*7(6|89)*','7',s)
Justin
sumber
0

Japt v2.0a0, 12 byte

e/6?7(6|89/7

Cobalah online!

Bagaimana itu bekerja

String.eadalah fungsi ganti rekursif. Japt 2 memiliki sintaks regex baru dan pelengkapan otomatis tanda kurung di dalam regex, yang menyimpan satu byte di sini. (Dalam Japt 1.x, kami harus memberikan string sebagai pengganti regex, yang agak kikuk.)

Bubbler
sumber
0

Dyalog APL , 17 byte

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

'6*sejumlah enam
7 diikuti oleh tujuh
(... )*' diikuti oleh nol atau lebih urutan ...
6|89 enam atau delapan sembilan

⎕RR eplace bahwa dengan

'7' tujuh

Adm
sumber
0

05AB1E , 12 byte

Δ67‚7:789¬:

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Δ               # 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)
Kevin Cruijssen
sumber