Gif - Jif, Jif - Gif


24

Украдена у @Downgoat с разрешения

Смысл этой проблемы состоит в том, чтобы (не) урегулировать дискуссию о произношении «gif».

Gif против Jif"


Произношение gif обсуждается, и хотя оно должно быть (и должно быть) произносится как jif , оно все еще широко оспаривается.

В этом задании вам дадут набор слов, имеющих g или j , представляющих звук, которым произносится это слово. Вы также получите текст, в котором вы должны исправить неправильное написание GIF .

Потому что это интернет и все всегда неправы. Это (не) обычная вежливость, чтобы исправить их.

Пример неправильного произношения:

Был подарок мыши, которая ела буррито

Неправильное написание GIF ? Неприемлемо! Это должно быть исправлено немедленно:

Был джиф (как в банке) мыши, которая ела буррито

Мы все? Нет, ты все еще не прав.

Ты всегда неправ

Это должно работать по-другому:

В джифе кот носил шляпу кота

Это очевидное опечатка должна быть исправлена, мы исправим это так:

В гифке (как на рисунке) кот носил шляпу кота

правила

  • Ввод - это строка (предложение) и массив строк (или любая разумная альтернатива, такая как строка, разделенная запятыми) в любом порядке.
  • Вы можете взять gи jслова в любом порядке. Они могут быть взяты отдельно.
  • Каждый экземпляр gif(любого случая) в предложении должен быть заменен на jif (as in ___)где ___единообразно случайно выбранное слово, начинающееся с j массива строк, и наоборот для jifслов, начинающихся с g.
  • ТОЛЬКО слова gifи jifдолжны быть заменены (то есть "jiffy" не должен быть изменен). Эти слова не сделали ничего плохого.
  • Вам гарантировано, что хотя бы одно слово в массиве начинается с 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
Жирафический формат обмена :)
Михаил V

3
(The G молчит.)
Дэвид Конрад

6
Это очевидно джиф, как в Йохане. Как и звук, который делают фурри.
R ..

2
Соблазн понизить голос, потому что он произносится с ag, а не с AJ
Stan

Ответы:


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которая принимает буквы g,G , jи 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 Я на самом деле уже сокращенный Trueдо 1>0, просто не в моем объяснении :)
ngenisis

Вы используете полностью загаданный код зомби везде. Почему не там?
CalculatorFeline

1
@CalculatorFeline Я полагаю, потому что в этом случае я не цитировал код, я описывал, что он делал, а именно, устанавливал переменную zравной IgnoreCase->True. Я сделал то же самое позже: «который начинается с f[x]». ¯\_(ツ)_/¯
ngenisis

5

Рубин , 88 87 91 байт

-1 байт от ETHпродукции. +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

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 стоит запятая.
Майкл Богер

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-слов. ' '.joinобъединяет понимание списка сделано черезfor w in s.split() , поэтому для списка слов в s.

Средний бит - черная магия, которую я разрушу по кусочкам. Во- первых, условие: 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']проверяет, что вторым символом является либо я, либо я. Параметр: 2 необходим, потому что простое размещение w[1]приведет к падению однобуквенных слов, но срезы не делают этого по какой-то причине (я думал, что они сделали, что угодно!)

w[2:3]in ['f','F']аналогично. Я кратко назвал это всего лишь 2: прежде чем я понял, что мне нужно учитывать gif или jif, а затем пунктуацию!

w[3:]in",;!?."проверяет, что последующие символы являются пунктуацией Я признаю, что мой код не работает, если кто-то вставляет «GIF ?!» но я не могу быть идеальным Кто-то еще может принять вызов открытия кавычек перед GIF или JIF тоже.

False in(,,,)в основном большой NAND. На самом деле это тот же bytecount, что и разделение четырех элементов с 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 "+choice(g if w[0]in 'jJ'else j)+')'вставляет очевидный строковый литерал в начале и завершающие скобки, интересный бит здесь, choice(g if w[0]in 'jJ'else j)который случайным образом выбирает из gили j, в зависимости от того, w[0]находится ли в'jJ' . и я только что понял, что у меня это немного задом наперед, так что все исправлено, сделано.

Это был долгий день. choiceнаходится в randomмодуле, следовательно, импорт. Я думаю, что это все.


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

Принимает отдельные gи jсписки слов.


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 отдельно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.