Gif - Jif, Jif - Gif

24

Skradzione z @Downgoat za pozwoleniem

Celem tego wyzwania jest (nie) rozstrzygnięcie debaty na temat wymowy „gif”.

Gif vs. Jif


Wymowa gif jest dyskutowana i chociaż powinna być (i powinna być) wymawiana jako jif , wciąż jest często kwestionowana.

W tym wyzwaniu otrzymasz zestaw słów, które mają g lub j , reprezentujących dźwięk, którym wymawia się to słowo. Otrzymasz również tekst, w którym musisz poprawić niepoprawną pisownię gif .

Ponieważ to jest internet i wszyscy zawsze się mylą. Ich (nie) powszechna uprzejmość polega na ich poprawianiu.

Przykładem złej wymowy jest:

Był tam gif myszy jedzącej burrito

Zła pisownia gif ? Gorszący! Należy to natychmiast poprawić:

Był tam wysięgnik (jak w słoiku) myszy jedzącej burrito

Skończyliśmy? Nie, nadal się mylisz.

Jesteś zawsze źle

To musi działać w drugą stronę:

W wysięgniku kot nosił kapelusz kota

Ten oczywisty błąd ortograficzny musi zostać naprawiony, poprawimy to, aby:

W gifie (jak w grafice) kot nosił kapelusz kota

Zasady

  • Dane wejściowe to ciąg (zdanie) i tablica ciągów (lub dowolna rozsądna alternatywa, taka jak ciąg rozdzielany przecinkami) w dowolnej kolejności
  • Możesz wziąć słowa gi jw dowolnej kolejności. Można je brać osobno.
  • Każde wystąpienie gif(dowolnego przypadku) w zdaniu musi zostać zastąpione przez jif (as in ___)gdzie ___jest jednolicie losowo wybrane słowo zaczynające się j od tablicy ciągów i odwrotnie w jifprzypadku słów rozpoczynających się odg .
  • TYLKO słowa gifi jifpowinny zostać zastąpione (tzn. „Jiffy” nie powinno być zmieniane). Te słowa nie zrobiły nic złego.
  • Masz gwarancję, że co najmniej jedno słowo w tablicy zaczyna się od, ga co najmniej jedno zaczyna się od j.
  • Sprawa musi zostać zachowana (np. GiF-> JiF).
  • Możesz napisać program lub funkcję
  • Obowiązują standardowe luki
  • Musimy (nie) szybko rozstrzygnąć debatę; najkrótszy kod w bajtach wygrywa

Przykłady

Wejścia i wyjścia oddzielone pojedynczym wierszem:

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.
Neil A.
źródło
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 Interchange Format :)
Michaił V
3
(G milczy.)
David Conrad
6
To oczywiście jif jak w Johan. Tak jak dźwięk furry.
R ..
2
Skusiłem się na głosowanie, ponieważ jest wymawiane z ag, a NIE AJ
Stan Strum

Odpowiedzi:

6

Mathematica, 164 165 bajtów

To obrzydliwość, ale chcę, żeby ktoś podzielił się moim bólem.

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]&

Functionktóry oczekuje, że pierwszy argument #będzie (in) poprawiony, a drugi argument #2będzie ciągiem znaków oddzielonych przecinkami.

f[f@"g"="j"]="g";f[f@"G"="J"]="G"definiuje funkcję f, która bierze litery g, G, joraz Jdo ich odpowiednich zamienników. Jest to zawsze nieco krótsze niż f@"g"="j";f@"j"="g";f@"G"="J";f@"J"="G".

Ustawiłem także na zrówny, IgnoreCase->Trueponieważ będę go używał dwa razy.

x:"g"|"j"~~y:"if "to taki, StringExpressionktóry pasuje "gif "lub "jif ", nazywając pierwszą literę xi ostatnie trzy znaki y. Ponieważ opcja z(znana również jako IgnoreCase->True) jest przekazywana do StringReplace, litery te mogą być w dowolnej kombinacji wielkich i małych liter.

Następnie zastępuję każdy taki mecz

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

RandomChoice@StringCases[#2,f@x~~Except[","]..,z]losowo wybiera słowo z drugiego argumentu, #2który zaczyna się od f[x], ponownie ignorując wielkość liter, ponieważ zpodano opcję .

ngenisis
źródło
3
Dlaczego miałbyś do tego używać Mathematica? Łał.
Neil A.
1
IgnoreCase->True=>IgnoreCase->1<2
CalculatorFeline
1
@CalculatorFeline I rzeczywiście już skrócona Truedo 1>0, po prostu nie w moim wyjaśnieniem :)
ngenisis
Wszędzie indziej używasz w pełni golfowych pakietów sinppet. Dlaczego nie tam
CalculatorFeline
1
@CalculatorFeline Chyba dlatego, że w tym przypadku nie cytowałem kodu, opisywałem, co on zrobił, czyli ustawić zmienną na zrówną IgnoreCase->True. Zrobiłem to samo później: „który zaczyna się od f[x]”. ¯\_(ツ)_/¯
ngenisis
5

Rubin , 88 87 91 bajtów

-1 bajt z produkcji ETH. +4 bajty, ponieważ słowa zawierające „gif” lub „jif” nie powinny być zamieniane. -2 bajty, ponieważ listy słów zastępczych można teraz traktować osobno.

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

Wypróbuj online!

Wartość tuszu
źródło
6
Czy możesz zmienić ([gj])na (g|j)? (bardzo dużo Ruby, ale znam regex)
ETHproductions
3

CJam , 78 bajtów

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

Wypróbuj online!

Wymaga oddzielenia listy zastępczych znaków przecinkami.


Wyjaśnienie:

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
Siguza
źródło
Nie działa na przykładzie, w którym po gif / jif występuje przecinek.
Michael Boger,
1

Python 3 , 237 bajtów

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"))

Wypróbuj online!

To najlepsze, co mogę zrobić - może to być jakiś sposób, aby zrobić to szybciej (prawdopodobnie z wyrażeniami regularnymi), ale mój mózg boli teraz.

Objaśnienie: qto proste mapowanie słownika, mam nadzieję, że jest jasne. s,g,jsą łańcuchem wejściowym, listą słów-słów i listą słów-słów. ' '.joinłączy ze sobą zrozumienie listy for w in s.split()dla całej listy słów w s.

Środkowy kawałek to czarna magia, którą podzielę na części. Pierwszy warunek: False in(w[0]in q,w[1:2]in['i','I'],w[2:3]in['f','F'],w[3:]in",;!.").

w[0]in qKontrole pierwszy znak jest w tonacjach q, które są 'g','G','j','J'. Powodem wyodrębnienia qjako zmiennej jest to, że później używamy go jako dict / map.

w[1:2]in ['i','I']sprawdza, czy drugim znakiem jest albo i, albo I. The: 2 jest konieczne, ponieważ samo wstawienie w[1]spowoduje awarię 1-literowych słów, ale plasterki z jakiegoś powodu tego nie robią (myślałem, że tak, cokolwiek!)

w[2:3]in ['f','F']jest analogiczny. Na krótko miałem to tylko 2: zanim zdałem sobie sprawę, że muszę wziąć pod uwagę gif lub jif, a następnie interpunkcję!

w[3:]in",;!?."sprawdza, czy kolejne znaki są interpunkcyjne. Przyznaję, że mój kod nie działa, jeśli ktoś wstawi „gif ?!” ale nie mogę być idealny. Ktoś inny może również podjąć wyzwanie otwarcia cytatów przed gif lub jif.

False in(,,,)jest w zasadzie dużym NAND. W rzeczywistości jest to ta sama liczba bajtów, co rozdzielenie czterech elementów za pomocą andi zamiana argumentów, ale wygląda to fajniej i działa lepiej, jeśli musisz rozszerzyć go na piątą andedycję.

w ifoznacza, że ​​jeśli False jest na liście warunkowej, zwracamy słowo bez zmian - nie spełnia ono naszych kryteriów. elsezmieniamy na:

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

DOBRZE. q[w[0]]poprawnie podstawia pierwszą literę. w[1:3]pinezki na i lub I oraz f lub F, w[3:]pinezki na dowolnej interpunkcji końcowej. To pozostawia jak w klauzuli.

" (as in "+choice(g if w[0]in 'jJ'else j)+')'wstawia oczywisty literał łańcuchowy na początku i końcowy nawias, interesujący jest tutaj fragment, choice(g if w[0]in 'jJ'else j)który losowo wybiera z glub j, w zależności od tego, czy w[0]jest w 'jJ'. i właśnie zdałem sobie sprawę, że miałem ten kawałek do tyłu, więc naprawiłem to przez cały czas.

To był długi dzień. choicejest w randommodule, stąd import. Myślę, że to wszystko.

Michael Boger
źródło
0

JavaScript (ES6), 142 bajty

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

Pobiera osobne gi jlisty słów.

Neil
źródło
0

JavaScript (ES6), 151 bajtów

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

Prawdopodobnie mogę bardziej zagrać w golfa w części trójskładnikowej, ale nie wiem, jak teraz. Ponadto bierze osobno słowa g i j.

SuperStormer
źródło