Według RollingStone poniżej znajduje się 26 największych wokalistów wszechczasów:
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
Możesz uzyskać to jako listę ciągów tutaj .
Zadanie
Biorąc pod uwagę nazwę piosenkarz, wydrukować lub powrócić do nas od A
celu Z
, który jednoznacznie identyfikuje tę piosenkarkę. (Jeśli kod zwraca A dla Boba Dylana , to nie może zwrócić A dla żadnego innego piosenkarza.)
W przeciwieństwie do innych podobnych wyzwań, mapowanie zależy od ciebie, o ile nie powoduje kolizji.
Zasady
- Dane wejściowe są gwarantowane jako jedna z 26 nazwisk piosenkarzy wymienionych powyżej z tą dokładną pisownią i bez żadnych początkowych lub końcowych białych znaków.
- Możesz wydrukować literę małymi lub dużymi literami. Ale to musi być konsekwentne.
- Zachęcamy do zapewnienia zestawu testów dla wszystkich 26 możliwych danych wejściowych.
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach!
Odpowiedzi:
MATL , 28 bajtów
Wypróbuj online!
Wyjaśnienie
Uzyskaj niejawnie ciąg wejściowy. Zsumuj znaki ciągu wejściowego i zrób to moduł 98, a następnie moduł 40. Wynik w jednej z następujących liczb:
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
(w kolejności listy Pastebin).Naciśnij alfabet (małe litery) za pomocą
2Y2
. Zajmuje się to liczbami z zakresu [1,26]. Jednak brakuje niektórych liczb i mamy liczby do 38. Dlatego dołączamy (h
) ciąg, który zajmuje się wyższymi liczbami, poprzez mapowanie tych liczb na „brakujące” litery. Spacje mogą być dowolne, dla własnej wygody użyłem wielkich liter w moim oryginalnym programie.Możemy teraz zindeksować liczbę od pierwszego kroku do ciągu od drugiego kroku za pomocą
)
. Używamy,w
aby uzyskać argumenty we właściwej kolejności. Chociaż może się wydawać, że korzystamy z indeksowania opartego na 0 (liczby różnią się od 0 do 38, a łańcuch ma 39 znaków), rzeczywistość jest w rzeczywistości nieco bardziej skomplikowana: korzystamy z indeksowania modułowego opartego na 1, unikatowej dla MATL. Oznacza to, że1
indeksujea
,38
faktycznie indeksujeu
i0
indeksuje do końcowegoz
ciągu.źródło
Python 2 ,
8071 bajtówWypróbuj online!
Zmodyfikowane sumy rzędnych dają liczby między
0
i38
Liczby większe niż 25 są następnie przesuwane, aby wypełnić puste pola, jak poniżej (pokazano posortowaną sekwencję):
Odejmij,
18
jeślii>25
:Dodaj,
3
jeślii>31
:Odejmij,
8
jeślii>37
:Co daje sekwencję
0..25
Są one następnie przekształca się
A-Z
zchr(i+65)
źródło
(i>31)
doi/32
itp.Procedura kodu maszynowego 6502 (C64), 83 bajty
Jest to kod niezależny od pozycji, po prostu umieść go gdzieś w pamięci RAM i wskocz tam, np. Za pomocą
sys
polecenia.Demo online (ładuje się do
$C000
/49152
).Zastosowanie:
sys49152,"[name]"
npsys49152,"Aretha Franklin"
.Ważne: Jeśli program został załadowany z dysku (jak w wersji demonstracyjnej online),
new
najpierw wydaj polecenie! Jest to konieczne, ponieważ ładowanie programu maszynowego niszczy niektóre wskaźniki C64 BASIC.Uwaga: C64 jest domyślnie w trybie bez małych liter - aby móc wprowadzać czytelne nazwy, najpierw przełącz na tryb małych liter, naciskając
SHIFT
+CBM
.Wyjaśnienie
W rzeczywistości wyzwaniem jest znalezienie minimalnej idealnej funkcji skrótu dla tych nazw; dla C64 musiałem znaleźć taki, który można łatwo obliczyć w prostych 8-bitowych operacjach. Oto skomentowana lista dezasemblacji:
Pakiet testowy (C64 BASIC, zawierający procedurę kodu maszynowego w
data
wierszach)Demo online pakietu testowego .
źródło
Python 2 , 68 bajtów
Wypróbuj online!
źródło
chr(65+i-i/25*2-i/29*21+i/35*2)
) jest podobna do odpowiedzi TFelds . Operacje modulo są brutalnie wymuszone przez skrypt, którego już użyłem tu i tutaj .JavaScript,
138132 znakówPonieważ wszystkie inicjały są wyjątkowe, z wyjątkiem
MJ
= M ichael J ackson / M ick J Agger, sprawdzić dla Michaela Jacksona specjalnie (tylko jeden zh
na 4 pozycji), a dla wszystkich innych nazw stworzyłem ciąg z inicjałami obserwowanych unikalnym listem.Fragment kodu
Wypróbuj tutaj:
źródło
Java (OpenJDK 8) ,
128126115113 bajtówNiezbyt obskurny jak na zgłoszenie w java!
Dzięki Kevinowi za uratowanie mi całej bajtów dzięki wyrażeniom lambda!
Wypróbuj online!
źródło
{a+=i;}
a+=i;
char g(String s)
w golfas->
. Zmodyfikowałem TIO, aby pokazać, jak to zrobić, na wypadek, gdybyś był przyzwyczajony do metod Java 7.Python 3,
1329996 bajtówWypróbuj online!
Nie świetnie grałem w golfa, ale pomyślałem, że spróbuję.
-33 bajtów dzięki modyfikacjom dokonanym przez TFeld.
-3 bajty za pomocą
find
zamiastindex
dzięki ovs.źródło
sum(map(ord,m))
, także dodałem Arethę Franklin dla 128 bajtówchr(97+...)
zamiastascii_lowercase
: 99 bajtówsum(map(ord,m))
sumuje wartości ASCII znaków w ciągum
(podaje liczby całkowite z zakresu 702–1506). Potem dzwonichr
konwertuje go do (Unicode) postać z tego numeru:chr(702)
jestʾ
, abychr(1506) = ע
i wiele pomiędzy. To rozwiązanie po prostu wyszukuje ten znak na liście wszystkich możliwych (26) takich znaków, aby uzyskać indeks (0–26), a następnie zwraca znak o kodzie ASCII 97 + ten indeks (czyli „a” do „z”).PHP,
90 88 8672 + 1 bajtymoże stać się jeszcze krótszy z innym modułem.
Zapisz do pliku i uruchom jako potok za pomocą
-nF
lub wypróbuj online .źródło
W
na testach i nie maX
danych wyjściowych. Nie wiem, czy to błąd w samym kodzie, czy po prostu spróbuj konwersji online :)<?=
części. I „Biegnij jak rura” nie pracuję. Otrzymuję również powiadomienia, gdy próbuję uruchomić go z wiersza poleceń.<?=
... Więc moje pytanie wciąż brzmi: jak uruchomić kod (z wiersza poleceń)? Nie udaje$argn
mi się podać go w wierszu poleceń ... Wszystkie moje dotychczasowe próby dają artefakty i nadal wymagają więcej kodu, aby uruchomić.echo <input> | php -nF <scriptfilename>
Perl,
56,54,50, 46 +1 (-p) bajtów$ = crypt $ , DT; / .. (.) /; $ _ = 1 $; y / 01268ADIJNVW / adhilmnpqsux /$ = krypta $ , DT; / .. (.) /; $ = $ 1; y / 01268JVW / hlmpqsux /; $ = lc$ = krypta $ , mO; / .. (.) /; $ = $ 1; y / 035eft / AHPRXZ /; $ = lcDzięki komentarzowi Dom mógł zaoszczędzić 4 dodatkowe bajty, również zmieniono na wielkie litery, aby dopasować lepsze wymagania.
Wypróbuj online
źródło
perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'
dodawanie linku do tio$1^$2
ale nie pomyślałem o użyciucrypt
... Możesz zapisać 4 bajty z pewną zmianą kolejności: Wypróbuj online!Python 2,
5043 bajtówKredyt dla japh dla nowej wersji
Wypróbuj online!
Uwaga: Zależy to od
hash
wbudowanego i nie będzie działać we wszystkich implementacjachźródło
lambda n:chr(hash(n)%2354%977%237%54%26+65)
Ruby, 63 bajty
Dodaje kody ascii wejścia, pobiera je mod 98, a następnie mod 66, aby uzyskać jedną z 26 unikalnych liczb
n
z zakresu 0..65. Ogromna liczba szesnastkowa zawiera1
trochę w każdym z tych 26 miejsc, więc przesuwając ją o prawon
, otrzymujemy liczbę z 1..261
bitami. Liczymy1
bity, dodając kody ascii i biorąc mod 48, a następnie dodajemy 64 i konwertujemy na kod ASCII.Program testowy
map
iteracje przez śpiewaków Drukowanie literowy kod i piosenkarka. Następnie zwraca tablicę kodów literowych, która jestsort
edytowana w celu wykazania, że każda litera jest używana raz.Wydajność
źródło
Oktawa ,
85 83 8074 bajtyTen bałagan anonimowy jest wynikiem pewnego bałaganu w MATLAB, który próbuje znaleźć dobry sposób na kodowanie danych.
Zasadniczo po szybkiej analizie, tylko litery 1,2 i 8 ciągu wejściowego (najmniejszy ciąg to 8 znaków, więc jesteśmy dobrzy) są potrzebne do wytworzenia unikalnej wartości z każdego wejścia. Trudność polega na przekształceniu tej unikalnej wartości w coś użytecznego.
MATLAB ma problemy z kompresowaniem danych, więc musiałem poszukać innego sposobu na mapowanie wyszukiwania. Próbowałem znaleźć jakąś funkcję na trzech literach wejściowych, która dała unikalną wartość, która była również wartością drukowalną ASCII, dzięki czemu mogłem osadzić mapowanie w ciągu jednego znaku na dane wejściowe.
Okazuje się, że macierz pomnożąca znaki w indeksie
[1 2 8]
przez macierz całkowitą,[1;15;47]
a następnie wykonująca mod 124 daje unikalne wartości, które wszystkie drukowane ASCII (i żadna z nich nie jest'
znakiem, który błędnie literałby ciąg znaków). Przyjemnie kończy się mapowanie,TIO
co jest całkowicie przypadkowe. Co ciekawe, jest to jedyne odwzorowanie tego równania, które daje 26 unikalnych drukowalnych znaków ASCII.Więc w zasadzie to moje mapowanie i obliczanie odnośników. Wykonanie wyszukiwania to po prostu wykonanie obliczeń i porównanie z mapowaniem. Dodanie
'A'-1
do indeksu na mapie powoduje powstanie znaku AZ.Możesz wypróbować go online na TIO, który pokazuje pełne mapowanie wejść i wyjść. Dla kompletności pełne mapowanie znajduje się również poniżej:
+32
.'A':'Z'
zamiast znajdowania.źródło
JavaScript (Chrome), 102
Uwaga Niestety działa tylko w Chrome, z powodu aproksymacji zależnych od implementacji w parseInt () (dzięki @Arnauld)
Szukałem funkcji skrótu, biorąc kawałek każdego imienia, konwertując na liczby za pomocą bazy 36, a następnie stosując modulo.
Użyłem tego kodu, aby znaleźć najlepszy skrót:
A wyniki:
Najlepsza funkcja skrótu daje 26 różnych wartości od 0 do 50, ale użyłem innej, z 1 zduplikowanym, ale mniejszym zakresem.
Test
źródło
parseInt()
.C,
655549 bajtówh(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;}
Takie samo podejście jak odpowiedź KSab . C nie zapewnia
hash
funkcji łańcuchowej takiej jak Python. A może to?Wypróbuj online!
h
zwraca wartość, dlaint
której wartości są kodami ASCIIA .. Z
.źródło
JavaScript, 98 bajtów
Przekonałem się, że kombinacja drugiej i czwartej postaci imion jest unikalna dla każdego z nich.
Dlatego tworzę ciąg z kombinacjami
name[4] + name[2]
, niename[2] + name[4]
lub chciałbym powtórzyć grupę chareh
o imieniu Aretha Franklineh
i kiedy Smokey Robinson i Johnny Cashoehn
są konkatenowani.Mógłbym po prostu przenieść Johnny'ego Casha do innej pozycji ciągu i uzyskać inne odwzorowanie, ale połączenie czwartego i drugiego znaku w tej kolejności pozwala uniknąć kolizji i pozostawia nienaruszoną kolejność zestawu danych bez zwiększania długości rozwiązania. Postanowiłem więc pójść tą drogą (to tylko osobiste preferencje)
Poszukuję pozycji konkatenacji czwartej i drugiej litery danego parametru w ciągu i dzielę go przez 2, aby uzyskać liczbę od 0 do 25. Następnie dodam 10 i przekonwertuję go na ciąg z podstawy 36, gdzie 10 odpowiada
a
i 35 doz
źródło
Wolfram Language (Mathematica) , 101
126bajty+32
wydaje się prowadzić do najkrótszego mieszania tablicy w MathematicaInputForm
.Wypróbuj online!
źródło
///,
390231 bajtówWypróbuj online!
231 bajtów po usunięciu nowego wiersza.
Jest to bardzo długie, ale /// nie może ogólnie obsługiwać różnych znaków. Innymi słowy, /// nie obsługuje wyrażenia regularnego.
źródło
Excel, 96 bajtów
Po zbyt długim czasie marnowania na inne podejścia, wdrożyłem podejście @Eduardo Paez:
źródło