Gif - Jif, Jif - Gif


24

Викрадено з @Downgoat з дозволу

Суть цього виклику полягає у (не) врегулюванні дискусії щодо вимови "gif".

Gif проти Jif"


Вимова gif обговорюється, і хоча це повинно бути (і повинно бути) вимовленим jif , воно все ще часто спірне.

У цьому виклику вам нададуть набір слів, які мають g або j , що представляють звук, з яким слово вимовляється. Ви також отримаєте текст, в якому вам доведеться виправити неправильні написання gif .

Тому що це Інтернет та всі завжди помиляються. Виправити їх (не) загально люб’язно.

Прикладом неправильної вимови може бути:

Була обдарована миша, що їла буріто

Неправильне написання gif ? Неприпустимо! Це потрібно негайно виправити:

Був миг (як у банці) миші, що їсть буріто

Ми зробили? Ні, ти все ще помилився.

Ви завжди помиляєтесь

Це має працювати інакше:

У джифу кіт носив шапку кота

Цю очевидну помилку потрібно виправити, ми виправляємо це:

У gif (як на графіці) кіт носив шапку кота

Правила

  • Введення - це рядок (пропозиція) та масив рядків (або будь-яка розумна альтернатива, наприклад, розділена комою рядок) у будь-якому порядку
  • Ви можете приймати слова gта jслова в будь-якому порядку. Вони можуть прийматися окремо.
  • Кожен екземпляр 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
Формат обміну жирафами :)
Михайло V

3
(G мовчить.)
Девід Конрад

6
Це очевидно джиф, як у Йохана. Як і звукові пури.
Р ..

2
Спокусився знизити голос, оскільки вимовляється з ag, а НЕ AJ
Stan Strum

Відповіді:


6

Математика, 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який очікує, що перший аргумент #буде виправленням (in) речення, а другий аргументом #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
КалькуляторFeline

1
@CalculatorFeline Я на насправді вже скорочений Trueдо 1>0, просто не в моєму поясненні :)
ngenisis

Ви використовуєте повний індекс у гольф-коді. Чому б не там?
CalculatorFeline

1
@CalculatorFeline Я здогадуюсь, тому що в такому випадку я не цитував код, я описував, що він робив, а це було встановити змінну zрівну IgnoreCase->True. Я робив те саме пізніше: "що починається з f[x]". ¯\_(ツ)_/¯
ngenisis

5

Рубі , 88 87 91 байт

-1 байт від ETHproductions. +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)? (idk багато 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 як змінної є те, що ми також згодом використовуємо її як дикт / карту.

w[1:2]in ['i','I']перевіряє, що другий символ є або я, або я.: 2 необхідний, тому що просто введення w[1]призведе до аварії на 1-літерних словах, але фрагменти чомусь цього не роблять (я думав, що вони зробили, що б там не було!)

w[2:3]in ['f','F']є аналогом. У мене коротко було це лише 2: перш ніж я зрозумів, що мені потрібно рахувати gif, або jif, за яким слід пунктуація!

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 "+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.