26 Şarkıcı, 26 Harf


34

RollingStone'a göre , tüm zamanların en iyi 26 şarkıcısı aşağıdadır:

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

Bunu burada bir dizi listesi olarak alabilirsiniz .

Görev

Bir şarkıcı adı verildiğinde, bu şarkıcıyı benzersiz şekilde tanımlayan bir mektup yazdırabilir veya geri Agönderebilirsiniz Z. (Kodunuz Bob Dylan için A döndürürse , başka bir şarkıcı için A döndüremez .)

Diğer benzer zorlukların aksine , haritalama çarpışma içermediği sürece size bağlıdır .

kurallar

  • Giriş, yukarıda belirtilen tam yazım ve baştaki veya sondaki boşluk olmadan yukarıda listelenen 26 şarkıcı adından biri olarak garanti edilir.
  • Mektubu küçük veya büyük harf olarak yazdırabilirsiniz. Ancak tutarlı olmalı.
  • 26 olası girişin tümü için bir test paketi sağlamanız önerilir.
  • Bu , yani bayt cinsinden en kısa cevap kazanır!


17
Sevgili Rolling Stone: Bob Dylan gerçekten gelmiş geçmiş en iyi müzisyenlerden biri. Ama harika bir şarkıcı ?
Luis Mendo,

Ben de (aynı bu seçimler birkaç hakkında biraz tuzlu olduğum @LuisMendo öksürük öksürük Steve Tyler öksürük )
Rab Farquaad

@ LordFarquaad Steve Tyler 99 yaşında # 99 _ \ _ (ツ) _ / ¯
Arnauld

bu birine yardımcı olabilir, ancak bilgiyi kullanmak için CG becerim yok: isimlerin 1-6, 1-8 ve 3-5 harfleri benzersiz birleşimlerdir.
Jeutnarg

Yanıtlar:


2

MATL , 28 bayt

s98\40\2Y2'ijkl o qst uz'hw)

Çevrimiçi deneyin!

açıklama

s98\40\

Örtülü giriş dizesini alın. Giriş dizesinin karakterlerini 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 toplayın ve bunu 98 modülünü ve ardından 40 modülünü yapın. Aşağıdaki sayılardan birinde sonuçlanır: (Pastebin listesinin sıralamasına göre).

2Y2'ijkl o qst uz'h

(Küçük harf) alfabesini ile birlikte itin 2Y2. Bu, [1,26] aralığında sayıları önemser. Bununla birlikte, bazı rakamlar eksik ve 38'e kadar rakamlarımız var. Dolayısıyla, hbu rakamları 'eksik' harflerle eşleştirerek daha yüksek rakamlarla ilgilenen bir dize ( ) ekleriz. Boşluklar herhangi bir şey olabilir, kendi programım için orijinal programımda büyük harfler kullandım.

w)

Şimdi ilk adımdaki sayıyı, ikinci adımdaki dizgeye dizine ekleyebiliriz ). wArgümanları doğru sırada almak için kullanıyoruz . 0-tabanlı indeksleme kullanıyor olsak da (sayılar 0'dan 38'e kadar değişiyor ve dize 39 karakter uzunluğunda), gerçekte gerçekte biraz daha karmaşık: 1-tabanlı modüler indekslemeyi kullanıyoruz: Matl. Bu araçlar bu 1indeksleri için a, 38aslında hiç endeksleri uve 0final endeksleri zdize.


23

Python 2 , 80 71 bayt

def f(s):i=sum(map(ord,s))%98%40;return chr(i-i/26*18+i/32*3-i/37*8+65)

Çevrimiçi deneyin!

Modded ordinallerin toplamları arasında 0ve arasındaki sayıları verir.38

25'ten büyük sayılar daha sonra aşağıdaki gibi boşlukları doldurmak için kaydırılır (gösterilen sıralama):

  0  1  2  3  4  5  6  7  8  -  -  -  - 13 14  - 16  - 18  -  -  - 22 23 24 25  - 27 28 29 30  - 32  - 34 35 36  - 38

Çıkar 18eğer i>25:

  0  1  2  3  4  5  6  7  8  -  -  -  - 13 14  - 16  - 18  -  -  - 22 23 24 25
                          - 27 28 29 30  - 32  - 34 35 36  - 38

Ekle 3eğer i>31:

  0  1  2  3  4  5  6  7  8  -  -  -  - 13 14  - 16  - 18  -  -  - 22 23 24 25
                          - 27 28 29 30  
                                                  - 32  - 34 35 36  - 38

Çıkar 8eğer i>37:

  0  1  2  3  4  5  6  7  8  -  -  -  - 13 14  - 16  - 18  -  -  - 22 23 24 25
                          - 27 28 29 30  
                                                  - 32  - 34 35 36  
                                            - 38

Dizi verir 0..25

  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Bunlar daha sonra dönüştürülür A-Zilechr(i+65)


Sana kısaltmak düşünüyorum (i>31)için i/32vb
XNOR

21

6502 makine kodu rutini (C64), 83 bayt

20 FD AE 20 9E AD 85 FC 20 A3 B6 A9 79 85 FB A0 00 84 FD B1 22 10 03 69 A0 18
45 FD 65 FB 85 FD E6 FB C8 C4 FC D0 EC E9 29 B0 FC 69 29 C9 1A 90 1C 29 0F C9
0D 90 04 69 09 90 12 C9 02 F0 0F C9 08 D0 04 A9 06 D0 06 C9 0C D0 02 A9 11 18
69 41 4C D2 FF

Bu, pozisyondan bağımsız bir koddur, sadece RAM'de bir yere koyun ve oraya atlayın, örneğin syskomutu kullanarak .

Çevrimiçi demo ($C000/yükler49152).

Kullanım: sys49152,"[name]" örn sys49152,"Aretha Franklin".

Önemli: Program diskten yüklendiyse (çevrimiçi demodaki gibi), newönce bir komut verin! Bir makine programı yüklemek bazı C64 BASIC imleçleri çöktüğü için bu gereklidir.

Not: C64 varsayılan olarak küçük harf içermeyen bir moddadır - girebilmek için okunabilir adları için tuşuna basarak önce küçük harf moduna geçin.SHIFT +CBM .


açıklama

Asıl zorluk, bu isimler için minimal mükemmel bir hash işlevi bulmaktır; C64 için basit 8bit işlemlerde kolayca hesaplanabilecek birini bulmalıydım. Yorumlanmış bir sökme listesi:

.C:c000  20 FD AE    JSR $AEFD          ; consume comma
.C:c003  20 9E AD    JSR $AD9E          ; evaluate expression
.C:c006  85 FC       STA $FC            ; save string length
.C:c008  20 A3 B6    JSR $B6A3          ; free string
.C:c00b  A9 79       LDA #$79           ; value for adding during hashing
.C:c00d  85 FB       STA $FB
.C:c00f  A0 00       LDY #$00           ; offset for reading string
.C:c011  84 FD       STY $FD            ; and initial hash value
.C:c013   .hashloop:
.C:c013  B1 22       LDA ($22),Y        ; read next character from string
.C:c015  10 03       BPL .xor           ; if bit 8 set (shifted)
.C:c017  69 A0       ADC #$A0           ; translate to same unshifted character
.C:c019  18          CLC
.C:c01a   .xor:
.C:c01a  45 FD       EOR $FD            ; xor with previous hash
.C:c01c  65 FB       ADC $FB            ; add offset
.C:c01e  85 FD       STA $FD            ; store new hash
.C:c020  E6 FB       INC $FB            ; increment offset
.C:c022  C8          INY
.C:c023  C4 FC       CPY $FC
.C:c025  D0 EC       BNE .hashloop      ; repeat until last character
.C:c027   .modloop:
.C:c027  E9 29       SBC #$29           ; subtract $29 until
.C:c029  B0 FC       BCS .modloop       ; underflow, then
.C:c02b  69 29       ADC #$29           ; add once again ( => mod $29)
.C:c02d  C9 1A       CMP #$1A           ; value in hash range?
.C:c02f  90 1C       BCC .tochar        ; -> output
.C:c031  29 0F       AND #$0F           ; mask lowest 4 bits only
.C:c033  C9 0D       CMP #$0D           ; greater 12 ?
.C:c035  90 04       BCC .fixedvals     
.C:c037  69 09       ADC #$09           ; then just add 10 (9 plus carry)
.C:c039  90 12       BCC .tochar        ; and done -> output
.C:c03b   .fixedvals:
.C:c03b  C9 02       CMP #$02           ; 2 becomes 3 by adding
.C:c03d  F0 0F       BEQ .tochar2       ; with carry (jump after the CLC)
.C:c03f  C9 08       CMP #$08           ; if value was 8
.C:c041  D0 04       BNE .check2
.C:c043  A9 06       LDA #$06           ; new value is 6
.C:c045  D0 06       BNE .tochar        ; and output
.C:c046   .check2:
.C:c047  C9 0C       CMP #$0C           ; else if value was 12
.C:c049  D0 02       BNE .tochar
.C:c04b  A9 11       LDA #$11           ; new value is 17
.C:c04d   .tochar:
.C:c04d  18          CLC
.C:c04d   .tochar2:
.C:c04e  69 41       ADC #$41           ; add character code for 'a'
.C:c050  4C D2 FF    JMP $FFD2          ; jump to kernal CHROUT routine

Test paketi (C64 BASIC, datasatırlar halinde makine kodunu içeren )

0fOa=49152to49234:rEb:pOa,b:nE:pO53272,23
1sY49152,"Aretha Franklin":?":Aretha Franklin"
2sY49152,"Ray Charles":?":Ray Charles"
3sY49152,"Elvis Presley":?":Elvis Presley"
4sY49152,"Sam Cooke":?":Sam Cooke"
5sY49152,"John Lennon":?":John Lennon"
6sY49152,"Marvin Gaye":?":Marvin Gaye"
7sY49152,"Bob Dylan":?":Bob Dylan"
8sY49152,"Otis Redding":?":Otis Redding"
9sY49152,"Stevie Wonder":?":Stevie Wonder"
10sY49152,"James Brown":?":James Brown"
11sY49152,"Paul McCartney":?":Paul McCartney"
12sY49152,"Little Richard":?":Little Richard"
13sY49152,"Roy Orbison":?":Roy Orbison"
14sY49152,"Al Green":?":Al Green"
15sY49152,"Robert Plant":?":Robert Plant"
16sY49152,"Mick Jagger":?":Mick Jagger"
17sY49152,"Tina Turner":?":Tina Turner"
18sY49152,"Freddie Mercury":?":Freddie Mercury"
19sY49152,"Bob Marley":?":Bob Marley"
20sY49152,"Smokey Robinson":?":Smokey Robinson"
21sY49152,"Johnny Cash":?":Johnny Cash"
22sY49152,"Etta James":?":Etta James"
23sY49152,"David Bowie":?":David Bowie"
24sY49152,"Van Morrison":?":Van Morrison"
25sY49152,"Michael Jackson":?":Michael Jackson"
26sY49152,"Jackie Wilson":?":Jackie Wilson"
27dA32,253,174,32,158,173,133,252,32,163,182,169,121,133,251,160,0,132,253,177
28dA34,16,3,105,160,24,69,253,101,251,133,253,230,251,200,196,252,208,236,233
29dA41,176,252,105,41,201,26,144,28,41,15,201,13,144,4,105,9,144,18,201,2,240
30dA15,201,8,208,4,169,6,208,6,201,12,208,2,169,17,24,105,65,76,210,255

Test paketinin çevrimiçi demosu .


13

Python 2,68 bayt

def f(n):i=hash(n)%337%125%45;return chr(65+i-i/25*2-i/29*21+i/35*2)

Çevrimiçi deneyin!


1
Bunu nasıl bestelediğini bilmek ilginç
Sarge Borsch

2
@SargeBorsch hash (n) her ad için benzersiz bir tam sayı hesaplar. Modulo işlemleri hala bu kayıtları benzersiz tutar, ancak değerlerini düşürür. İkinci kısım ( chr(65+i-i/25*2-i/29*21+i/35*2)) TFelds cevabına benzer . Modulo işlemleri zaten burada ve burada kullandığım bir betik tarafından kabadayılıkla desteklendi .
ovs

10

Javascript, 138 132 karakter

Baş harflerin tümü benzersiz olduğundan, MJ= M ichael J ackson / M ick J agger dışında, özellikle Michael Jackson'ı ( h4. sırada olan tek kişi) kontrol ediyorum ve diğer isimlerden sonra baş harfleri olan bir dize oluşturdum benzersiz bir mektupla.

s=>s[3]=='h'?'y':"AFaRCbEPcSCdJLeMGfBDgORhSWiJBjPMCkLRlROmAGnRPoMJpTTqFMrBMsSRtJCuEJvDBwVMxJWz".split(s.replace(/[^A-Z]/g,''))[1][0]

Kod Parçacığı

Burada dene:

var solution =
s=>s[3]=='h'?'y':"AFaRCbEPcSCdJLeMGfBDgORhSWiJBjPMCkLRlROmAGnRPoMJpTTqFMrBMsSRtJCuEJvDBwVMxJWz".split(s.replace(/[^A-Z]/g,''))[1][0]

var testnames = [
"Aretha Franklin",
"Ray Charles",
"Elvis Presley",
"Sam Cooke",
"John Lennon",
"Marvin Gaye",
"Bob Dylan",
"Otis Redding",
"Stevie Wonder",
"James Brown",
"Paul McCartney",
"Little Richard",
"Roy Orbison",
"Al Green",
"Robert Plant",
"Mick Jagger",
"Tina Turner",
"Freddie Mercury",
"Bob Marley",
"Smokey Robinson",
"Johnny Cash",
"Etta James",
"David Bowie",
"Van Morrison",
"Michael Jackson",
"Jackie Wilson"
];
testnames.forEach(name=>document.body.append( solution(name) ));


Daha kısa bir karma işlevi olabilir, ancak bir insanın yapabileceği bir şeyi denemek fikrini seviyorum. Bununla birlikte, JSFiddle'a bağlanmak yerine kod pasajı özelliğini kullanmak isterdim.
saat

@ trlkly Şimdi kod pasajı özelliğini kullandım.
nl-x

7

Java (OpenJDK 8) , 128 126 115 113 bayt

Java gönderimi için çok perişan değil!

Bana lambda ifadeleriyle bir sürü baytı kurtardığın için teşekkürler!

s->{int a=0;for(int i:s.substring(1,6).getBytes())a+=i;a*=a==431?0.108:2.65108;return(char)(a==1341?70:a%26+65);}

Çevrimiçi deneyin!


1
Güzel cevap, benden +1. Şu anda bir senaryo oluşturarak da bir Java çözümü üzerinde çalışıyorum .. Şimdiye kadar şans yok. Btw yapabilirsiniz golf iki değiştirerek bayt {a+=i;}içina+=i;
Kevin Cruijssen

1
@KevinCruijssen Şerefe, bunu kaçırdığıma inanamıyorum! Bana 0 ile 25 arasında benzersiz değerler verecek olan 'sihirli sayıyı' denemek ve bulmak için bir senaryo yazdım, ancak yapabileceğimin en iyisi 24'dü, sonuçta if if'leri.
Luke Stevens

1
Hmm btw Java 8 kullanıyorsanız beri, sen ayrıca golf char g(String s)için s->. Yalnızca Java 7 yöntemlerine alışıksanız, TIO'nuzu nasıl yapacağınızı göstermek için değiştirdim.
Kevin Cruijssen

Teşekkürler, bunu yapabileceğinizi hiç anlamadım, gönderimimi tekrar güncelleyeceğim (tekrar!)
Luke Stevens

Hahaha, bunun için yeni olduğumu söyleyebilirsin
Luke Stevens

5

Python 3, 132 99 96 bayt

lambda m:chr(98+"ԇ̲ЙГ̫ѼӿИԸՋжʾҍϴЬֺΝעЕΞϾҞ֜ӣ֪".find(chr(sum(map(ord,m)))))

Çevrimiçi deneyin!

Zekice golf oynamadım, ama bunu başarabileceğimi düşündüm.

TFeld tarafından yapılan değişiklikler sayesinde -33 bayt. Ovs yerine
3 byte kullanarak .findindex


6 bayt kullanarak tasarruf edebilirsiniz sum(map(ord,m)), ayrıca 128 bayt için Aretha Franklin'i de ekledim
TFeld

Ve chr(97+...)bunun yerine kullanabilirsiniz ascii_lowercase: 99 bayt
TFeld

1
Peki ya bir açıklama?
Matsemann

3
Açıklama: sum(map(ord,m))Dizedeki karakterlerin ASCII değerlerini mtoplar (702-1506 aralığında tamsayılar verir). Sonra çağıran chro sayı ile bir (Unicode) karaktere dönüştürüp: chr(702)olduğu ʾ için chr(1506) = עaradaki ve çok. Bu çözüm, bu karakteri basitçe (26) dizini (0–26) almak için bu tür karakterlerin bir listesinde arar, daha sonra ASCII kodu 97 + ile o dizini (yani 'a' dan 'z' ye) döndürür.
ShreevatsaR

1
Mevcut çözümünüz hala 99 byte versiyon içeriyor. OVS'nin sürümünü kullanmak mı istediniz?
nl-x

5

PHP, 90 88 86 72 + 1 bayt

farklı bir modülo ile daha da kısaltılabilir.

<?=strtr(chr(hexdec(substr(md5($argn),0,2))%65+58),"^<adins",bcfgqvx)&_;

Dosyaya kaydedin ve boru olarak çalıştırın -nFveya çevrimiçi deneyin .


2
Aretha Franklin ve Paul McCartney hem Wtest vakalarınızda çıktılar hem de çıktılar yok X. Kodun kendisinde bir hata mı, yoksa sadece çevrimiçi çevirmeyi mi deneyeceğinizi bilmiyorum :)
crazyloonybin 10:17

1
@crazyloonybin değiştirme yazım hatası düzeltildi. İpuçları için teşekkürler.
Titus

Peki bunu nasıl çalıştırırım? 'Çevrimiçi deneyin' kodunuz bu <?=kısmı kullanmıyor . Ve 'Boru gibi koş' çalışmayacağım. Ayrıca, komut satırından çalıştırmayı denediğimde uyarılar alıyorum.
nl-x

@Titus: CodeGolf'ta istenen çıktıyı üreten (sadece) tüm işlevi veya uygulamayı vermelisiniz. Aşina oldum <?=... Öyleyse sorum hala, kodunuzu nasıl çalıştırabilirim (komut satırından)? $argnKomut satırında beslemekte başarısız oluyorum ... Şimdiye kadar yaptığım tüm denemelerden biri de eserler veriyor ve hala çalışması için daha fazla kod gerektiriyor gibi görünüyor.
nl-x

@ nl-x PHP'niz fark eder, çünkü n seçeneğini belirtmediniz: echo <input> | php -nF <scriptfilename>
Titus

4

Perl, 56 , 54 , 50 , 46 + 1 (-p) bayt

$ = kripto $ , DT; / .. (.) /; $ _ = $ 1; y / 01268ADIJNVW / adhilmnpqsux /

$ = crypt $ , DT; / .. (.) /; $ = $ 1; y / 01268JVW / hlmpqsux /; $ = lc

$ = kripto $ , mO; / .. (.) /; $ = $ 1; y / 035eft / AHPRXZ /; $ = lc

Dom'un yorumu sayesinde 4 bayt daha fazla tasarruf sağlayabilir, ayrıca daha iyi isteklere uyacak şekilde büyük harfe dönüştürülebilir.

$_=crypt$_,mO;y/035eft/AHPRXZ/;/..(.)/;$_=uc$1

Çevrimiçi Deneyin


Güzel yaklaşım! Bence tam olarak çağrılabilir bir fonksiyon yazmanız / puan vermeniz gerekiyor?
Felix Palmen

@FelixPalmen, satır içi olarak adlandırılabilecek bir perl programı: perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'
üçlüye

Güzel! Benzer bir yaklaşım arıyor, kullanıyor $1^$2ancak kullanmayı düşünmüyordum crypt... Bazı siparişlerde 4 byte tasarruf edebilirsiniz: Çevrimiçi deneyin!
Dom Hastings

4

Python 2, 50 43 bayt

Yeni sürüm için japh e kredi

lambda n:chr(hash(n)%2354%977%237%54%26+65)

Çevrimiçi deneyin!

Not: Bu, hashyerleşik yapıya bağlıdır ve tüm uygulamalarda çalışmayacaktır.


43 bytes:lambda n:chr(hash(n)%2354%977%237%54%26+65)
japh

japh Güzel! Benim python kaba kuvvet denetleyicisi açıkça yeterince hızlı değildi;)
KSab

3

Ruby, 63 bayt

->s{((0x3c4001c151861b27d>>s.sum%98%66).to_s(2).sum%48+64).chr}

Girişin ascii kodlarını ekler, onları mod 98 ve daha sonra 26 benzersiz sayılardan birini almak için mod 66 alır. n alır. Büyük onaltılık sayı, 1bu 26 yerin her birinde bir bit içerir , bu nedenle hakları değiştirerek niçinde 1..26 1biti olan bir sayı elde ederiz . 1Ascii kodlarını ekleyerek ve mod 48 alarak bitleri sayar , sonra 64 ekler ve bir ASCII koduna dönüştürürüz.

Test programı

mapharfli kod ve şarkıcı baskı şarkıcılar arasında dolaşır. Daha sonra sort, her harfin bir kez kullanıldığını göstermek için düzenlenen harf kodlarının bir dizisini döndürür .

f=->s{((0x3c4001c151861b27d>>s.sum%98%66).to_s(2).sum%48+64).chr}
a= [
  "Aretha Franklin","Ray Charles",
  "Elvis Presley","Sam Cooke",
  "John Lennon","Marvin Gaye",
  "Bob Dylan","Otis Redding",
  "Stevie Wonder","James Brown",
  "Paul McCartney","Little Richard",
  "Roy Orbison","Al Green",
  "Robert Plant","Mick Jagger",
  "Tina Turner","Freddie Mercury",
  "Bob Marley","Smokey Robinson",
  "Johnny Cash","Etta James",
  "David Bowie","Van Morrison",
  "Michael Jackson","Jackie Wilson"
]

p a.map{|i|p [f[i],i];f[i]}.sort

Çıktı

["S", "Aretha Franklin"]
["E", "Ray Charles"]
["R", "Elvis Presley"]
["J", "Sam Cooke"]
["X", "John Lennon"]
["C", "Marvin Gaye"]
["M", "Bob Dylan"]
["W", "Otis Redding"]
["V", "Stevie Wonder"]
["Y", "James Brown"]
["D", "Paul McCartney"]
["Q", "Little Richard"]
["Z", "Roy Orbison"]
["P", "Al Green"]
["O", "Robert Plant"]
["K", "Mick Jagger"]
["N", "Tina Turner"]
["L", "Freddie Mercury"]
["G", "Bob Marley"]
["I", "Smokey Robinson"]
["A", "Johnny Cash"]
["F", "Etta James"]
["H", "David Bowie"]
["U", "Van Morrison"]
["B", "Michael Jackson"]
["T", "Jackie Wilson"]
["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 

3

Octave , 85 83 80 74 bayt

@(n)('A':'Z')(mod(n([1 2 8])*[1;15;47],124)=='#iZo,gp<C&4Y1!8-G`Kn3wtTIO')

Bu isimsiz bir karmaşa, verileri kodlamak için iyi bir yol bulmaya çalışan MATLAB'daki bazı karışıklıkların sonucudur.

Temel olarak hızlı bir analizden sonra, her girdiden benzersiz bir değer üretmek için girdi dizisinin yalnızca 1,2 ve 8 numaralı harfleri (en küçük dize 8 karakterdir, bu yüzden biz iyiyiz) gerekir. Zor kısım daha sonra bu eşsiz değeri kullanışlı bir şeye dönüştürmektir.

MATLAB veriyi sıkıştırmakta berbat, bu yüzden arama haritalamasını yapmak için başka bir yol aramalıydım. Eşleştirmeyi her giriş için bir karakterlik bir dizgeye gömmek için yazdırılabilir bir ASCII değeri olan benzersiz bir değerle sonuçlanan üç giriş harfinde bazı işlevler bulmaya çalışıyorum.

Matrisin indeksindeki karakterleri [1 2 8]tamsayı matrisi [1;15;47]ile çarpması ve daha sonra mod 124'ü gerçekleştirmesi, tüm yazdırılabilir ASCII'nin (ve hiçbirinin 'string değişmezlerini bozacak bir karakter olmadığı) benzersiz değerlerle sonuçlandığını ortaya koymaktadır . Memnuniyetle haritalama TIOtamamen tesadüfi olan ile sona erer . İlginçtir ki, bu 26 benzersiz yazdırılabilir ASCII karakterleri veren bu denklem için tek haritalamadır .

Yani temelde bu benim arama haritalama ve hesaplama. Arama yapmak basitçe hesaplama yapmak ve haritalama ile karşılaştırmak için bir durumdur. 'A'-1Haritadaki dizine eklemek, AZ karakteriyle sonuçlanır.

Şunları yapabilirsiniz çevrimiçi denemek giriş ve çıkışlar tam eşleme gösterir TIO, üzerinde. Tamlık için tam haritalama da aşağıdadır:

'Aretha Franklin' ==> B
'Ray Charles'     ==> S
'Elvis Presley'   ==> F
'Sam Cooke'       ==> V
'John Lennon'     ==> L
'Marvin Gaye'     ==> N
'Bob Dylan'       ==> C
'Otis Redding'    ==> Q
'Stevie Wonder'   ==> X
'James Brown'     ==> I
'Paul McCartney'  ==> R
'Little Richard'  ==> M
'Roy Orbison'     ==> T
'Al Green'        ==> A
'Robert Plant'    ==> U
'Mick Jagger'     ==> P
'Tina Turner'     ==> Y
'Freddie Mercury' ==> H
'Bob Marley'      ==> D
'Smokey Robinson' ==> W
'Johnny Cash'     ==> K
'Etta James'      ==> G
'David Bowie'     ==> E
'Van Morrison'    ==> Z
'Michael Jackson' ==> O
'Jackie Wilson'   ==> J

  • Kaldırmak için eşleme ince ayarlı 2 bayt +32.
  • Sadece Octave'yi yaparak 'A':'Z'değil, mantıksal dizinlemeyi kullanarak 3 bayt kurtardı .
  • Matris çarpımını kullanarak çarpımların toplamını yaparak 6 bayt kurtardı.

Akıllıca bir yaklaşım, belki de çok zekice? MATL cevabımı temel alan 53 bayt
Sanchises 12:17

Muhtemelen @Schchises, ama (_ (ツ) _ / came ile geldi benim yaklaşım oldu. Sürümünüzü ayrı bir cevap olarak gönderebilirsiniz.
Tom Carpenter,

Farklı yaklaşımlara sahip olmanın, en kısa yaklaşımı kopyalamaktan daha ilginç olduğuna karar verdim. Ben sadece yaklaşımları karşılaştırmak istedim, sanırım seninki daha zeki ama sanırım sadece mod tabanlı bir yaklaşım için izin verilen veri setini kabul ediyorum (bunun bir tesadüf mü yoksa istatistiki olarak muhtemel mi olduğundan emin değilim)
Sanchises 12:17

3

JavaScript (Chrome), 102

Not Ne yazık ki, parseInt () öğesinde uygulamaya bağlı yaklaşımlar nedeniyle yalnızca Chrome'da çalışır (thanks @Arnauld)

s=>s[0]=='L'?'z':"ab.c..defghijklmn...o..pqrst.u.vwxy"[parseInt(s.replace(/ /,'o').slice(0,14),36)%35]

Her ismin bir dilimini alarak, baz 36'yı kullanarak sayılara çevirip sonra bir modulo uygulayarak bir karma işlevi aradım.

En iyi hash aramak için bu kodu kullandım:

x=`Al Green\nAretha Franklin\nBob Dylan\nBob Marley\nDavid Bowie\nElvis Presley\nEtta James\nFreddie Mercury\nJackie Wilson\nJames Brown\nJohn Lennon\nJohnny Cash\nLittle Richard\nMarvin Gaye\nMichael Jackson\nMick Jagger\nOtis Redding\nPaul McCartney\nRay Charles\nRobert Plant\nRoy Orbison\nSam Cooke\nSmokey Robinson\nStevie Wonder\nTina Turner\nVan Morrison`.split(`\n`)

max=0
for(m=26;m<60;m++)
  for(i=0;i<20;i++)
    for(j=i;++j<20;)
      for(k=0;k<37;k++)
      {
        S=new Set();
        f=k ? (k-1).toString(36) : ''
        x.forEach(x=>(n=parseInt(x.replace(/ /,f).slice(i,j),36)%m, S.add(n)))
        if (S.size > max) console.log(i,j,f,m,max=S.size)
      }

Ve sonuçlar:

0 1 "" 26 14
0 2 "" 26 15
0 4 "" 26 16
0 5 "" 26 18
0 6 "0" 26 19
0 6 "3" 26 20
0 8 "a" 26 21
2 5 "7" 28 23
0 14 "h" 35 24
0 14 "o" 35 25
2 9 "" 51 26

En iyi karma işlevi 0 ile 50 arasında 26 farklı değer verir, ancak 1 çoğaltılmış ancak daha küçük bir aralık ile farklı bir değer kullandım.

Ölçek

var names=x=`Al Green\nAretha Franklin\nBob Dylan\nBob Marley\nDavid Bowie\nElvis Presley\nEtta James\nFreddie Mercury\nJackie Wilson\nJames Brown\nJohn Lennon\nJohnny Cash\nLittle Richard\nMarvin Gaye\nMichael Jackson\nMick Jagger\nOtis Redding\nPaul McCartney\nRay Charles\nRobert Plant\nRoy Orbison\nSam Cooke\nSmokey Robinson\nStevie Wonder\nTina Turner\nVan Morrison`.split(`\n`)

var F=
s=>s[0]=='L'?'z':"ab.c..defghijklmn...o..pqrst.u.vwxy"[parseInt(s.replace(/ /,'o').slice(0,14),36)%35]

var Singers={}
names.forEach(n=>Singers[F(n)]=n)

;Object.keys(Singers).sort().forEach(i=> console.log(i, Singers[i]))


Sen sadece nedeniyle Chrome'da çalıştığını belirtmek isteyebilir uygulama bağımlı yaklaşımlar içinde parseInt().
Arnauld,

@Arnauld, ben bilmiyordum.
edc65

3

C, 65 55 49 bayt

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'ın cevabı ile aynı yaklaşım . C, hashPython gibi bir string işlevi sağlamıyor . Yoksa öyle mi?

h(char*s){return*(long*)s%2004%857%361%94%26+65;}

Çevrimiçi deneyin!

hintdeğerleri ASCII kodları olan bir döndürür A .. Z.


2

Javascript, 98 bayt

s=l=>("heCysvCm hirDb iiesm ultOyr rb c ndeMbeonh tdvMnacic".indexOf(l[4]+l[2])/2+10).toString(36)

İsimlerin 2. ve 4. karakterlerinin kombinasyonunun her biri için benzersiz olduğunu buldum.

Bu nedenle name[4] + name[2], Aretha Franklin adındaki name[2] + name[4]karakter grubunun tekrarı veya Smokey Robinson ve Johnny Cash'in kombinasyonlarını içeren bir dizi oluşturdum.ehehoehn birleştiği .

Johnny Cash'i ipin başka bir pozisyonuna taşıyabilir ve farklı bir haritalama elde edebilirim, ancak 4. ve 2. karakterleri bu sırada birleştirerek çarpışmayı önler ve veri seti sırasını çözüme daha fazla uzunluk eklemeden bozulmadan bırakır. Bu yüzden bu yoldan gitmeye karar verdim (sadece kişisel tercih)

Verilen parametrenin 4. ve 2. harflerinin bir araya getirme pozisyonunu dizede arar ve 0 ile 25 arasında bir sayı alabilmek için onu 2'ye bölerim. 10, karşılık gelen ave 35 olanz

let singers = [
  "Aretha Franklin",
  "Ray Charles",
  "Elvis Presley",
  "Sam Cooke",
  "John Lennon",
  "Marvin Gaye",
  "Bob Dylan",
  "Otis Redding",
  "Stevie Wonder",
  "James Brown",
  "Paul McCartney",
  "Little Richard",
  "Roy Orbison",
  "Al Green",
  "Robert Plant",
  "Mick Jagger",
  "Tina Turner",
  "Freddie Mercury",
  "Bob Marley",
  "Smokey Robinson",
  "Johnny Cash",
  "Etta James",
  "David Bowie",
  "Van Morrison",
  "Michael Jackson",
  "Jackie Wilson"
]

s=l=>("heCysvCm hirDb iiesm ultOyr rb c ndeMbeonh tdvMnacic".indexOf(l[4]+l[2])/2+10).toString(36)

singers.forEach(singer => console.log(s(singer), singer))


Bulduğun kombinasyonu çok cleaver!
Joyal

aaah evet. ders dışı. oldukça benzer bir şey var, ancak dizgede döndürmek için karakter eklemek yerine, durumun konumu 25 karakter kazandırabilir. Zeki!
nl-x


1

///, 390 231 bayt

/gg/U/
/a///b///c///d///e///f///g///h///i///j///k///l///m///n///o///p///q///r///s///t///u///v///w///x///y///z//
/ F//
/A //
/ G//
/ M//
/M //
/J B/X/
/J //
/L //
/ R//
/R C/Y/
/S C/Z/
/B D/K/
/ B//
/ J//
/ T//
/S W/I/
/R O/N/
/JU/U/
/R //
/E P/H/
/PC/Q/

Çevrimiçi deneyin!

Yeni satırları kaldırdıktan sonra 231 bayt.

Bu çok uzun, fakat /// farklı karakterleri genel olarak idare edemiyor. Başka bir deyişle, /// regex'i desteklemiyor.


0

Excel, 96 bayt

Diğer yaklaşımları denemek için çok zaman harcandıktan sonra, @Eduardo Paez'in yaklaşımını uyguladık:

=CHAR(FIND(MID(A1,5,1)&MID(A1,3,1),"her DbMbdvsv tdeicsm hnhltirac c i uCyrbOyCmeoie nMn")/2+65)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.