Gif-Jif,Jif-Gif


24

经许可从@Downgoat失窃

这个挑战的重点是(不)解决有关“ gif”的发音的争论。

Gif vs.吉夫


gif的发音有争议,虽然应该(应该)发音 JIF,它仍然普遍争议。

在本次挑战中,您将获得一组带有gj的单词,代表该单词发音的声音。您还将得到一些文本,必须在其中纠正gif的不正确拼写。

因为这是互联网,每个人总是错的。改正(不常见)礼貌。

错误发音的一个例子是:

有只老鼠吃着卷饼的GIF

gif的拼写错误?不能接受!必须立即更正此问题:

有只老鼠在罐子里吃着墨西哥玉米煎饼

我们完了吗?不,你还是错的。

总是错的

这必须以另一种方式起作用:

JIF猫戴着一只猫的帽子

必须纠正这种明显的拼写错误,我们将其更正为:

gif中(如图所示),猫戴着猫的帽子

规则

  • 输入是任意顺序的字符串(句子)和字符串数组(或任何合理的选择,例如逗号分隔的字符串)
  • 您可以任意顺序使用gj词。它们可以单独使用。
  • 的每个实例gif中的句子(任何情况下)必须被替换jif (as in ___),其中___是均匀的随机选择的字与开始j 从字符串数组,反之亦然为jif与词语开头g
  • 只有一行字gif,并jif应及时更换(即“瞬间”不应该改变)。这些话没有错。
  • 您可以确保数组中的至少一个单词以开头,g并且至少一个以开头j
  • 大小写必须保留(例如GiF-> JiF)。
  • 您可以编写程序或函数
  • 适用标准漏洞
  • 我们需要(不)迅速解决辩论;以字节为单位的最短代码获胜

例子

输入和输出用单行分隔:

graphic, jar, jam, gram
I saw a jif of how to pronounce gif that showed gif is pronounced jif

I saw a gif (as in graphic) of how to pronounce jif (as in jar) that showed jif (as in jam) is pronounced gif (as in gram)


gravy, jeff
G is for gIf, h is for JiF, i is for gIF, j is for JIf

G is for jIf (as in jeff), h is for GiF (as in gravy), i is for jIF (as in jeff), j is for JIf (as in gravy)

joke, june, gorilla, great
Jiffy should not be treated as a GIF or JIF, like gifted.

Jiffy should not be treated as a JIF (as in june) or GIF (as in great), like gifted.

3
The pronunciation of gif is debated and while it's supposed to be (and should be) pronounced **gif,** it's still commonly disputed.FTFY;)
Draco18s

15
Giraffical交换格式:)
Mikhail V

3
(G保持沉默。)
David Conrad

6
显然,就像约翰一样。就像毛茸茸的声音一样。
R..17年

2
试图拒绝投票,因为它的发音是ag而不是AJ
Stan Strum

Answers:


6

Mathematica,164 165个字节

这是可憎的,但我希望有人分担我的痛苦。

StringReplace[f[f@"g"="j"]="g";f[f@"G"="J"]="G";z=IgnoreCase->1>0;#,x:"g"|"j"~~y:"if ":>{f@x,y,"(as in ",RandomChoice@StringCases[#2,f@x~~Except[","]..,z]}<>") ",z]&

Function期望第一个参数#是要(在)中纠正的句子,第二个参数#2是要用逗号分隔的字符串。

f[f@"g"="j"]="g";f[f@"G"="J"]="G"定义一个函数f这需要的字母gGj,和J他们适当的替代品。它比f@"g"="j";f@"j"="g";f@"G"="J";f@"J"="G"

我还将设置z为,IgnoreCase->True因为我将使用两次。

x:"g"|"j"~~y:"if "StringExpression匹配"gif ""jif "命名第一个字母x和最后三个字符的y。由于该选项z(也称为IgnoreCase->True)被传递给StringReplace,因此这些字母可以是大小写的任意组合。

然后,我将所有此类匹配项替换为

{f@x,y,"(as in ",RandomChoice@StringCases[#2,f@x~~Except[","]..,z]}<>") " 

RandomChoice@StringCases[#2,f@x~~Except[","]..,z]随机地选择一个字的第二个参数#2,其与开始f[x],因为该选项再次忽略的情况下z给出。


3
您为什么要为此使用Mathematica?哇。
尼尔

1
IgnoreCase->True=>IgnoreCase->1<2
CalculatorFeline

1
@CalculatorFeline我实际上已经缩写True1>0,只是在我的解释中没有:)
ngenisis

您在其他任何地方都使用完全高尔夫球化的代码片段。为什么不在那里?
CalculatorFeline

1
我猜@CalculatorFeline,因为在那种情况下,我没有引用代码,而是在描述它的作用,那就是将变量设置zIgnoreCase->True。后来我做了同样的事情:“以f[x]” 开头。¯\_(ツ)_/¯
ngenisis

5

Ruby88 87 91字节

ETHproductions的-1个字节。+4个字节,因为不应替换包含“ gif”或“ jif”的单词。-2字节,因为替换单词列表现在可以分开处理。

->s,g,j{s.gsub(/\b(g|j)if\b/i){$&.tr("GgJj","JjGg")+" (as in #{($1[/g/i]?j:g).sample})"}}

在线尝试!


6
你可以改变([gj])(g|j)?(很多Ruby,但我确实知道正则表达式)
ETHproductions'Jun

3

CJam,78个字节

l',%:A;lS%{_ela"gifjif"3/&{_V=_el:B'g=1W?Z*+V\t" (as in "A{V=elB=!},mR')}O?S}%

在线尝试!

要求替换字符列表用逗号分隔。


说明:

l',%                        e# read line of input and split at commas
    :A;                     e# store in var A and pop off the stack
       lS%{...}%            e# for each word in the next line of input so:

_ela"gifjif"3/&             e#   intersection of ["gif" "jif"] and [lowercase(word)]
               {...}O?      e#   if set it non-empty, run block below, otherwise do nothing (push empty string)
                      S     e#   push space

_V=                         e#     extract first char
   _el:B                    e#     duplicate to lowercase and store in var B
        'g=1W?Z*+           e#     convert g/G <=> j/J
                 V\t        e#     store back to word
" (as in "                  e#     push string
           A{V=elB=!},      e#     filter replacements by words starting with the same char (case insensitive)
                      mR    e#     select random element
                        ')  e#     push ')' char

在gif / jif后接逗号的示例中不起作用。
Michael Boger's

1

Python 3,237字节

lambda s,g,j:' '.join([(w if False in(w[0]in q,w[1:2]in['i','I'],w[2:3]in['f','F'],w[3:]in",;!?.")else q[w[0]]+w[1:3]+" (as in "+choice(g if w[0]in 'jJ'else j)+')'+w[3:])for w in s.split()])
from random import*
q=dict(zip("gGjJ","jJgG"))

在线尝试!

这是我所能做的最好的事情-也许是某种更快的方式(可能使用正则表达式),但是现在我的大脑开始痛了。

说明: q是一个简单的字典映射,希望很清楚。 s,g,j是输入字符串,g字列表和j字列表。 因此,将对s中的单词' '.join列表进行的列表理解结合在一起for w in s.split()

中间部分是黑魔法,我将对其进行细分。首先,条件:False in(w[0]in q,w[1:2]in['i','I'],w[2:3]in['f','F'],w[3:]in",;!.")

w[0]in q检查第一个字符是否在键q'g','G','j','J'。分离的原因q为变量是我们稍后还将其用作dict / map。

w[1:2]in ['i','I']检查第二个字符是i还是I。:2是必需的,因为仅放置w[1]将导致1个字母的单词崩溃,但是slice由于某些原因不会这样做(我认为他们做了,无论如何!)

w[2:3]in ['f','F']是类似的。我只是将其简短地描述为2:在意识到自己需要先考虑gif或jif之后再加上标点符号之前,我已经对此进行了简要介绍:2:

w[3:]in",;!?."检查后续字符是否为标点符号。我承认,如果有人输入“ gif ?!”,我的代码将不起作用。但是我不能完美。其他人也可以接受在gif或jif之前打开引号的挑战。

False in(,,,)基本上是一个大的NAND。实际上,它与用分隔四个项目and并交换参数的字节数相同,但是如果您必须将其扩展到第五版,它看起来会更酷并且效果更好and

w if表示如果条件列表中为False,我们将返回原样的单词-不符合我们的条件。 else,我们将其更改为:

q[w[0]]+w[1:3]+" (as in "+choice(g if w[0]in 'jJ'else j)+')'+w[3:]

好。 q[w[0]]正确替换第一个字母。 w[1:3]在i或I和f或F上添加w[3:]大头钉,在任何标点符号后添加大头钉。剩下as in子句。

" (as in "+choice(g if w[0]in 'jJ'else j)+')'放入明显的字符串字面量在开始和结尾括号,这里的有趣的一点是choice(g if w[0]in 'jJ'else j)它随机选gj,取决于如果w[0]'jJ'。我只是意识到我有这点倒退,所以在整个过程中都解决了。

这是漫长的一天。 choicerandom模块中,因此导入。我认为这就是一切。


0

JavaScript(ES6),142个字节

(s,g,j,r=l=>l[Math.random()*l.length|0])=>s.replace(/\b[gj]if\b/gi,w=>`GJgj`[l=`JGjg`.search(w[0])]+w.slice(1)+` (as in ${r([g,j,g,j][l])})`)

采取单独gj单词列表。


0

Javascript(ES6),151个字节

f=(s,g,j)=>s.replace(/\b(g|j)(if)\b/ig,(m,p,c)=>`${a=g,p=="j"?"g":p=="J"?"G":(a=j,p=="g"?"j":"J")}${c}(as in ${a[Math.floor(Math.random()*a.length)]})`)

我可能可以在三元部分上打更多的球,但我现在想不起来。而且,它分别取g和j字。

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.