Согласно RollingStone , ниже представлены 26 величайших певцов всех времен:
Aretha Franklin Al Green
Ray Charles Robert Plant
Elvis Presley Mick Jagger
Sam Cooke Tina Turner
John Lennon Freddie Mercury
Marvin Gaye Bob Marley
Bob Dylan Smokey Robinson
Otis Redding Johnny Cash
Stevie Wonder Etta James
James Brown David Bowie
Paul McCartney Van Morrison
Little Richard Michael Jackson
Roy Orbison Jackie Wilson
Вы можете получить это как список строк здесь .
задача
Учитывая имя певца, распечатать или вернуть письмо A
на Z
который однозначно идентифицирует эту певицу. (Если ваш код возвращает A для Боба Дилана , то он не может вернуть A для любого другого певца.)
В отличие от других подобных задач, картографирование зависит от вас, если оно не содержит столкновений.
правила
- Входными данными гарантировано будет одно из 26 имен певцов, перечисленных выше, с этим точным написанием и без каких-либо начальных или конечных пробелов.
- Вы можете вывести букву в нижнем или верхнем регистре. Но это должно быть последовательным.
- Вам предлагается предоставить набор тестов для всех 26 возможных входов.
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах!
Ответы:
MATL , 28 байт
Попробуйте онлайн!
объяснение
Неявно получить входную строку. Суммируйте символы входной строки и выполните модуль 98 с последующим модулем 40. В результате получите одно из следующих чисел:
38 18 13 34 29 23 27 30 5 28 22 1 0 16 7 32 8 14 3 36 25 4 2 6 24 35
(в порядке списка Pastebin).Нажмите (строчный) алфавит с помощью
2Y2
. Это заботится о числах в диапазоне [1,26]. Однако некоторые числа отсутствуют, и у нас есть числа до 38. Следовательно, мы добавляем (h
) строку, которая заботится о старших числах, сопоставляя эти числа с «пропущенными» буквами. Пробелы могут быть любыми, для удобства я использовал заглавные буквы в своей исходной программе.Теперь мы можем индексировать число с первого шага в строку со второго шага с помощью
)
. Мы используем,w
чтобы получить аргументы в правильном порядке. Хотя может показаться, что мы используем индексирование на основе 0 (числа варьируются от 0 до 38, а длина строки составляет 39 символов), в действительности все немного сложнее: мы используем модульную индексацию на основе 1, особенность, уникальную для MATL. Это означает, что1
индексируетa
,38
фактически индексируетu
и0
индексирует финалz
строки.источник
Python 2 ,
8071 байтПопробуйте онлайн!
Суммы модифицированных ординалов дают числа между
0
и38
Числа больше 25 затем сдвигаются, чтобы заполнить пробелы, как показано ниже (показана отсортированная последовательность):
Вычтите,
18
еслиi>25
:Добавьте,
3
еслиi>31
:Вычтите,
8
еслиi>37
:Что дает последовательность
0..25
Затем они преобразуются в
A-Z
сchr(i+65)
источник
(i>31)
доi/32
, и т. Д.6502 подпрограммы машинного кода (C64), 83 байта
Это позиционно-независимый код, просто поместите его где-нибудь в ОЗУ и перейдите туда, например, с помощью
sys
команды.Демо онлайн (загружается в
$C000
/49152
).Использование:
sys49152,"[name]"
, напримерsys49152,"Aretha Franklin"
.Важно: если программа была загружена с диска (как в онлайн-демонстрации),
new
сначала введите команду! Это необходимо, потому что при загрузке машинной программы перегружаются некоторые основные указатели C64.Примечание: C64 по умолчанию находится в режиме без строчных букв - чтобы иметь возможность вводить читаемые имена, сначала переключитесь в режим строчных букв , нажав
SHIFT
+CBM
.объяснение
Задача состоит в том, чтобы найти минимальную идеальную хеш-функцию для этих имен; для C64 я должен был найти тот, который легко вычислим в простых 8-битных операциях. Вот прокомментированный список разборки:
Набор тестов (C64 BASIC, содержащий подпрограмму машинного кода в
data
строках)Онлайн-демонстрация тестового набора .
источник
Python 2 , 68 байт
Попробуйте онлайн!
источник
chr(65+i-i/25*2-i/29*21+i/35*2)
) похожа на ответ TFelds . Операции по модулю выполняются скриптом, который я уже использовал здесь и здесь .Javascript,
138132 символаПоскольку все инициалы являются уникальными, за исключение
MJ
= M ichael J ackson / M Ик J Аггер, я проверяю для Майкла Джексона специально (только один сh
4 - е места), а также для всех других имен я создал строку с инициалами последовавших уникальным письмомФрагмент кода
Попробуйте это здесь:
источник
Java (OpenJDK 8) ,
128126115113 байтовНе слишком потрепанный для представления Java!
Спасибо Кевину за то, что он спас мне много байтов с лямбда-выражениями!
Попробуйте онлайн!
источник
{a+=i;}
a+=i;
char g(String s)
в гольфs->
. Я изменил ваш TIO, чтобы показать, как это сделать, если вы привыкли только к методам Java 7.Python 3,
1329996 байтПопробуйте онлайн!
Не блестяще играл в гольф, но я решил попробовать.
-33 байта благодаря модификациям, сделанным TFeld.
-3 байта, используя
find
вместоindex
ovs.источник
sum(map(ord,m))
, также я добавил Арету Франклин для 128 байтовchr(97+...)
вместоascii_lowercase
: 99 байтовsum(map(ord,m))
складывает значения ASCII символов в строкеm
(дает целые числа в диапазоне 702–1506). Затем, вызываяchr
его, он преобразуется в символ (Unicode) с таким номером:chr(702)
isʾ
tochr(1506) = ע
и много между ними. Это решение просто ищет этот символ в списке всех возможных (26) таких символов, чтобы получить индекс (0–26), а затем возвращает символ с кодом ASCII 97 + этот индекс (так что «a» - «z»).PHP,
90 88 8672 + 1 байтможет стать еще короче с другим модулем.
Сохраните в файл и запустите как канал
-nF
или попробуйте онлайн .источник
W
о ваших тестовых примерах, ноX
выходных данных нет . Не знаю, является ли это ошибкой в самом коде или просто попытаться преобразовать его онлайн :)<?=
часть. И «Беги как труба» я не получаю работу. Кроме того, я получаю уведомления при попытке запустить его из командной строки.<?=
... Итак, мой вопрос по-прежнему, как мне запустить ваш код (из командной строки)? Я не могу$argn
передать его в командной строке ... Все мои попытки до сих пор либо дают артефакты, но все еще, кажется, требуют больше кода для его запуска.echo <input> | php -nF <scriptfilename>
Perl,
56,54,50, 46 +1 (-p) байт$ = crypt $ , DT; / .. (.) /; $ _ = $ 1; y / 01268ADIJNVW / adhilmnpqsux /$ = crypt $ , DT; / .. (.) /; $ = $ 1; y / 01268JVW / hlmpqsux /; $ = lc$ = crypt $ , mO; / .. (.) /; $ = $ 1; y / 035eft / AHPRXZ /; $ = lcБлагодаря комментарию Dom можно было сохранить еще 4 байта, также изменив их в верхний регистр, чтобы соответствовать лучшим требованиям.
Попробуйте онлайн
источник
perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'
добавление ссылки на tio$1^$2
но не думал использоватьcrypt
... Вы можете сэкономить 4 байта с некоторым повторным заказом: попробуйте онлайн!Python 2,
5043 байтаКредит JAPH для новой версии
Попробуйте онлайн!
Примечание: это зависит от
hash
встроенного и не будет работать во всех реализацияхисточник
lambda n:chr(hash(n)%2354%977%237%54%26+65)
Рубин, 63 байта
Добавляет входные коды ASCII, принимает их мод 98, а затем мод 66, чтобы получить одно из 26 уникальных чисел
n
в диапазоне 0,65. Огромное шестнадцатеричное число содержит1
бит в каждом из этих 26 мест, поэтому, смещая его по праву,n
мы получаем число с 1,261
битами в нем. Мы считаем1
биты, добавляя коды ascii и беря mod 48, затем добавляем 64 и конвертируем в код ASCII.Тестовая программа
map
перебирает певцов печатающим буквенный код и певицу. Затем он возвращает массив буквенных кодов, которыйsort
редактируется, чтобы продемонстрировать, что каждая буква используется один раз.Выход
источник
Октава ,
85 83 8074 байтаЭтот беспорядок анонима является результатом некоторой путаницы в MATLAB, пытающейся найти хороший способ кодировать данные.
В основном, после быстрого анализа, только буквы 1, 2 и 8 входной строки (наименьшая строка составляет 8 символов, поэтому мы хороши) необходимы для получения уникального значения из каждого ввода. Сложная часть заключается в том, чтобы преобразовать эту уникальную ценность в нечто полезное.
MATLAB ужасно сжимает данные, поэтому мне пришлось искать другой способ создания поискового отображения. Я попытался найти какую-то функцию по трем входным буквам, которая привела к уникальному значению, которое также было значением ASCII для печати, чтобы я мог встроить отображение в строку из одного символа на вход.
Оказывается, что матрица, умножающая символы в индексе
[1 2 8]
на целочисленную матрицу[1;15;47]
и затем выполняющая mod 124, приводит к уникальным значениям, которые все печатаются в ASCII (и ни один из них не является'
символом, который запутывает строковые литералы). Приятно, что заканчивается отображение,TIO
которое совершенно случайно. Интересно, что это единственное отображение для этого уравнения, которое дает 26 уникальных печатных символов ASCII.Так что в основном это мое поисковое отображение и расчет. Выполнение поиска - это просто случай выполнения расчета и сравнения с отображением. Добавление
'A'-1
к индексу на карте приводит к появлению символа AZ.Вы можете попробовать это онлайн на TIO, который показывает полное отображение входов и выходов. Для полноты полного отображения также ниже:
+32
.'A':'Z'
вместо find.источник
JavaScript (Chrome), 102
Примечание. К сожалению, это работает только в Chrome из-за зависимых от реализации приближений в parseInt () (спасибо @Arnauld)
Я искал хеш-функцию: брал кусочек каждого имени, конвертировал в числа, используя базу 36, а затем применял модуль.
Я использовал этот код для поиска лучшего хэша:
И результаты:
Наилучшая хеш-функция дает 26 различных значений от 0 до 50, но я использовал другое, с 1 дубликатом, но меньшим диапазоном.
Тест
источник
parseInt()
.C
655549 байтовh(char*s){return*s<77?(*s^s[5]+40)%13+65:(s[5]&s[4]+s[1])%13+78;}
h(char*s){return*(long*)s%887%392%224%120%67%40%26+65;}
Тот же подход, что и в ответе KSab . C не предоставляет строковую
hash
функцию, такую как Python. Или это?Попробуйте онлайн!
h
возвращаетint
чьи значения являются ASCII-кодами дляA .. Z
.источник
Javascript, 98 байт
Я обнаружил, что комбинация 2-го и 4-го символов имен уникальна для каждого из них.
Поэтому я создаю строку с комбинациями
name[4] + name[2]
, нет,name[2] + name[4]
или у меня будет повторение группы символовeh
с именем Арета Франклинeh
и когда сцепляются Смоки Робинсон и Джонни Кэшoehn
.Я мог бы просто переместить Джонни Кэша в другое место строки и получить другое отображение, но объединение 4-го и 2-го символов в этом порядке позволяет избежать столкновения и оставляет порядок набора данных без изменений, не добавляя больше длины к решению. Поэтому я решил пойти по этому пути (это просто личное предпочтение)
Я ищу положение конкатенации 4-й и 2-й буквы данного параметра в строке и делю его на 2, чтобы получить число от 0 до 25. Затем я добавляю 10 и преобразовываю его в строку из базы 36, где 10 соответствует
a
и 35 соответствуетz
источник
Wolfram Language (Mathematica) , 101
126байтов+32
кажется, приводит к кратчайшему перемешиванию в MathematicaInputForm
.Попробуйте онлайн!
источник
///,
390231 байтПопробуйте онлайн!
231 байт после удаления новых строк.
Это очень долго, но /// не может обрабатывать разные символы в общем. Другими словами, /// не поддерживает регулярное выражение.
источник
Excel, 96 байт
После того, как слишком много времени было потрачено на попытки применения других подходов, внедрили подход @Eduardo Paez:
источник