Potwierdź ciąg


371

W tym wyzwaniu musisz wziąć ciąg pasujący do wyrażenia regularnego ^[a-zA-Z]+$lub cokolwiek rozsądnego (nie musisz brać pod uwagę wielkich lub małych liter, jeśli chcesz) (możesz założyć, że ciąg jest wystarczająco długi i ma odpowiednią strukturę dla wszystkich operacji) i wypisuje kolejny ciąg, wygenerowany podobnie do słowa na końcu ostatniego tweeta dadaist przez POTUS ( "Despite the constant negative press covfefe").

Jak sprawdzić ciąg:

Najpierw zdobądź pierwszą grupę dźwiękową (wymyślona terminologia).

Jak Ty to robisz? Dobrze:

  • Znajdź pierwszą samogłoskę ( yjest także samogłoską)

      v
    creation
    
  • Znajdź potem pierwszą spółgłoskę

        v
    creation
    
  • Usuń resztę ciągu

    creat
    

To twoja pierwsza grupa dźwiękowa.

Następny krok:

Uzyskaj ostatnią spółgłoskę z grupy dźwiękowej

t

i zastąp go wersją dźwięczną lub bezdźwięczną. Aby to zrobić, znajdź literę w tej tabeli. Zamień na podaną literę (która może być tą samą literą)

b: p
c: g
d: t
f: v
g: k
h: h
j: j
k: g
l: l
m: m
n: n
p: b
q: q
r: r
s: z
t: d
v: f
w: w
x: x
z: s

więc rozumiemy

d

Następnie weź następną samogłoskę po tej spółgłosce. Możesz założyć, że ta spółgłoska nie znajduje się na końcu łańcucha. Połącz te dwa razem, a następnie powtórz to dwukrotnie:

didi

Połącz to z pierwszą grupą dźwiękową:

creatdidi

Zrobiłeś: ciąg jest kowariancjonowany i możesz go teraz wyprowadzić.

Przypadki testowe:

coverage: covfefe

example: exxaxa

programming: progkaka (the a is the first vowel after the g, even though it is not immediately after)
code: codtete

president: preszizi

To jest , dlatego prosimy o jak najkrótszy program!


7
„x” powinien technicznie odwzorować na „gz”. „qu” powinno odwzorować na „gw”.
Steve Bennett

2
To określa jedną koncepcję kowefifikacji, ale wciąż uważam, że odniesienie do pracy Douglasa Hofstadtera (i Melanie Mitchell) nad analogiami konwersji łańcuchów, np. W Fluid Concepts, wydaje się właściwe.
Mars

58
Odpowiedzi na ponad 140 znaków powinny zostać zdyskwalifikowane
Sandy Gifford

12
Niestety nie można tego zrobić w TrumpScript :(

4
@ThePlasmaRailgun To był żart, ponieważ tweety muszą mieć maksymalnie 140 znaków.
Esolanging Fruit

Odpowiedzi:


91

Galaretka ,  58  57 bajtów

<TḢị
e€Øyµ¬TĖEÐḟḢṪ;ç¥T
ḣÇḢ⁸ÇịµḢØYiị“ßȷ%Hẹrȧq’œ?ØY¤⁾cgy;ẋ2

Pełny program, który akceptuje listę małych liter i drukuje wynik.

Wypróbuj online!

W jaki sposób?

<TḢị - Link 1, extract first value from y not less than x: number, x; list of numbers, y
     -                                                     e.g. 5, [3,4,7]
<    - x less than vectorised across y                             [0,0,1]
 T   - truthy indices                                              [    3]
  Ḣ  - head                                                             3
   ị - index into y                                                     7

e€Øyµ¬TĖEÐḟḢṪ;ç¥T - Link 2, indices of the letters to manipulate: list of characters, w
  Øy              - vowel+ yield = "AEIOUYaeiouy"                 e.g.  "smouching" 
e€                - exists in for €ach letter in w                       001100100
    µ             - monadic chain separation, call that v
     ¬            - not vectorised across v                              110011011
      T           - truthy indices                                       12  56 89
       Ė          - enumerate                      [[1,1],[2,2],[3,5],[4,6],[5,8],[6,9]]
         Ðḟ       - filter discard if:
        E         -   elements are equal                       [[3,5],[4,6],[5,8],[6,9]]
           Ḣ      - head                                        [3,5]
            Ṫ     - tail                                           5
                T - truthy indices of v                                    34  7
               ¥  - last 2 links as a dyad
              ç   -   call last link (1) as a dyad                         7
             ;    -   concatenate                                     5,7
                  -                                    ...i.e the indexes of 'c' and 'i'

ḣÇḢ⁸ÇịµḢØYiị“ßȷ%Hẹrȧq’œ?ØY¤⁾cgy;ẋ2 - Main link: list of characters, w
                                   -                             e.g.  "smouching"
 Ç                                 - call the last link (2) as a monad    [5,7]
ḣ                                  - head to index (vectorises)      ["smouc","smouchi"]
  Ḣ                                - head                             "smouc"
                                   -   implicit print due to below leading constant chain
   ⁸                               - link's left argument, w
    Ç                              - call the last link (2) as a monad    [5,7]
     ị                             - index into w                         "ci"
      µ                            - monadic chain separation, call that p
       Ḣ                           - head p                               'c'
        ØY                         - consonant- yield = "BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"
          i                        - first index                          22
                          ¤        - nilad followed by link(s) as a nilad:
            “ßȷ%Hẹrȧq’             -   base 250 number = 1349402632272870364
                        ØY         -   consonant- yield = "BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"
                      œ?           -   nth permutation  = "BCDFGHJKLMNPQRSTVWXZpctvkhjglmnbqrzdfwxs"
           ị                       - index into         (special case ->) 'c'
                           ⁾cg     - literal ['c','g']
                              y    - translate (change 'c's to 'g's)      'g'
                               ;   - concatenate with the headed p        "gi"
                                ẋ2 - repeat list twice                    "gigi"
                                   - implicit print ...along with earlier = smoucgigi

13
To niesamowite ...
Klangen

Niesamowita praca.
JF it

9
Jestem galaretką. Pozytywne.
DeepS1X

6
To najdziwniejszy język programowania, jaki kiedykolwiek widziałem.
Ryan

@ Ryan jest przeznaczony do gry w golfa.
Esolanging Fruit 17.07.17

61

JavaScript (ES6), 107 103 bajtów

Zaoszczędzono 4 bajty dzięki GOTO 0

s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)

Przypadki testowe


6
Możesz zapisać kilka takich bajtów:s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)
GOTO 0

@ GOTO0 Dzięki, zaktualizowano.
Arnauld

49

Galaretka , 45 39 bajtów

Øa“œṣ$b|0Ḃ’ṃ,Ṛ$yṫµfØyḢṭḢẋ2
e€ØyIi-‘ɓḣ;ç

Wypróbuj online!

Jak to działa

e€ØyIi-‘ɓḣ;ç                Main link. Argument: s (string)

  Øy                        Vowels with y; yield "AEIOUYaeiouy".
e€                          Test each character in s for membership.
    I                       Increments; compute the forward differences of the
                            resulting array of Booleans.
     i-                     Find the first index of -1.
       ‘                    Increment this index to find the index of the first
                            consonant that follows a vowel.
                            Let's call this index j.
        ɓ                   Begin a new chain. Left argument: s. Right argument: j
         ḣ                  Head; yield the first j characters of s.
           ç                Call the helper link with arguments s and j.
          ;                 Concatenate the results to both sides.
Øa“œṣ$b|0Ḃ’ṃ,Ṛ$yṫµfØyḢṭḢẋ2  Helper link. Left argument: s. Right argument: j

Øa                          Alphabet; set the return value to “abc...xyz”.
  “œṣ$b|0Ḃ’                 Yield 7787255460949942. This is a numeric literal in
                            bijective base 250. The value of each digit matches its
                            1-based index in Jelly's code page.
           ṃ                Convert 7787255460949942 to base 26, using the digts
                            a = 0, b = 1, ..., z = 25.
                            This yields "bcdfkszgvtgp".
            ,Ṛ$             Pair the result with its reverse, yielding
                            ["bcdfkszgvtgp", "pgtvgzskfdcb"].
                ṫ           Call tail with arguments s and j, yielding the j-th and
                            all following characters of s.
               y            Translate the result to the right according to the
                            mapping to the left, i.e., replace 'b' with 'p', 'c'
                            with 'g', etc. 'g' appears twice in the first string
                            of the mapping; only the first occurrence counts.
                            Let's call the resulting string r.
                 µ          Begin a new chain. Argument: r
                  fØy       Filter; remove non-vowels from r.
                     Ḣ      Head; take the first vowel.
                       Ḣ    Head; take the first character/consonant of r.
                      ṭ     Tack; append vowel to the consonant.
                        ẋ2  Repeat the resulting string twice.

4
przepraszam, kolego, wygląda na to, że przegapiłeś mega galaretkę
Destructible Lemon

odpowiedź wygląda na zbyt uproszczoną, ale jest naprawdę cudowna ... prosta jest piękna
Erik the Outgolfer

31

CJam , 59 58 57 56 bajtów

q_{"aeiouy":V&,_T|:T^}#)/(_W>"cbdfkszgvtpg"_W%er@sV&0=+_

Wypróbuj online!

Wyjaśnienie

q_                   e# Read the input and copy it.
{                    e# Find the index of the first char for which the following is true:
 "aeiouy":V          e#  Push "aeiouy" and store it in V.
 &,                  e#  Check if the current char is in the vowel string (0 or 1).
 _T|:T               e#  Copy the result and OR with T (T is initially 0), storing back in T.
 ^                   e#  XOR with the original result. This will be 1 for the first 
                     e#  consonant appearing after a vowel.
}#                   e# (end find)
)/                   e# Increment the index and split the string into chunks of that size.
(                    e# Pull out the first chunk.
_W>                  e# Copy it and get the last character (the consonant).
"cbdfkszgvtpg"_W%er  e# Transliterate the consonant to voiced/voiceless alternative.
@s                   e# Bring all the other split chunks to the top and join them together.
V&0=                 e# First char of the set intersection of that and the vowels.
                     e# (i.e. the first vowel in the second half)
+                    e# Concatenate the new consonant and the vowel.
_                    e# Duplicate the result of that.
                     e# Implicit output of stack contents.

2
CJam pokonuje Jelly? : O (Przynajmniej bije galaretową odpowiedź, która wydaje się być pozytywna).
Esolanging Fruit

29

C, 219 213 206 179 175 bajtów

#define p putchar
#define q(a)for(;a strchr("aeiouy",*s);p(*s++));
f(s,c,h)char*s;{q(!)q()p(*s);p(c="pgt vkh jglmn bqrzd fwx s"[*s-98]);p(h=s[strcspn(s,"aeiouy")]);p(c);p(h);}

Wypróbuj online!


Czy * p = putchar działa jako pierwsza linia?
k_g

4
Przepraszamy za dyskwalifikację. Nie można zmieścić w tweecie.
caird coinheringaahing

@cairdcoinheringaahing you sir są niepoprawne (wiem, że było 140, kiedy to napisałeś)
Stan Strum


1
Około 12 bajtów można zgolić, zastępując #defines i funkcję flagami preprocesora ( -D...).


18

PHP, 121 bajtów

$v=aeiouy;preg_match("#(.*?[$v]+([^$v])).*?([$v])#",$argn,$t);echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z;

Wypróbuj online!


3
-2 bajty:echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z;
Titus

@Titus Nie myślałem o tym. Dziękuję
Jörg Hülsermann

dlaczego nie zmienić nazwy $argnna coś krótszego? $a, na przykład - to -3 bajty
Tyler Sebastian

@TylerSebastian Muszę mieć zmienną wejściową, która istnieje. Tak, mogę utworzyć funkcję, ale jeśli to zrobię, zwiększy to liczbę bajtów bardziej, jak wykorzystują trzy bajty
Jörg Hülsermann

ah ok przepraszam, zapomniałem, jak PHP robi argumenty wiersza poleceń - właśnie zobaczyłem, że zdefiniowałeś go w sekcji nagłówka, ale nie zdawałem sobie sprawy, że to zmienna zarezerwowana.
Tyler Sebastian,

15

Pyth, 54 bajty

L+hb?>F}RJ"aeiouy"<b2+hKtb*2+XhK"cgdsfbpvztkg")h@JKytb

Definiuje funkcję y, która oczekuje łańcucha. Wypróbuj online: pakiet testowy


14

Python 3, 155 139 bajtów

import re
def f(x,k='aeiouy])'):b,c,v=re.findall(f'(.*?[{k}([^{k}.*?([{k}',x)[0];return b+c+(('bcdfgkpstvz'+c)['pgtvkgbzdfs'.find(c)]+v)*2

usunięto 16 bajtów dzięki @ovs

usunął 1 bajt dzięki Gáborowi Fekete


2
Możesz stworzyć zmienną, która ma wartość 'aeiouy]', być może zaoszczędzi to trochę bajtów. Możesz także usunąć niektóre znaki z ciągów zastępujących, ponieważ są one takie same.
Gábor Fekete

2
Nie mogę usunąć identycznych znaków z ciągu zastępującego, ponieważ byłoby to IndexError, a zapisywanie aeiouy])nie zapisuje żadnych bajtów.
L3viathan

2
jeśli wyciągniesz coś takiego s='aeiouy])', możesz użyć b,c,v=re.findall('(.*?[%s([^%s.*?([%s'%(s,s,s). Nie jest krótszy, ale może prowadzić do ogólnego skrócenia.
Jeremy Weirich


3
Użycie f-stringów pozwoli zaoszczędzić 1 bajt: k='aeiouy])'orazf'(.*?[{k}([^{k}.*?([{k}'
Gábor Fekete

14

Java 8, 243 236 222 bajtów

s->{String q="[a-z&&[^aeiouy]]",a=s.replaceAll("(^"+q+"*[aeiouy]+"+q+").*","$1"),b="pgtvkhjglmnbqrzdfwxs".charAt("bcdfghjklmnpqrstvwxz".indexOf(a.charAt(a.length()-1)))+s.replaceAll(a+q+"*([aeiouy]).*","$1");return a+b+b;}

Używa .replaceAllwyrażeń regularnych z grupami przechwytywania, aby odfiltrować części, których nie chcemy.

Wyjaśnienie:

Wypróbuj tutaj.

s->{ // Method with String parameter and String return-type
  // Temp String we use multiple times:
  String q="[a-z&&[^aeiouy]]",
   // Regex to get the first part (i.e. `creation` -> `creat` / `example` -> `ex`)
   a=s.replaceAll("(^"+q+"*[aeiouy]+"+q+").*","$1"), 
   // Get the trailing consonant and convert it
   b="pgtvkhjglmnbqrzdfwxs".charAt("bcdfghjklmnpqrstvwxz".indexOf(a.charAt(a.length()-1)))
   // Get the next vowel after the previous consonant from the input-String
    +s.replaceAll(a+q+"*([aeiouy]).*","$1");
  // Return the result:
  return a+b+b;
} // End of method

13

Haskell , 143 141 138 137 136 136 bajtów

z h=elem h"aeiouy"
f i|(s,(m,c:x))<-span z<$>break z i,j:_<-filter z x,d<-"pgt.vkh.jglmn.bqrzd.fwx.s"!!(fromEnum c-98)=s++m++[c,d,j,d,j]

Wypróbuj online!


1
Niesamowite! Zastąpienie nxgo jedną literą pozwoli zaoszczędzić 2 bajty.
tomsmeding

deklarowanie zpoza fi przełączanie się na strażników zamiast letoszczędza kolejne dwa bajty: Wypróbuj online!
Laikoni

2
I jeszcze dwa, łącząc się (s,v)<-break z i,(m,c:x)<-span z vw (s,(m,c:x))<-span z<$>break z i.
Laikoni

Mógłbym ogolić się jeszcze raz, umieszczając nawias otwierający obok let, dzięki!
bartavelle,

@Laikoni Nie rozumiem części dotyczącej zwyprowadzki f?
bartavelle

10

Python, 261 260 bajtów

def c(s,t='bpcgdtfvgksz'):
 q,r,t='aeiouy',range(len(s)),t+t[::-1]
 c=[i for i in r if i>[j for j in r if s[j]in q][0]and s[i]not in q][0]
 C=([t[2*i+1]for i in range(12)if s[c]==t[i*2]]or s[c])[0]
 return s[:c+1]+(C+s[[i for i in r if i>c and s[i]in q][0]])*2

Nie regex, nie ezoteryczne rozwiązanie. Zajęło mi to około 20 minut i godzinę więcej na grę w golfa.

Prawdopodobnie ma więcej list do zrozumienia niż cała standardowa biblioteka Pythona, głównie dlatego, że nie znam regex ...

Wypróbuj online! (Z walizkami testowymi)


8

Rubinowy , 90 bajtów

->x{x[/(.*?#{$v='[aeiouy]'}+.).*?(#$v)/];$1+($1[-1].tr('bcdfgkpstvz','pgtvkgbzdfs')+$2)*2}

Wypróbuj online!

Nie znając tego trochę, mamy coś równoważnego do:

def covfefefify(x)
  v = '[aeiouy]'
  # Match x to a regular expression capturing:
  # Group 1:
  #  some characters (non-greedy)
  #  followed by some (greedy) non-zero number of vowels
  #  followed by exactly one character
  # Ungrouped:
  #  Some more (non-greedy) characters
  # Group 2
  #  Exactly one other vowel
  # By switching between greedy and non-greedy matches, we can capture longest and shortest vowel/consonant sequences without writing out all the consonants
  x[/(.*?#{v}+.).*?(#{v})/]
  # Glue it back together, replace the necessary consonants, duplicate where needed
  $1+($1[-1].tr('bcdfgkpstvz','pgtvkgbzdfs')+$2)*2
end

8

Python 2, 251 246 245 239 237 234 229 211 bajtów

Pierwsze zgłoszenie tutaj.

def f(s):
  r=c='';n=0;w='aeiouy';a='bcdfghjklmnpqrstvwxz'
  for i in s:
    if n<2:r+=i
    if n<1and i in w:n=1
    if n==1and i in a:c='pgtvkhjglmnbqrzdfwxs'[a.index(i)];n=2
    if n==2and i in w:r+=c+i+c+i;break
  return r

Wypróbuj online!

Inni golfiści, którzy pomogli mi:

 Destructible Lemon / Wheat Wizard - 5 bytes
 Hubert Grzeskowiak - 1 byte
 musicman523 - 16 bytes

2
Witamy na stronie! Widzę, że próbowałeś użyć zakładek do wcięcia. Jeśli zastąpisz każdą kartę pojedynczym odstępem, jest ona funkcjonalnie identyczna i faktycznie wyświetla się poprawnie zamiast jako dodatkowe bajty
Destructible Lemon

4
Podczas gdy to, co powiedziała Destructible Lemon, jest poprawne, możesz zaoszczędzić jeszcze więcej bajtów w swoim źródle, wcinając pierwszy poziom kodu za pomocą pojedynczej spacji i drugi poziom za pomocą jednej tabulacji, spowoduje to, że będzie trochę trudny do wyświetlenia, ale będzie zaoszczędzić 5 bajtów.
Sriotchilism O'Zaic

1
Czy średnik na końcu wiersza 4 jest konieczny?
Hubert Grzeskowiak

1
@WaitndSee Myślę, że możesz skrócić niektóre ze swoich warunków. Po pierwsze: można zmienić not n, aby n<1na 2 bajty, ponieważ wiesz, że nnigdy nie będzie ujemny. Możesz także zmienić n==3na, n>2ponieważ wiesz, nże nigdy nie będzie większy niż 3. Można również użyć sztuczek Pythona do warunkowych skrócić pierwszy i przedostatni nawet dalej: n=[n,1][i in w and n<1]; r+=[0,r][n<2]
musicman523

1
Możesz zmienić r,v,c=('',)*3na r=v=c='', ponieważ ciągi są niezmienne. Próbowałem wielu innych sprytnych sztuczek, ale frustrujące są one tak długo. Warto też dodać Wypróbuj online! link do twojego postu
musicman523

7

Rubin , 175 141 110 bajtów

->s{s=~/(.*?#{v='[aeiouy]'}+(#{c='[^aeiouy]'}))#{c}*(#{v})/;"#$1#{($2.tr('bcdfgkpstvz','pgtvkgbzdfs')+$3)*2}"}

Wypróbuj online!

Nie golfił

covfefify = -> (s) {
    from = 'bcdfgkpstvz'
    to   = 'pgtvkgbzdfs'

    vowels = "[aeiouy]"
    consonants = "[^aeiouy]"

    s.match(/(.*?#{vowels}+(#{consonants}))#{consonants}*(#{vowels})/)
    d = ($2.tr(from, to) + $3) * 2
    "#$1#{d}"
}

4
-34 bajty zHash[*"bpcgdtfvgkkgpbsztdvfzs".chars]
Eric Duminil

1
Ponieważ wydaje się, że wprowadzanie c=[^aeiou]obejmuje wszystkie znaki alfabetyczne, jest ono krótsze. Mają pierwszą interpolacja dla każdej zmiennej przypisać go jednocześnie do -2 bajtów: /^(.*?${v='[aeiou]'}+(#{c='[^aeiou]})).../. Wreszcie $2.tr("b-z","pgtevkhijgl-obqrzdufwxys")zamiast rozwiązania Hash.
Wartość tuszu

Można zapisać 14 bajtów za pomocą podwyrażeń ( \g<n>) zamiast interpolacji, plus kolejne 14 za pomocą @ ValueInk za [^aeiou]sugestię: s=~/^(.*?([aeiouy])+([^aeiou]))\g<3>*(\g<2>)/.
Jordania

W rzeczywistości jest to błąd związany z programming-> progkaka, którego nie mogę do końca zrozumieć.
Jordania

@Jordan niestety wywołanie podwyrażenia \g<3>aktualizuje wartość 3 USD, więc nie możemy użyć tego skrótu.
sudee

6

Kryształ, 203 194 187 186 184 163 bajtów

o=""
ARGV[v=c=0].each_char{|a|r=/#{a}/
"aeiouy"=~r&&(v=x=1)||(c=v)
o+=a if c<2||x
c>0&&(x&&break||(o+=(i="pgtvkgbqrzdfs"=~r)?"bcdfgkpqrstvz"[i]: a))}
p o+o[-2..-1]

Myślę, że możesz stracić pareny wokół c=vio+=<...>
Cyoce

5

MATLAB / Octave - 159 158 bajtów

Poniższe prace zakładają, że ciąg wejściowy składa się z małych liter.

a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]

Wyjaśnienie

  1. a = input('','s');: Pobiera ciąg ze STDIN i przechowuje go w zmiennej a.
  2. m=ismember(a,'aeiouy');: Zwraca tablicę boolowską o tym samym rozmiarze, co ciąg aokreślający położenie samogłosek
  3. s='pgt vkh jglmn bqrzd fwx s';covfefeOdwzorowanie spółgłosek jako ciąg znaków. Ten ciąg ma 25 znaków i pomija samogłoski. Pierwsza pozycja, w której 'a'ma być samogłoska, jest usuwana, podczas gdy inne pozycje, w których znajdują się samogłoski, są zastępowane znakiem spacji. Dzieje się tak dlatego, że kiedy określimy pierwszą spółgłoskę występującą po samogłosce, przekonwertujemy spółgłoskę na pozycję umożliwiającą dostęp do znaku w tym ciągu w celu ustalenia pierwszego składnika przekształconego słowa.
  4. m(1:find(m,1))=1: Ustawia pierwszą pozycję tablicy boolowskiej do miejsca, w którym znaleźliśmy pierwszą samogłoskę, tak jak wszystkie samogłoski. Stanie się tak, że gdy będziemy szukać następnej spółgłoski następującej po pierwszej samogłosce, zignorujemy te znaki.
  5. i=find(~m,1);: Znajduje pierwszą pozycję łańcucha, który jest spółgłoską po pierwszej samogłosce.
  6. f=a(1:i): Usuwa ciąg po pierwszej spółgłosce następującej po samogłosce. Po prostu próbkujemy od pierwszej pozycji ciągu do tego momentu.
  7. d=s(f(end)-97);: Weź ostatni znak ciągu, który pozostaje, i znajdzie miejsce, w którym musimy pobrać próbkę z ciągu wyszukiwania i pobierze ten znak. Odejmowanie znaku i liczby w MATLAB lub Octave łączy się, tworząc liczbę całkowitą, przekształcając znak w kod ASCII. W tym przypadku odejmujemy ostatni znak od znaku na początku alfabetu, aby dać nam pozycję względem początku. Jednak zamiast odejmować przez b(98), odejmujemy przez, aponieważ MATLAB rozpoczyna indeksowanie o 1 zamiast 0. 'a'Kod ASCII wynosi 97.
  8. m(1:i)=0;: Bierze maskę logiczną i ustawia wszystkie znaki w ciągu wejściowym od pierwszej pozycji do pierwszej spółgłoski po samogłosce na false.
  9. v=a(find(m,1));: Znajduje następną samogłoskę, która następuje po pierwszej spółgłosce z ciągu wejściowego.
  10. [f d v d v]: Wypisz nasz covfefeied string.

Przykład działa

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
coverage

ans =

covfefe

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
example

ans =

exxaxa

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
programming

ans =

progkaka

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
code

ans =

codtete

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
president

ans =

preszizi

Wypróbuj online!

http://www.tutorialspoint.com/execute_octave_online.php?PID=0Bw_CjBb95KQMdjROYVR0aFNrWXM

Po naciśnięciu przycisku Wykonaj u góry poczekaj chwilę, a następnie wprowadź żądany ciąg. Wprowadź ciąg powoli, ponieważ wydaje się, że występuje opóźnienie podczas wprowadzania tekstu.


5

Clojure, 182 156 znaków

#(let[v #{\a\e\i\o\u\y}p(partition-by v %)[s m[c][n]](if(v(first %))(cons[]p)p)z[(or((zipmap"bcdfgkpstvz""pgtvkgbzdfs")c)c)n]](apply str(concat s m[c]z z)))

Jak to działa

(partition-by v "president")

Zwraca sekwencję ((\p \r) (\e) (\s) (\i) (\d) (\e) (\n \t))

[s m [c] [n]] (if (v (first x)) (cons [] p) p)

Destructures Seq w s=(\p \r), m=(\e), c=\s, n=\i.

Lub „przykład” To s=[], m=(\e), c=\x, n=\a.

(apply str (concat s m [c] [(l c) n] [(l c) n]))

Zwraca ciąg wyjściowy, łącząc elementy razem i łącząc je w łańcuch.

A potem po prostu usunąłem tyle białych znaków, ile mogłem, wciąż kompilując.

Odblokowane:

(defn covfefify [x]
  (let [vowel? #{\a\e\i\o\u\y}
        parts (partition-by vowel? x)
        [start mid [consonant] [last-vowel]] (if (vowel? (first x)) (cons [] parts) parts)
        lookup #(or ((zipmap "bcdfgkpstvz" "pgtvkgbzdfs") %) %)]
    (apply str (concat start mid [consonant] [(lookup consonant) last-vowel] [(lookup consonant) last-vowel]))))

Witamy w PPCG i świetna pierwsza odpowiedź! Mamy nadzieję, że zostaniesz i będziesz się dobrze bawić, biorąc udział w kolejnych wyzwaniach. :-)
ETHproductions

Jeśli definiujesz funkcję, jej nazwa powinna być możliwie jak najkrótsza. Możesz cna przykład wywołać funkcję główną . (Zezwalamy również na funkcje anonimowe, które w wielu językach są krótsze; nie jestem pewien, czy są one w Clojure). Widzę, że wprowadziłeś już taką poprawę we wnętrzu swojego kodu, więc prawdopodobnie nie trzeba tu wiele zmieniać.

5

R, 341 znaków

f=function(x){g=function(x,y)el(strsplit(x,y));a=g(x,'');v=g('aeiouy','');n=letters[-c(1,5,9,15,21,25)];l=data.frame(n,g('pgtvkhjglmnbqrzdfwxs',''));y=min(match(n,a)[which(match(n,a)>min(match(v,a),na.rm=T))]);m=l[which(l$n==a[y]),2];e<-a[-c(1:y)][min(match(v,a[-c(1:y)]),na.rm=T)];paste0(paste0(a[c(1:y)],collapse=''),m,e,m,e,collapse="")}

Horrendous R próba, dlaczego struny są takie trudne

Wersja do odczytu:

f = function(x) {
  g = function(x, y)el(strsplit(x, y))
  a = g(x, '')
  v = g('aeiouy', '')
  n = letters[-c(1, 5, 9, 15, 21, 25)]
  l = data.frame(n, g('pgtvkhjglmnbqrzdfwxs', ''))
  y = min(match(n, a)[which(match(n, a) > min(match(v, a), na.rm = T))])
  m = l[which(l$n == a[y]), 2]
  e <-a[-c(1:y)][min(match(v, a[-c(1:y)]), na.rm = T)]
  paste0(paste0(a[c(1:y)], collapse = ''), m, e, m, e, collapse = "")
}

Wierzę, że twoje obliczenia są wyłączone - liczę 340 bajtów
Taylor Scott


4

BlitzMax, 190 bajtów

s$=Input()For i=1To s.Length
f="aeiouy".Contains(s[i-1..i])If f v=i If c Exit
If v And c|f=0c=i
Next
t$="bpdtfvgkcgsz"x$=s[c-1..c]r=t.Find(x)~1If r>=0x=t[r..r+1]
x:+s[v-1..v]Print s[..c]+x+x

Pobiera słowo ze standardowego wejścia i wypisuje wynik na standardowe wyjście. Zakłada się, że słowo wejściowe jest pisane małymi literami i zawiera co najmniej jedną samogłoskę, po której następuje spółgłoska.

Bardziej czytelna wersja programu z formatowaniem i deklaracjami zmiennych:

SuperStrict
Framework BRL.StandardIO

Local s:String = Input()
Local v:Int
Local c:Int

For Local i:Int = 1 To s.Length
    Local f:Int = "aeiouy".Contains(s[i - 1..i])
    If f Then
        v = i
        If c Then Exit
    End If
    If v And c | f = 0 Then c = i
Next

Local t:String = "bpdtfvgkcgsz"
Local x:String = s[c-1..c]
Local r:Int = t.Find(x) ~ 1
If r >= 0 Then x = t[r..r + 1]
x :+ s[v - 1..v]
Print s[..c] + x + x

Jak to działa:

BlitzMax nie ma wbudowanej funkcji wyrażenia regularnego lub podobnego, więc pętla służy do iteracji znaków słowa wejściowego, dopóki nie znajdzie samogłoski, po której następuje łańcuch co najmniej jednej spółgłoski. Zmienna c przechowuje pozycję ostatniej z tych spółgłosek, v pozycji samogłoski. Pętla nadal sprawdza, czy po łańcuchu znajduje się kolejna samogłoska, a jeśli tak, v jest odpowiednio aktualizowana. Następnie spółgłoskę w c wyszukuje się w ciągu „bpdtfvgkcgsz”, który działa jak tabela zastępcza. Jeśli spółgłoska znajduje się w tabeli w dowolnej pozycji, wówczas pozycja ta jest edytorem XOR z 1, a znak w pozycji wynikowej zostaje użyty jako zamiennik. Operacja XOR zmienia 0 na 1, 2 na 3, 4 na 5 itd. I odwrotnie, tak że b zostaje zamienione na p, dzt i tak dalej. Wreszcie oryginalny ciąg do c,

Przykładowe wyniki:

zasięg covfefe

tworzenie creatdidi

programowanie progkaka

głupota stupbibi

bla blahaha


link do repozytorium blitzmax?
Zniszczalna Lemon

@DestructibleLemon BlitzMax został stworzony jako język głównie dla amatorskiego rozwoju gier oraz z zastrzeżonym kompilatorem sprzedawanym za pieniądze. Chociaż jest teraz bezpłatny i dostępny tutaj , uważam, że kompilator nadal nie jest oprogramowaniem typu open source. Istnieje alternatywna implementacja ( tutaj repozytorium , kompilacja tutaj ), która jednak będzie uruchamiać tylko nieogoloną wersję powyższego kodu ze względu na brak ustawienia „nie ścisłego”, które pozwala pominąć deklaracje zmiennych.
FireballStarfish

Sprytne użycie XOR-a na indeksie - prawdopodobnie kiedyś go użyję. Dziękuję Ci.
AI Breveleri

4

Perl, 71 bajtów

s#[aeiouy]+(.)\K.*?([aeiouy]).*#"$1$2"=~y/bcdfgkpstvz/pgtvkgbzdfs/rx2#e

Uruchom także z perl -pe. Kilka bajtów mniej niż poprzednie rozwiązanie Perla. Trzeba też przyznać, że stamtąd czerpałem inspirację.


4

05AB1E , 101 104 88 bajtów

-16 bajtów dzięki Okx

Mam nadzieję, że w jakiś sposób można to zrobić sposób bardziej efektywny.

žOÃćIsk>[DIs£¤žPså#\>]s[DIsèDžOså#\>]ŠŠ"bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs"S2ôDí«ø`Šs¤sŠksŠèsŠì2׫

Wypróbuj online!

Wyjaśnienie

                  Argument: s
žOÃ0èk            Get index of first vowel in s
>[DIs£¤žPså#\>]   Increment index and split s until last character of substring is a consonant
s[DIsèDžOså#\>]   Increment index an get character at index in s until character is a vowel
ŠŠ                Rearrange stack
.•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•S2ôDí«ø`   Prepare character substitution map
Šs                Rearrange stack
¤                 Last character of substring
sŠ                Rearrange stack (yes, again)
k                 Index of last character in substitution key list
sŠ                Rearrange stack (it won't stop)
è                 Character at index in character substitution value list
sŠ                Rearrange stack (ONE LAST TIME)
ì2׫              Prepend substitution consonant before vowel, duplcicate and concatenate with the substring from the very beginning

Można wymienić "bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs"z .•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•zaoszczędzić 15 bajtów
Okx

Można również wymienić žOÃćIsksię žOÃ0èkzapisać kolejny bajt.
Okx,

@Okx Myślę, że naprawdę muszę się nauczyć kilku technik kompresji String. Dzięki!
kalsowerus

@kalsowerus Wiem, że minęło trochę czasu, ale możesz odegrać 8 bajtów z odpowiedzi w ten sposób: žOÃнk>[DIs£¤žPså#\>]©s[DIsèDžOså#\>]s\.•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•S2ôDí«ø`®θkèìDJ Wypróbuj online. Głównie pozbyłem się wszystkich swapów i potrójnych swapów, używając zamiast tego zmiennej. I może być н, a ja wymienić 2׫z DJprzyłączyć cały stos razem. PS: Wysłałem również 55 bajtów odpowiedź 05AB1E przy użyciu innej techniki. (Który zawiera również link do lepszego zrozumienia kompresji w 05AB1E.: D)
Kevin Cruijssen

3

Kryształ, 130 bajtów

c=/[aeiouy]/
x,y,z=ARGV[0].partition /[^aeiouy]*#{c}*/
k=z[0]
b=((i="pgtvkgbqrzdfs"=~/#{k}/)?"bcdfgkpqrstvz"[i]: k)+z[c]
p y+k+b*2

Jak to działa

c = /[aeiouy]/

zapisz wyrażenie regularne do wyszukiwania pierwszej samogłoski do c .

x, y, z = ARGV[0].partition /[^aeiouy]*#{c}*/

podziel pierwszy argument na trzy części {"", Ciąg do jednego znaku przed pierwszą spółgłoską po pierwszej samogłosce, reszta ciągu} i zapisz każdy z elementów na x, y i z.

k = z[0]

uzyskaj pierwszy znak, odpowiednią spółgłoskę.

i = "pgtvkgbqrzdfs" =~ /#{k}/

pobierz indeks spółgłoski w lewym ciągu lub nil.

b = ((i = ...) ? "bcdfgkpqrstvz"[i] : k) + z[c]

jeśli inie jestnil , użyj tego indeksu dla drugiego ciągu (rodzaj skrótu golfowego).

jeśli ijestnil , użyj oryginalnego znaku.

następnie dołącz pierwszą samogłoskę z z.

p y + k + (b * 2)

na koniec wydrukuj pierwszą część z pierwszego wyrażenia regularnego y, pierwszej spółgłoski ki dwa razy więcej niż poprzednio obliczony ciąg b.

Wypróbuj online .



2

Lua, 164 157 bajtów

w=arg[1]
i,j,a,b=w:find('[aeiouy]+([^aeiouy]+)(.)')
print(w:sub(1,j-#a)..(('pgtvkhjglmnbqrzdfwxs'):sub(('bcdfghjklmnpqrstvwxz'):find(a:sub(1,1)))..b):rep(2))

Edycja 1: Usunięto 7 bajtów, szukając dowolnej postaci po spółgłosek (patrz regex)

Wypróbuj online!

Ten program pobiera ciąg w argumencie CLI i wypisuje swoją wersję kowariancji.

To moje pierwsze zgłoszenie do golfa kodowego! Nie sprawdziłem szczegółowo pozostałych, więc mogłem przeoczyć kilka typowych optymalizacji (i wpadłem w pułapki). Użyłem Lua, ponieważ polubiłem ten mały język i starałem się znaleźć regex, który odpowiada moim potrzebom.

Oto czystsza wersja, wykorzystująca funkcję (zamierzałem użyć jednej, ale słowa kluczowe w Lua są za długie!):

function covfefy(word)
  i, j, a, b = word:find('[aeiouy]+([^aeiouy]+)(.)')

  -- 'a' is one or several consonants following the first vowel, b is the first vowel after that
  -- 'i' is the index of the beginning of 'a', 'j' the index of 'b'

  cov = word:sub(1, j - #a)

  -- Look for the first letter of 'a' in the voiced/voiceless table
  f = ('pgtvkhjglmnbqrzdfwxs'):sub(('bcdfghjklmnpqrstvwxz'):find(a:sub(1, 1)))

  return cov .. (f .. b):rep(2)
end

Podziel się swoją opinią :)

Uwaga: jeśli się zastanawiasz, przy użyciu MoonScript trwa 149 bajtów!


2

JavaScript (ES5), 237 229 bajtów

function(s){r=['aeiouy','bcdfgkpstvz','pgtvkgbzdfs']i=0,p=''while(p+=s[i],r[0].indexOf(s[i++])<0);while(p+=s[i],~r[0].indexOf(s[i++]));b=s[i-1];while(r[0].indexOf(s[i++])<0);c=r[1].indexOf(b)d=((~c)?r[2][c]:b)+s[i-1]return p+d+d}

Wypróbuj online!

Prawdopodobnie nie najbardziej golfowy, ale jest to ES5.

Ostatnio naprawiono błąd. Przykładowe dane wyjściowe:

creation->creatdidi
coverage->covfefe
example->exxaxa
programming->progkaka
code->codtete
president->preszizi

2

sed, 106 (105 + 1) bajtów

Jest to sed z -Eflagą, która najwyraźniej liczy się dla jednego bajtu.

s/([aoeuiy][^aoeuiy])[^aoeuiy]*(.).*/\1\2/
h
s/.*(..)/\1\1/
y/bcdfgkpstvz/pgtvkgbzdfs/
x
s/.$//
G
s/\n//g

Wypróbuj online!


2

C #, 584 581 bajtów

-3 bajty dzięki Destructible Lemon

To moje pierwsze zgłoszenie na temat Code Golf i ogólnie Stack Exchange. Wiem, że C # nie jest świetnym językiem golfowym i to prawdopodobnie nie jest całkowicie zoptymalizowane, ale chciałem spróbować: p. Wszelkie wskazówki są mile widziane!

Wersja do gry w golfa:

namespace System{class B{static void Main(string[]args){var s="creation";var t="aeiou";int i=0,j=0,l=s.Length;char c=' ',f=' ';for(int x=0;x++<l;){if(t.IndexOf(s[x])>=0){i=x;break;}}for(int x=i;x++<l;){if(!(t.IndexOf(s[x])>=0)){j=x;c=s[x];for(int y=x;y++<l;){if (t.IndexOf(s[y])>=0){f=s[y];goto W;}}}}W:switch(c){case'b':c='p';break;case'c':c='g';break;case'd':c='t';break;case'f':c='v';break;case'g':c='k';break;case'k':c='j';break;case'p':c='b';break;case's':c='z';break;case't':c='d';break;case'v':c='f';break;case'z':c='s';break;}Console.Write(s.Substring(0,l-i-1)+c+f+c+f);}}}

Wersja do odczytu:

namespace System
{
    class B
    {
        static void Main(string[] args)
        {
            var s = "creation";
            var t = "aeiou";
            int i = 0, j = 0, l = s.Length;
            char c = ' ', f = ' ';
            for (int x = 0; x++ < l; )
            {
                if (t.IndexOf(s[x]) >= 0)
                {
                    i = x; break;
                }
            }
            for (int x = i; x++ < l;)
            {
                if (!(t.IndexOf(s[x]) >= 0))
                {
                    j = x; c = s[x];
                    for (int y = x; y++ < l;)
                    {
                        if (t.IndexOf(s[y]) >= 0)
                        {
                            f = s[y];
                            break;
                        }
                    }
                }
            }
            switch (c)
            {
                case 'b': c = 'p';
                    break;
                case 'c': c = 'g';
                    break;
                case 'd': c = 't';
                    break;
                case 'f': c = 'v';
                    break;
                case 'g': c = 'k';
                    break;
                case 'k': c = 'j';
                    break;
                case 'p': c = 'b';
                    break;
                case 's': c = 'z';
                    break;
                case 't': c = 'd';
                    break;
                case 'v': c = 'f';
                    break;
                case 'z': c = 's';
                    break;
            }
            Console.Write(s.Substring(0, l - i - 1) + c + f + c + f);
        }
    }
}

1
Nie jestem ekspertem, ale myślę, że można dodać inkrementację do komparatora w pętli for, to znaczy x++ < l, czy coś (może, l > x++jeśli pierwszy nie działa). nie jestem pewien
Destructible Lemon

@DestructibleLemon Dzięki za wskazówkę!
Brandon Hao

2

SmileBASIC 3, 195 bajtów

Bardzo późno na to pytanie, ale jak mogłem się oprzeć dobrym wyzwaniom dla SmileBASIC 3? Funkcje takie jak iteracja po sekwencji lub manipulowanie ciągiem nie są tak solidne jak inne języki, więc jest to trochę trudne, aby zrobić to tak małe, jak to możliwe. Zakłada, że ​​słowa są duże.

V$="AEIOUY
LINPUT W$REPEAT I=I+1UNTIL.<=INSTR(V$,W$[I-1])&&.>INSTR(V$,W$[I])J=I
WHILE.>INSTR(V$,W$[J])J=J+1WEND?LEFT$(W$,I+1)+("PGTVKHJGLMNBQRZDFWXS"[INSTR("BCDFGHJKLMNPQRSTVWXZ",W$[I])]+W$[J])*2

Szczegółowe wyjaśnienie tutaj!


2

05AB1E , 55 bajtów

η.ΔžOSåàyžPSÅ¿à*}ÐIsKžOÃнsθU.•gÍĆdQ¸G•SDXåiÂXQÏθë\X}ìDJ

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

η                        # Suffixes of the (implicit) input
                         #  i.e. "creation" → ["c","cr","cre","crea","creat","creati","creato","creatio","creation"]
        }              # Find the first for which the following is truthy:
   žO                    #  Push vowels (including y): "aeiouy"
     S                   #  Convert it to a list of characters: ["a","e","i","o","u","y"]
      å                  #  Check for each if they're in the current (implicit) suffix
                         #   i.e. "creat" → [1,1,0,0,0,0]
       à                 #  Pop and push the max (basically check if any are truthy)
                         #   i.e. [1,1,0,0,0,0] → 1
   y                     #  Push the suffix again
    žP                   #  Push the consonants (excluding y): "bcdfghjklmnpqrstvwxz"
      S                  #  Convert to a list of characters: ["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","z"]
       Å¿                #  Check for each if the suffix ends with it
                         #   i.e. "creat" → [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0]
         à               #  Pop and push the max (basically check if any are truthy)
                         #   i.e. [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0] → 1
   *                     #  Check if both are truthy
                         #   i.e. 1 and 1 → 1
           Ð             # Triplicate the found suffix
            I            # Push the input
             s           # Swap the top two items on the stack
                         #  i.e. stack contains now: "creat","creat","creation","creat"
K                        # Remove the suffix from the input
                         #  i.e. "creation" and "creat" → "ion"
 žOÃ                     # Only leave the vowels
                         #  i.e. "ion" → "io"
    н                    # Pop and push the first character
                         #  i.e. "io" → "i"
s                        # Swap again so the prefix is a the top of the stack again
 θ                       # Pop and push the last character
                         #  i.e. "creat" → "t"
  U                      # Pop and store it in variable `X`
   .•gÍĆdQ¸G            # Push string "bcdfkszgvtgp"
             S           # Convert to list of characters: ["b","c","d","f","k","s","z","g","v","t","g","p"]
              D          # Duplicate it
               Xåi       # If `X` is in this string:
                  Â      #  Bifurcate the list (short for Duplicate & Reverse copy)
                         #   i.e. ["b","c","d","f","k","s","z","g","v","t","g","p"]
                         #   → ["p","g","t","v","g","z","s","k","f","d","c","b"]
                   XQ    #  Check if they're equal to variable `X`
                         #   i.e. `X` = "t" → [0,0,1,0,0,0,0,0,0,0,0,0]
                     Ï   #  Only keep the truthy values
                         #   i.e. ["b","c",...,"g","p"] and [0,0,1,0,0,0,0,0,0,0,0,0]
                         #    → ["d"]
                      θ  #  Pop and push the last one
                         #   i.e. ["d"] → "d"
                 ë       # Else:
                  \      #  Discard the duplicate list from the stack
                   X     #  And push variable `X` again
                 }       # Close the if-else
                  ì      # Prepend the second character in front of the first
                         #  i.e. "d" and "i" → "di"
                   D     # Duplicate it
J                        # Join the stack together (and output implicitly)
                         #  i.e. "creat" and "di" and "di" → "creatdidi"

Zapoznaj się z moimi poradami 05AB1E (sekcja Jak kompresować ciągi znaków, które nie są częścią słownika? ), Aby zrozumieć, dlaczego tak .•gÍĆdQ¸G•jest "bcdfkszgvtgp".

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.