为什么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
布拉德·吉尔伯特b2gills

19
@ThomasKwa哦,我明白了:Microsoft跳过了Windows 9,因为它们与谜语并存。;)
ETHproductions 2015年

43
为什么怕七个是五个?因为六七八。--Yoda
Jakuje 2015年

2
六个害怕七个,因为七个死了。
科纳·奥布赖恩

Answers:



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
Pierre Arlaud

12

Java,126 81 66 58字节

感谢@GamrCorps提供此代码的lambda版本!

感谢@ user902383指出了自动装箱技巧!

...对。

它实际上比我预期的要长-Java replaceAll()每次匹配用一次替换字符串中的项目,直到替换停止为止才重复。所以我不得不花哨的循环。

Lambda形式:

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

2
为什么不带lambda?将节省至少15个字节
GamrCorps,2015年

@GamrCorps不知道该怎么说-永远不要使用函数。
艾迪生·克伦普

1
接口而不是类的意义是什么?
eis

3
@eis接口消除了将main声明为public的需要,这提供了一点好处。请参阅:codegolf.stackexchange.com/a/64713/44713
Addison Crump

1
@ user902383你正在做的减少是通过改变.equals!=,这并没有做同样的事情。==(或!=)按对象十六进制位置进行比较,而不是按值进行比较。否则长度相同。while()是7个字节,for(;;)是7个字节。
Addison Crump 2015年


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]非捕获版本的(6|89)拼写与(?:6|89)Perl 5相同。这<[6|89]>是您编写[6|89]Perl 5 拼写的内容的方式)

用法:

$ 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,但是我认为这是重复的替代。如果the 6*和the [6|89]*不匹配,是什么阻止了infinitum的7替代7
Digital Trauma 2015年

2
@DigitalTrauma与之交换77然后从下一个位置重新开始,一直进行到结束。:g:global不的简称repeat 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

@Rob以前没有做太多解释,而是要采用系统的方法。
LegionMammal978

我只是在取笑,伙计:)
Rob

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

Ruby,27个字节

该解决方案来自于Brad Gilbert b2gills的评论。

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

Ruby,37个字节

(旧解决方案)

此解决方案使用这样一个事实,即您替换字符串的次数将永远不需要。

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

您可以使用chars而不是size.times节省一些字节。
门把手

Ruby是否没有用于正则表达式替换的全局标志,还是需要更多的字节才能启用?
布拉德·吉尔伯特b2gills

@ BradGilbertb2gills,在Ruby是像在AWK中:有单独sub()gsub()方法,以取代第一或全部。因此,全球性只增加了一个字符。
manatwork 2015年

1
@manatwork然后,我将这样编写::->s{s.gsub /6*7(6|89)*/,'7'},然后gsub完成所有循环工作。
布拉德·吉尔伯特b2gills 2015年

如果我理解正确的命令行标志的规则,你可以通过使用使其成为-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

利用:

  • 别人的正则表达式模式
  • -replace在PowerShell中默认情况下如何进行全局替换
  • 循环展开,它将通过将-regex运算符分别$args应用于所有元素而将运算符应用于数组,并且这里只有一个元素,因为只有一个脚本参数,因此可以正常工作,并且可以避免为element编制索引[0]

在实现全局替换之前,新颖性先前的尝试可以做到;74个字节使用字符串乘法构建“ -replace -replace -replace”链,其长度是字符串的长度的多少倍,然后eval()对其进行运算:

"'$($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

我自己没有尝试过这个问题,所以不确定是否是最好的方法,但是如果您想拆分和合并,请查看/and *。还要注意,当您习惯使用类似C的语言时,从堆栈的角度进行思考需要一些适应性。例如,{"789":I}{"76":I}?可以拉出要成为的任务"789""76"?:I,然后可以进一步打高尔夫球78976`3/?:I
彼得·泰勒

谢谢!但是,我不太理解如何使用您的第二个建议。
康拉德·克拉斯

抱歉,是我的错。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

,26字节

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

包括结尾的换行符。

在启动之前,将输入附加到程序中。
与图灵机类似,在终止时从程序状态中读取输出。
虽然确实有输出流,但是很难正确使用,因此我不确定这是否是可接受的输出方法)


我不这么认为。如果您有办法进行STDOUT,则必须这样做。抱歉!

是的,根据meta post,这是允许的。
geokavel 2015年

1

Bash,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)?bytes是用于extglob选项是否计入字节。

感谢@BinaryZebra指出extglob功能!


非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

这应该放在文件中,并使用例如调用./789.sh 65678989656

它利用参数扩展来循环搜索和替换。由于我不知道一种更有效地链接扩展的方法,因此我进行了一系列扩展来进行替换。


欢迎来到PPCG!
Mego

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

正则表达式解决方案,使用$ a字符串并通过表达式替换。


GET参数不能用作PHP中的输入方法。您将需要使其成为一个函数并将输入作为函数参数传递,或者从$argv或STDIN 获取输入。
Mego

@Mego您所链接的帖子似乎没有共识。
user253751

@immibis正确。为了使I / O方法可接受,需要达成共识。缺少一个意味着它是不可接受的。
Mego

TL; DR如果将PHP用于代码高尔夫,则有严重的劣势。
HamZa 2015年

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

Python 3,46个字节

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

0

Japt v2.0a0,12个字节

e/6?7(6|89/7

在线尝试!

这个怎么运作

String.e是递归替换功能。Japt 2具有新的regex语法和regex内的括号自动补全功能,在此处节省了一个字节。(在Japt 1.x中,我们不得不传递字符串来代替正则表达式,这有点笨拙。)


0

Dyalog APL,17个字节

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

'6*任意数量的6,
7 然后是7
()*' 随后是零个或多个序列,
6|89 即6或8到9

⎕R[R E放置与

'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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.