Распечатать алфавит без использования каждой гласной


72

Вдохновение : в 1939 году человек по имени Эрнест Винсент Райт написал роман под названием Гэдсби, не используя букву «е».

Ваша задача - написать набор (до 5) программ на любом языке (который имеет текстовый синтаксис *), чтобы вывести все 26 букв алфавита по порядку. Однако для каждой гласной aeiou, по крайней мере, одна из программ не должна включать какое-либо появление гласной.

Так должно быть

  • программа, которая не использует « a » или « A » где-либо в синтаксисе программы.
  • программа, которая не использует « e » или « E » где-либо в синтаксисе программы.
  • программа, которая не использует « i » или « I » где-либо в синтаксисе программы.
  • программа, которая не использует ' o ' или ' O ' где-либо в синтаксисе программы.
  • программа, которая не использует ' u ' или ' U ' где-либо в синтаксисе программы.

Все они должны выводить abcdefghijklmnopqrstuvwxyz.

Победителем будет решение, при котором длина всех программ самая короткая.

* так как ограничение не будет большой проблемой в Piet или Whitespace


Текущий рейтинг (06 марта 2014):


4
@ w0lf: Нет, там написано «до 5 программ» и «длина всех программ», которые я прочитал как «может быть только одна программа, и в этом случае ее длина считается».
Schnaader

9
@PeterTaylor: Вы не думаете, что необходимость избегать использования гласных в вашем синтаксисе является уникальной проблемой? Как программист JS это особенно интересно :)
mellamokb

2
Допустимы ли новые строки в выходных данных (т. Е. По одному на символ)? Я могу сократить часть своего кода, если это так ...
Gaffi

2
Допускается ли вывод в верхнем регистре?
Эрик Outgolfer

2
Я ОП. Прописные буквы не допускаются.
shamp00

Ответы:


48

Golfscript - 8 символов

123,97>+

8
блин, действительно не могу разбить Golfscript с точки зрения краткости ...
Патрик Осци

18
При этом читаемость воняет как сумасшедшая.
Эндрю Грей,

5
Это не так уж и плохо;) сгенерировать список из 123 чисел, удалить тех, кто не превышает 97, привести его (массив чисел) к строке.
Маккей,

3
Используйте 91,65>+вместо этого.
Эрик Outgolfer


23

PHP, 31 байт

Нет, я, я, я

<?=~žœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…;

Двоичная строка после тильды имеет следующее шестнадцатеричное представление:

\x9e\x9d\x9c\x9b\x9a\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90\x8f\x8e\x8d\x8c\x8b\x8a\x89\x88\x87\x86\x85

Так как есть языковое табло, я также могу представить это:

Ruby (v1.8) 18 байт

$><<[*97.chr..'z']

Я не уверен, что понимаю, как это работает. Могу ли я получить объяснение?
Мистер Лама

При применении к строке оператор ~ инвертирует все биты. Здесь я перевернул abc ... xyz. Поскольку в двоичной строке нет символов символов (или пробелов), кавычки также не нужны.
Прим

1
Вы можете указать кодировку для того, что у вас там есть.
Джои

1
ISO-8859-1. Три «непечатных» символа были удалены, когда он был опубликован, поэтому я включил гекс.
Прим

2
Хорошая и, вероятно, самая короткая версия PHP. Команда для создания файла: php -r 'echo("<?=~\x9e\x9d\x9c\x9b\x9a\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90\x8f\x8e\x8d\x8c\x8b\x8a\x89\x88\x87\x86\x85;");' > script.php. Команда , чтобы запустить его: php -d error_reporting=0 script.php; echo.
Axiac

16

Рубин ( 24 22)

Изменить: круглые скобки могут быть опущены, 2 символа меньше:

$><<'%c'*26%[*97..122]

24 символа в рубине:

$><<('%c'*26)%[*97..122]

Как это устроено

$>псевдоним для $stdoutили STDOUT. Вы можете написать в него с помощью <<оператора. Термин '%c'*26повторяет строку '%c'26 раз. %Оператор определяется на строку в качестве псевдонима sprintf, так str % valэквивалентно записи sprintf(str,val). Символ формата %cиспользуется для преобразования значения символа в символ. Эти значения происходят из [*97..122]которого создает массив, содержащий значения от 97 до 122. Et voilá!


Очень хорошо. Я искал способ использовать, <<но забыл о $>.
Марк Рид

1
Я даже не знал об этом $>раньше, но я догадывался, что должен быть какой-то псевдоним с переменной долларом, о $stdoutкотором никто не помнит :)
Patrick Oscity

21 персонаж: $><<[*"`".."z"][1,26](примечание: это работает только в Ruby 1.8)
Ventero

@Ventero работает не только в Ruby 1.8, но и в Ruby 1.9.2. Но использование p [*"".." z "] [1,26]` еще короче.
Хаулет

@Hauleth: Нет, запуск в 1.9 не приводит к правильному выводу, так как в 1.9 Array#to_sэто то же самое, что Array#inspectи в 1.8 Array#join- так что в 1.9 вывод ["a", "b", "c", "d", "e", ...]вместо abcdef.... По той же причине pне может использоваться (он вызывает inspectсвои аргументы вместо to_s).
Вентеро

16

Pyth , 1 персонаж

G

Pyth предопределяет определенные переменные. G предопределен как строчный алфавит. Pyth также неявно печатает каждую строку с разумным возвращаемым значением.


3
Ninja'd меня на 3 года ...
Стэн Струм

15

JavaScript (100)

Нет 'Aeou':

this['\x61l\x65rt']('\x61bcd\x65fghijklmn\x6fpqrst\x75vwxyz')

Нет «я»:

alert('abcdefgh\x69jklmnopqrstuvwxyz')

+1 Хорошее улучшение моего ответа :) Я думал об использовании \x##кодов, но не был уверен, что они действительны в JavaScript.
mellamokb

почему оповещения вообще? на терминале js объекты отображаются автоматически. ('\ x61bcd \ x65fghijklmn \ x6fpqrst \ x75vwxyz') @ 42 символа.
antony.trupe

3
@ antony.trupe, для кода гольфа ввод-вывод обычно осуществляется через встроенные в язык механизмы ввода-вывода (или общие плагины). Для JS это , как правило alert, confirm, prompt, console.log, и document.write. Простое объявление строкового литерала не приводит к его выводу при выполнении. В противном случае вы были бы правы, и я бы этим воспользовался.
zzzzBov

он выводит (по определению, которое я использую в любом случае) в консоли Google Chrome, но я допускаю проблему; это произвольное ограничение для начала.
antony.trupe

@ antony.trupe, на таком языке, как PHP, вы могли бы избежать использования литерала, потому что именно так он выполняет ввод-вывод.
zzzzBov

15

К, 9

_26#.Q.b6

К, 10

"c"$97+!26

К, 14

.:".Q.","c"$97

2
и глупый способ сделать это без букв вообще (12 символов):(@$`)$97+!26
Аарон Дэвис

1
Путь K5 - это почти ваше второе решение, но он $принимает символы вместо строк для управления типом, преобразованным в: `c $ 97 +! 26
JohnE

15

J, 26 23 17 16 символов

Через час или около того рыться в нижнем белье ящик Джея я , наконец , нашел способ устранить a.и u:глаголы.

2(3!:4)96+#\26$1

Ранее:

a.{~96++/\26$1
u:97+i.26

с благодарностью Рандере за #\трюк.


Отличное решение! Удалось сократить с 1 символом, используя #\ вместо +/\ .
Рандомра

5
Вылезай из ящика с нижним бельем
Джо,

14

R, 17 + 19 = 36 символов

нет ае (17):

intToUtf8(97:122)

нет я (19):

cat(letters,sep="")

12

Баш (38)

Нет гласных вообще.

/*/*/*ntf "/*/?ch? {\x61..z}"|/*/b?sh

Эта программа не работает в моей системе, потому что / * / b? Sh не существует. У меня есть / usr / local / bin / bash, а не / bin / bash.
Kernigh

2
Хорошее использование оболочки оболочки!
Механическая улитка

@kernigh[[ ! -d "/bin" ]] && mkdir "/bin"; sudo cp "/usr/local/bin/bash" "/bin/bash"
Стэн Струм

Было бы лучше, если бы /bin/shBash. Тогда код может заканчиваться /*/sh(36 байтов). Но я не нашел систему, где это работает. В Debian / bin / sh не является bash. На моем старом Mac / bin / sh - это bash 2.05b0. (1), но эта версия слишком старая и не расширяется {a..z}.
Керни

11

C 90 88 84 символов

Скомпилировать используя gcc -nostartfiles

b;_exit(){for(;b<26;)printf("%c",b+++97);}    // 42 chars, works for a, u
b;_start(){putchar(b+++97)>121?:_start();}    // 42 chars, works for e, i, o

_startи _exitэто хороший способ обойти main. Но если с нестандартной строкой компиляции все в порядке, почему бы и нет -DX=main?
Угорен

4
Почему-то -DX=mainчувствует себя хуже, чем -nostartfilesделает (для меня). Это способ переместить часть исходного кода в строку компиляции, и это то же самое, что и запись #define X mainв исходном коде, которая была бы явно недействительной. Принимая во внимание, что -nostartfilesэто не способ переименовать main, но снимает ограничение, что должна быть mainфункция ( вызывается _start). С другой стороны, использование -nostartfilesнемного похоже на обман, тем более что оно содержит 4 из 5 «плохих» букв :)
schnaader

Это скользкий склон ... Расстояние от -nostartfilesдо -DX=mainмало, и почему бы не сохранить некоторые символы с -DX=main()и так далее. Но я не могу найти решение, в котором нет ничего подозрительного.
Угорен

Например, вы не можете определить основную функцию как «mn»?
Нил

@Neil, только делая что-то вроде -Dmn=main. Функция AC должна иметь mainфункцию, если не используется нестандартная опция, например -nostartfiles.
Мэтью Флэшен


9

Рубин, 20 символов

$><<[*97.chr..?z]*''
  • 97.chr это сложный способ сказать «а»
  • .. указывает диапазон
  • ?z это более короткий способ сказать "Z"
  • что [*range]вызывает диапазон для Splat аль это значение в массиве
  • *''такой же как join(''); он склеивает все значения массива вместе.
  • $><< Перлицизм: печать на стандартный вывод.

Этот код, похоже, не работает. ?zэто не сокращение для 'z', а скорее для 122. Это, однако, работает для 18 байтов:$><<[*97.chr..'z']
primo

Это работает в Ruby 1.9.
Стинслаг

1
Я скачал 1.9.3 ... и ты прав. Зачем им что-то менять? Я могу понять, почему в анархии по-прежнему работает 1.8.7. В любом случае, 18-байтовое решение работает для v1.8.7-
primo

2
(4 года спустя ...) Вы можете заменить 97.chrс ?\x61на -1 байт.
Джордан

9

DC: 18 17 символов

97[dP1+dBD>m]dsmx

И там умер отважный персонаж.


Я сомневаюсь в этом. Я оборачиваюсь вокруг него и не вижу способа сократить его. Я закончил с точно таким же решением, за исключением того, что я использовал xдля регистра, что делает мое решение более запутанным.
Гинек -Пичи- Выходил

3
97[dP1+dBD>m]dsmx17 символов. По-видимому, вы всегда можете ввести шестнадцатеричные символы в DC, но поскольку входная база равна десяти, значение равно B*10+D=11*10+13=123='{'0xBD.
Форс

О, хороший глих ;-)
Гинек -Пичи- Выходил

9

Powershell, 75 62 персонажа

Редактировать: Использовал -f (String.Format) и индексирование массива, чтобы значительно уменьшить длину кода.

'{0}bcd{1}fgh{2}jklmn{3}pqrst{4}vwxyz'-f"$(1|gm)"[8,10,0,5,31]

Как это устроено

gmявляется псевдонимом для get-members, поэтому 1|gmвозвращает члены значения 1, которое имеет System.Int32тип:

PS C:\> 1|gm
   TypeName: System.Int32
Name        MemberType Definition
----        ---------- ----------
CompareTo   Method     int CompareTo(System.Object value), int CompareTo(int value)
Equals      Method     bool Equals(System.Object obj), bool Equals(int obj)
GetHashCode Method     int GetHashCode()
...

"$(1|gm)"возвращает строковое представление из приведенного выше списка, который содержит все гласные, необходимые для завершения алфавита: « int C omp ar eTo (System.Object val ue) ...»


2
Это не стабильно, если MS добавляет членов в System.Int32, хотя :-)
Джои

Я думаю, что это должно быть ($x=''+$(gv))[8]+"bcd$($x[4])fgh$($x[25])jklmn$($x[26])pqrst$($x[19])vwxyz"75 символов :)
Данко Дурбич

Ага, верно. Я выловил не тот предмет из моей истории. Сожалею.
Джои

На самом деле, если заменить ''+$(gv)с "$(gv)"вами получаете ($x="$(gv)")[8]+"bcd$($x[4])fgh$($x[25])jklmn$($x[26])pqrst$($x[19])vwxyz"который составляет 74 символов. Приятно!
Данко Дурбич

2
Я использовал -f (String.Format) и индексацию массива, чтобы значительно уменьшить длину кода.
Тим Льюис


8

Хаскелл, 12

['\97'..'z']

Или это обман? :)


По общему признанию я не знаю много о Haskell, но это дает мне эту ошибку:Parse error: naked expression at top level
primo

1
Вы запускаете его в интерпретаторе
RobAu

7

MATLAB, 12 + 20 = 32 символа

Нет (12):

char(97:122)

Нет (20)

fprintf('%s',97:122)

7

В Perl

это также возможно без гласных

но гораздо сложнее, чем в Ruby и т. д. При этом используется всего 101 символ, но не требуется вызов строки cmd (perl -e).

`\160\145\162\154\40\55\145\40\42\160\162\151\156\164\40\123\124\104\105\122\122\40\141\56\56\172\42`

=> Результат: abcdefghijklmnopqrstuvwxyz

В отличие от «похожего» решения PHP , это настоящая программа . Программа расшифровывается следующим образом:

perl -e "print STDERR a..z"

После кодирования в восьмеричные значения другой интерпретатор perl вызывается во время выполнения `` (backticks). Обратные метки будут потреблять вывод, поэтому он печатается в STDERR.

Кодировка выполняется с помощью sprintf:

my $s = q{perl -e "print STDERR a..z"};
my $cmd = eval(
       '"' . join('', map sprintf("\\%o",ord $_), split //, $s) . '"'
       );

а eval'd-кодировка - это опубликованная программа (в пределах обратных галочек):

"\160\145\162\154\40\55\145\40\42\160\162"
"\151\156\164\40\123\124\104\105\122\122"
"\40\141\56\56\172\42"

С уважением

БВ


8
Вы можете сократить это до 44 символов, только кодируя гласные :)
marinus

7

Perl 5, 22 символа

(1) содержит только aи e, 10 символов (требуется 5.10+, запустить из командной строки):

-Esay+a..z

(2) содержит только «я», 12 символов:

print v97..z

Если не разрешено запускать из командной строки, то вам нужно использовать use 5.01;say a..zдля первого, по стоимости 7 символов и еще один гласный, но у него по-прежнему нет «i», так что это приводит к действительной записи в общей сложности 29 персонажи.


Я думаю, что опция -E в порядке, но обычно к общей длине символа добавляются два символа -E.
Гарет

@gareth - -E занимает место -e для запуска одной строки. Если вы запускаете программу из файла, то вы застряли с use, хотя вы можете заменить ее параметром командной строки -M5.01и сбрить еще два символа.
Марк Рид

Я думал о правиле с -pопцией, где 2 символа добавляются к счету. Однако, глядя на этот мета-вопрос, вы сможете использовать -M5.010бесплатно, если эта опция поможет сократить ваш код.
Гарет

Вы могли бы заменить свое printзаявление, dieчтобы сбрить 2
символа

chr 97..zможет быть заменено v97..zна 3 байта.
Примо

7

APL (Дьялог) ( 11 13)

Вам может понадобиться шрифт APL. Это должен быть Unicode, но нет предварительного просмотра ...

Только U(и, возможно, если считать греческие гласные):

⎕UCS 96+⍳26

(Это: [quad]UCS 96+[iota]26 )

Только A:

⎕A

2
Uэто гласная ...
Тобия

@Tobia: и потребовалось больше года, чтобы кто-то это увидел (включая меня). Я думаю, что йота на самом деле тоже гласная, когда я думаю об этом. Починил это.
Маринус

Функциональный символ APL йота (U + 2373) не считается буквой в Юникоде и поэтому не может быть гласным. Обратите внимание, что он отличается от греческой строчной буквы йота (U + 03B9).
нгн

7

Python 2, 83

Нет , я , о или у ; 47 :

x=97;s='';exec"s+=chr(x);x+=1;"*26+"pr\x69nt s"

Нет е ; 36 :

print"abcd\x65fghijklmnopqrstuvwxyz"

6

Python 2, 175 символов

Примечание: вывод на печать в отличие от более раннего ответа Python .

Использует 'e', ​​но не a, i, o, u - 63 61 59 65 (исправить ошибочное iперемещение в нижний регистр) 115 символов (избавиться от пробелов).

exec('fr%cm sys %cmp%crt*\nf%cr x %cn r%cnge(97,123):std%c%ct.wr%cte(chr(x)),'%(111,105,111,111,105,97,111,117,105))

(Первоначально он использовал печать с запятой, которая вставляла пробел; также печатались буквы в верхнем регистре. Теперь рассматривал строгие требования для 'abcdefghijklmnopqrstuvwxyz' в качестве выходных данных; поэтому добавлен оператор импорта).

Не использует 'e' (использует a, i, o, u; может легко избавиться от a, u для небольшого расширения) - 61 60 символов

import string
print string.__dict__['low%crcas%c'%(101,101)]

1
Ваше первое решение использует букву i, так и должно быть: exec('f%cr x %cn r%cnge(65,91):pr%cnt chr(x),'%(111,105,97,105))и мы вернулись к 64 символам.
BioGeek

1
exec('fr%cm sys я mp%crt*\nf%cr ...
Гарет

BioGeek & @Gareth - мои навыки обнаружения гласных - отстой. Спасибо за указание на это; но у меня была дополнительная буква e, написанная как «% c», так что в конце она выровнялась.
Доктор Джимбоб

Вы можете удалить скобки изexec('...')
mbomb007

5

JavaScript (154)

(1) Только содержит i(99 символов):

t=this;s=-t+t+t.b;z=s[1]+'bcd'+s[7]+'fghijklmn'+s[4]+'pqrst'+s[21]+'vwxyz';t[s[1]+'l'+s[7]+'rt'](z)

(2) Только содержит aeou(55 символов):

t=0;s=''+t.b;alert('abcdefgh'+s[5]+'jklmnopqrstuvwxyz')

Демо: http://jsfiddle.net/SvN5n/


$("h\x65\x61d")[0]["\x6fwn\x65rD\x6fc\x75m\x65nt"]["l\x6fc\x61t\x69\x6fn"]="j\x61v\x61scr\x69pt:\x65v\x61l(`f\x6fr(s='',l=65;l<90;l++){s=s+Str\x69ng.fr\x6fmCh\x61rC\x6fd\x65(l);};c\x6fns\x6fl\x65.l\x6fg(s)`)"208 символов, не aeouiиспользуется в коде. Работает на браузере Chrome.
Esc Điệp

5

питон 159 117

Как упоминалось в другом посте о питоне, самая сложная часть связана с тем, что единственный способ вывода - это использовать printилиsys.stdout.write , оба из которых содержат i. Необходимо сделать это с 2 программами (которые являются автономными и не используют интерактивную оболочку python для создания выходных данных):

Этот использует только я для 55 символов:

print"%cbcd%cfghijklmn%cpqrst%cvwxyz"%(97,101,111,117)

Этот избегает использования i для 104 символов:

eval("sys.stdout.wr%cte"%105,{'sys':eval("__%cmport__('sys')"%105)})("%c"*26%tuple(range(97,123))+"\n")

РЕДАКТИРОВАТЬ: Массовый прорыв !!! Я думал, что использование eval (или даже exec) было чем-то вроде обмана и не совсем в духе конкуренции. В любом случае, просматривая встроенные функции, я нашел способ заполучить функцию печати без использования i. Итак, вот программа избежать-i (и o) для 68 символов:

vars(vars().values()[0])['pr%cnt'%105]("%c"*26%tuple(range(97,123)))

Но так как это также позволяет избежать o, это может быть связано с тем, что позволяет избежать a, e, u для 49 символов:

print"%cbcd%cfghijklmnopqrst%cvwxyz"%(97,101,117)

Вы можете отказаться от совместимости и получить характер -vars(vars().values()[0]).values()[47]
Угорен

5

Рубин 196 164 44 47

$><<"\x61bcd\x65fgh\x69jklmn\x6Fpqrst\x75vwxyz"

Это правильный ответ, так как pвыводит кавычки вокруг алфавита?
Марк Рид

Я согласен, p xчто эквивалентно вызову puts str.inspect, что приводит к кавычкам.
Патрик Осци

@padde вы оба правы; изменилось.
Кристиан Лупаску

1
@padde Я использовал твой $><<, так что +1 за это и поздравляю; ваша версия намного лучше
Кристиан Лупаску


5

VBA: 76 переборов, 116 без «мошенничества» (98, если на выходе допустимы переводы строки)

Стандартные функции

Благодаря многословности VBA, я не верю, что это можно сделать без 'E' или 'U' в стандартном модуле кода ...

  • " E - й»
  • " Фу nction"
  • " Су б"

Непосредственные функции

Работая с допущением mellamokb, здесь без объявления функции (опуская SUBи FUNCTION) ( 116 символов , 98 если переводы строки допустимы в выходных данных):

Ниже не используются ни «e», ни «a» ( 43 символа , отформатированные для запуска в непосредственном окне):

b=65:Do:z=z+Chr(b):b=b+1:Loop Until b=91:?z

Ниже не используются ни «i», ни «a», ни «u» ( 33 символа , отформатированные для запуска в непосредственном окне):

For b=65 To 90:z=z+Chr(b):Next:?z

Ниже не используются ни «a», ни «o», ни «u» ( 40 символов , отформатированные для запуска в непосредственном окне):

b=65:While b<91:z=z+Chr(b):b=b+1:Wend:?z

Если в выводе разрешены символы новой строки, приведенные выше примеры могут быть короче:

( 37 символов )

b=65:Do:?Chr(b):b=b+1:Loop Until b=91

( 27 символов )

For b=65 To 90:?Chr(b):Next

( 34 символа )

b=65:While b<91:?Chr(b):b=b+1:Wend

Грубая сила

Бег с ответом Ruby на w0lf

( 76 символов , отформатированные для запуска в ближайшем окне):

?Chr(65)&"BCD"&Chr(69)&"FGH"&Chr(73)&"JKLMN"&Chr(79)&"PQRST"&Chr(85)&"VWXYZ"

1
Я думаю, что было бы справедливо не учесть Sub..End Subэто, поскольку большинство других программ не включают определение функций.
mellamokb

@mellamokb Ну, это заставляет меня чувствовать себя лучше. Я приведу несколько примеров, чтобы добавить к этому.
Гаффи

2
Просто представьте, что это «код, который вы запускаете в ближайшем окне» :)
mellamokb

2
Хорошо, если вы сомневаетесь, просто назовите его VBScript, который может быть включен в файл без необходимости Sub:)
Джои

Исправлена ​​куча ненужных пробелов, измененных printна, ?так как это работает в непосредственном окне.
Gaffi

5

Ребму : 15 персонажей

Ctc'`L26[pn++C]

Чтение Rebmu всегда требует небольшого размышления, чтобы начать с:

c: tc '` l 26 [pn ++ c]

Тогда это помогает расширить аббревиатуры:

c: to-char-mu '`
loop 26 [
    prin ++ c
]

Было бы более очевидно использовать символьный литерал для предшественника строчной буквы a:

c: #"`"
loop 26 [
    prin ++ c
]

Но это не «кашу», поэтому преобразование буквального слова в символ проходит с той же целью. Что мне нравится в этом, как и в большинстве Rebmu, так это то, что он имеет дух разумной программы, несмотря на сжатие. (Ответ от Golfscript короче, но не соответствует тому, как программист обычно думает при кодировании.)


5

<> <(Рыба) - 22 символа

Поскольку <> <использует «o» для печати символа, эта задача кажется невозможной. К счастью, рыба может изменить свой собственный код во время выполнения. Это позволило мне добавить инструкцию печати к коду.

Этот код не использует ни одну из гласных:

'`78'+11pv
:X:'z'=?;>1+

Вы можете запустить код здесь

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