26 นักร้อง 26 ตัวอักษร


34

ตามที่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สำหรับBob Dylanจะไม่สามารถส่งคืนAสำหรับนักร้องคนอื่น ๆ ได้)

ตรงข้ามกับความท้าทายอื่น ๆ ที่คล้ายกันการทำแผนที่ขึ้นอยู่กับคุณตราบใดที่ไม่มีการชนกัน

กฎระเบียบ

  • ข้อมูลเข้ารับประกันเป็นหนึ่งใน 26 ชื่อนักร้องที่ระบุไว้ข้างต้นด้วยการสะกดคำที่แน่นอนและไม่มีช่องว่างนำหน้าหรือต่อท้าย
  • คุณสามารถพิมพ์ตัวอักษรเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ แต่มันจะต้องสอดคล้องกัน
  • ขอแนะนำให้คุณจัดเตรียมชุดทดสอบสำหรับอินพุตที่เป็นไปได้ทั้ง 26 รายการ
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


17
เรียนโรลลิงสโตน: บ็อบดีแลนเป็นนักดนตรีที่ยิ่งใหญ่ที่สุดคนหนึ่งอย่างแท้จริง แต่เป็นนักร้องที่ยอดเยี่ยม?
Luis Mendo

@LuisMendo ฉันรู้สึกเค็มนิดหน่อยเกี่ยวกับตัวเลือกเหล่านี้สองสามอย่างด้วยกัน ( อาการ ไอของสตีฟไทเลอร์แก้ไอ )
Lord Farquaad

@LordFarquaad Steve Tyler คือ# 99 ¯ \ _ (ツ) _ / ¯
Arnauld

นี่อาจช่วยใครซักคน แต่ฉันไม่มีทักษะ CG ในการใช้ข้อมูล: ตัวอักษรชื่อ 1-6, 1-8 และ 3-5 เป็นชุดค่าผสมที่ไม่ซ้ำกัน
Jeutnarg

คำตอบ:


2

MATL , 28 ไบต์

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

ลองออนไลน์!

คำอธิบาย

s98\40\

รับอินพุตสตริงโดยนัย หาผลรวมของอักขระของสตริงป้อนข้อมูลและทำโมดูลัส 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'ijkl o qst uz'h

กด (ตัวพิมพ์เล็ก) 2Y2กับตัวอักษร นี่จะดูแลตัวเลขในช่วง [1,26] อย่างไรก็ตามตัวเลขบางส่วนหายไปและเรามีตัวเลขมากถึง 38 ดังนั้นเราจึงผนวก ( h) สตริงที่ดูแลตัวเลขที่สูงกว่าโดยการจับคู่ตัวเลขเหล่านี้กับตัวอักษร 'หายไป' ช่องว่างสามารถเป็นอะไรก็ได้ฉันใช้อักษรตัวใหญ่ในโปรแกรมดั้งเดิมเพื่อความสะดวกของฉันเอง

w)

)ตอนนี้เราสามารถจัดทำดัชนีตัวเลขตั้งแต่ขั้นตอนแรกเป็นสตริงจากขั้นตอนที่สองกับที่ เราใช้wเพื่อรับอาร์กิวเมนต์ในลำดับที่ถูกต้อง แม้ว่าอาจดูเหมือนว่าเราใช้การจัดทำดัชนีแบบ 0 (ตัวเลขแตกต่างกันจาก 0 ถึง 38 และสตริงมีความยาว 39 ตัวอักษร) ความเป็นจริงนั้นซับซ้อนกว่าเล็กน้อย: เราใช้การทำดัชนีแบบแยกส่วน 1 คุณลักษณะที่ไม่ซ้ำใคร MATL วิธีการนี้ว่า1ดัชนีจะa, 38จริงดัชนีการuและ0ดัชนีสุดท้ายzของสตริง


23

Python 2 , 80 71 ไบต์

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

ลองออนไลน์!

ผลรวมของเลขลำดับ modded ให้ตัวเลขระหว่าง0และ38

ตัวเลขที่มีขนาดใหญ่กว่า 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

ลบ18ถ้า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

เพิ่ม3ถ้า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

ลบ8ถ้า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

ซึ่งให้ลำดับ 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

สิ่งเหล่านี้จะถูกแปลงเป็นA-Zด้วยchr(i+65)


ฉันคิดว่าคุณสามารถตัด(i>31)ให้สั้นลงi/32เป็นต้น
xnor

21

รหัสประจำเครื่อง 6502 (C64), 83 ไบต์

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

นี่คือรหัสที่ไม่ขึ้นอยู่กับตำแหน่งเพียงแค่วางไว้ใน RAM และข้ามไปที่นั่นเช่นใช้sysคำสั่ง

การสาธิตออนไลน์ (โหลดไปยัง$C000/49152)

การใช้งาน: เช่นsys49152,"[name]"sys49152,"Aretha Franklin"

สำคัญ:หากโปรแกรมโหลดจากดิสก์ (เช่นในการสาธิตออนไลน์) ออกnewคำสั่งก่อน! สิ่งนี้มีความจำเป็นเนื่องจากการโหลดโปรแกรมเครื่องจะทำให้พอยน์เตอร์ C64 พื้นฐานบางส่วนเสียหาย

หมายเหตุ:ศตวรรษที่ 64 เป็นค่าเริ่มต้นในโหมดที่ไม่มีตัวพิมพ์เล็ก - เพื่อสามารถที่จะใส่อ่านชื่อสลับไปโหมดพิมพ์เล็กเป็นครั้งแรกโดยการกด+SHIFTCBM


คำอธิบาย

ความท้าทายคือการหาฟังก์ชั่นแฮชที่สมบูรณ์แบบเพียงเล็กน้อยสำหรับชื่อเหล่านี้ สำหรับ C64 ฉันต้องหาสิ่งที่คำนวณได้ง่ายในการทำงานแบบ 8 บิตอย่างง่าย นี่คือรายการถอดแยกชิ้นส่วนที่แสดงความคิดเห็น:

.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

ชุดทดสอบ (C64 BASIC ที่มีชุดคำสั่งเครื่องเป็นdataบรรทัด)

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

สาธิตออนไลน์ของชุดทดสอบ


13

Python 2 , 68 ไบต์

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

ลองออนไลน์!


1
น่าสนใจที่จะทราบว่าคุณเขียนสิ่งนี้อย่างไร
Sarge Borsch

2
@SargeBorsch แฮช (n) คำนวณจำนวนเต็มเฉพาะสำหรับทุกชื่อ การดำเนินการแบบโมดูโลยังคงเอกลักษณ์เหล่านั้นไว้ แต่ลดค่าของพวกเขาลง ส่วนที่สอง ( chr(65+i-i/25*2-i/29*21+i/35*2)) คล้ายกับคำตอบ TFelds การดำเนินการแบบโมดูโลนั้นถูกทำให้เป็นระเบียบโดยสคริปต์ซึ่งฉันได้ใช้ที่นี่และที่นี่แล้ว
ovs

10

Javascript, 138 132 ตัวอักษร

เนื่องจากชื่อย่อทั้งหมดไม่ซ้ำกันยกเว้นสำหรับMJ= M ichael J ackson / M ick J agger ฉันจะตรวจสอบ Michael Jackson โดยเฉพาะ (เฉพาะhตำแหน่งที่ 4 เท่านั้น) และชื่ออื่น ๆ ทั้งหมดที่ฉันสร้างสตริงพร้อมชื่อย่อตามมา โดยจดหมายที่ไม่ซ้ำ

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

ตัวอย่างโค้ด

ลองที่นี่:

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) ));


อาจมีฟังก์ชั่นคร่ำเครียดสั้นกว่า แต่ฉันชอบความคิดในการลองทำสิ่งที่มนุษย์อาจทำได้ อย่างไรก็ตามฉันหวังว่าคุณจะใช้คุณสมบัติข้อมูลโค้ดแทนการเชื่อมโยงไปยัง JSFiddle
trlkly

@trlkly ฉันใช้คุณลักษณะข้อมูลโค้ดตอนนี้
nl-x

7

Java (OpenJDK 8) , 128 126 115 113 ไบต์

อย่าโทรมเกินไปสำหรับการส่งจาวา!

ขอบคุณเควินที่ช่วยฉันประหยัดจำนวนไบต์ด้วยการแสดงออกแลมบ์ดา!

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);}

ลองออนไลน์!


1
คำตอบที่ดี +1 จากฉัน ขณะนี้ฉันกำลังทำงานเกี่ยวกับวิธีแก้ปัญหา Java โดยการสร้างสคริปต์ .. โชคไม่ดีแม้ว่า Btw คุณสามารถเล่นกอล์ฟสองไบต์โดยเปลี่ยน{a+=i;}เป็นa+=i;
Kevin Cruijssen

1
@KevinCruijssen ไชโยไม่อยากจะเชื่อเลยว่าฉันพลาดไป! ฉันเขียนสคริปต์เพื่อลองค้นหา 'หมายเลขมายากล' ที่จะให้ค่าที่ไม่ซ้ำกันระหว่าง 0 ถึง 25 แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ 24 ดังนั้นถ้าคำสั่งท้ายที่สุด
Luke Stevens


ขอบคุณฉันไม่เคยรู้เลยว่าคุณสามารถทำได้ฉันจะอัปเดตการส่งของฉัน (อีกครั้ง!)
Luke Stevens

ฮ่าฮ่าฮ่าคุณสามารถบอกได้ว่าฉันยังใหม่กับสิ่งนี้
ลุคสตีเวนส์

5

Python 3, 132 99 96 ไบต์

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

ลองออนไลน์!

ไม่เล่นกอล์ฟเก่ง แต่ฉันคิดว่าฉันจะเลิกเล่น

-33 ไบต์ขอบคุณการแก้ไขที่ทำโดย TFeld
-3 ไบต์โดยใช้findแทนindexovs


คุณสามารถบันทึก 6 ไบต์โดยใช้sum(map(ord,m))และฉันได้เพิ่มAretha Franklin เป็น 128 ไบต์
TFeld

และคุณสามารถใช้chr(97+...)แทนascii_lowercase: 99 ไบต์
TFeld

1
คำอธิบายเกี่ยวกับอะไร?
Matsemann

3
คำอธิบาย: sum(map(ord,m))เพิ่มค่า ASCII ของอักขระในสตริงm(ให้จำนวนเต็มในช่วง 702–1506) จากนั้นการเรียกchrมันจะแปลงเป็นอักขระ (Unicode) ด้วยหมายเลขนั้น: chr(702)คือʾ ถึงchr(1506) = עจำนวนมาก โซลูชันนี้จะค้นหาตัวละครนี้ในรายการที่เป็นไปได้ทั้งหมด (26) ตัวละครเพื่อรับดัชนี (0–26) จากนั้นส่งคืนอักขระด้วยรหัส ASCII 97 + ดัชนีนั้น (ดังนั้น 'a' ถึง 'z')
ShreevatsaR

1
โซลูชันปัจจุบันของคุณยังมีรุ่น 99 ไบต์ คุณตั้งใจจะใช้เวอร์ชั่นของ OVS หรือเปล่า?
nl-x

5

PHP, 90 88 86 72 + 1 ไบต์

อาจสั้นลงด้วยมอดุโลอื่น

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

บันทึกไปยังแฟ้มและใช้เป็นท่อที่มี-nFหรือลองออนไลน์


2
Aretha Franklin และ Paul McCartney มีทั้งผลลัพธ์Wในกรณีทดสอบของคุณและไม่มีXผลลัพธ์ ไม่ทราบว่ามันเป็นข้อผิดพลาดในรหัสตัวเองหรือเพียงแค่ลองแปลงออนไลน์ :)
crazyloonybin

1
@crazyloonybin การพิมพ์ผิดแทนได้รับการแก้ไข ขอบคุณสำหรับคำใบ้
ติตัส

ดังนั้นฉันจะเรียกใช้สิ่งนี้ได้อย่างไร รหัส 'ลองออนไลน์' ของคุณไม่ได้ใช้<?=ส่วนนั้น และ 'Run as pipe' ฉันไม่ได้ทำงาน นอกจากนี้ฉันยังได้รับแจ้งเมื่อพยายามเรียกใช้จากบรรทัดคำสั่ง
nl-x

@Titus: ใน CodeGolf คุณควรให้ฟังก์ชั่นที่สมบูรณ์หรือแอปพลิเคชั่นที่สร้าง (เฉพาะ) เอาต์พุตที่ต้องการ ฉันคุ้นเคยกับ<?=... ดังนั้นคำถามของฉันยังคงเป็นฉันจะเรียกใช้รหัสของคุณ (จากบรรทัดคำสั่ง) ได้อย่างไร ฉันล้มเหลวในการให้อาหารมัน$argnในบรรทัดคำสั่ง ... ความพยายามทั้งหมดของฉันจนถึงสิ่งประดิษฐ์และดูเหมือนว่ายังต้องใช้รหัสเพิ่มเติมเพื่อให้มันทำงาน
nl-x

@ NL-x อัตราผลตอบแทน PHP ประกาศของคุณ it's เพราะคุณไม่อนุญาตให้ตัวเลือก n ไปนี้:echo <input> | php -nF <scriptfilename>
ติตัส

4

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 ไบต์อีกทั้งยังเปลี่ยนเป็นตัวพิมพ์ใหญ่เพื่อตอบสนองความต้องการที่ดีขึ้น

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

ลองใช้ออนไลน์


วิธีการที่ดี! ฉันคิดว่าคุณต้องเขียน / ให้คะแนนฟังก์ชั่น callable ทั้งหมดได้ไหม?
เฟลิกซ์ Palmen

@ FelixPalmen เป็นโปรแกรม Perl ที่สามารถเรียกได้ว่า inline: perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'เพิ่มลิงก์ไปยัง tio
Nahuel Fouilleul

ดี! กำลังมองหาวิธีการที่คล้ายกันใช้$1^$2แต่ไม่คิดว่าจะใช้crypt... คุณสามารถบันทึก 4 ไบต์ด้วยการสั่งซื้อใหม่: ลองออนไลน์!
Dom Hastings

4

Python 2, 50 43 ไบต์

ขอมอบเครดิตให้กับjaphสำหรับเวอร์ชันใหม่

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

ลองออนไลน์!

หมายเหตุ: สิ่งนี้ขึ้นอยู่กับhashbuiltin และจะไม่ทำงานในการนำไปใช้ทั้งหมด


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

@japh Nice! หลามตัวตรวจสอบแรงเดรัจฉานของฉันไม่ชัดเจนเร็วพอ)
2560

3

ทับทิม, 63 ไบต์

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

เพิ่มรหัส ASCII ของอินพุตใช้เวลาพวกเขา mod 98 และจากนั้น mod 66 เพื่อรับหนึ่งใน 26 หมายเลขที่ไม่ซ้ำกันnในช่วง 0..65 เลขฐานสิบหกขนาดใหญ่มี1บิตในแต่ละสถานที่ 26 เหล่านี้ดังนั้นโดยการเปลี่ยนมันโดยnเราได้ตัวเลขที่มี 1..26 1บิต เรานับจำนวน1บิตด้วยการเพิ่มรหัส ASCII และรับ mod 48 จากนั้นเพิ่ม 64 และแปลงเป็นรหัส ASCII

โปรแกรมทดสอบ

mapiterates ผ่านนักร้องพิมพ์รหัสตัวอักษรและนักร้อง จากนั้นจะส่งกลับอาร์เรย์ของรหัสตัวอักษรซึ่งsortจะแสดงให้เห็นว่ามีการใช้ตัวอักษรแต่ละตัวเพียงครั้งเดียว

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

เอาท์พุต

["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

อ็อกเทฟ , 85 83 80 74 ไบต์

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

ความยุ่งเหยิงของผู้ไม่ประสงค์ออกนามนี้เป็นผลมาจากความยุ่งเหยิงใน MATLAB ที่พยายามค้นหาวิธีที่ดีในการเข้ารหัสข้อมูล

โดยทั่วไปหลังจากการวิเคราะห์อย่างรวดเร็วมีเพียงตัวอักษร 1,2 และ 8 ของสตริงอินพุต (สตริงที่เล็กที่สุดคือ 8 ตัวอักษรดังนั้นเราจึงดี) จำเป็นสำหรับการสร้างค่าที่ไม่ซ้ำจากแต่ละอินพุต ส่วนที่ยากจะแปลงค่าที่ไม่ซ้ำกันนั้นเป็นสิ่งที่ใช้งานได้

MATLAB อัดข้อมูลได้แย่มากดังนั้นฉันจึงต้องหาวิธีอื่นในการทำแผนที่การค้นหา ฉันพยายามหาฟังก์ชั่นบางอย่างของตัวอักษรอินพุททั้งสามตัวที่ส่งผลให้มีค่าพิเศษที่เป็นค่า ASCII ที่พิมพ์ได้เพื่อที่ฉันจะสามารถฝังการแม็พในสตริงของอักขระหนึ่งตัวต่ออินพุต

แต่กลับกลายเป็นว่าเมทริกซ์คูณตัวละครที่ดัชนี[1 2 8]โดยเมทริกซ์จำนวนเต็ม[1;15;47]และจากนั้นการแสดงผล 124 mod ค่าไม่ซ้ำกันซึ่งทั้งหมด ASCII พิมพ์ (และไม่มีใครเป็น'ตัวละครซึ่งจะเสพเวจมรรคขึ้นตัวอักษรของสตริง) การทำแผนที่จบลงด้วยความพอใจTIOโดยไม่ได้ตั้งใจ น่าสนใจนี่คือการจับคู่เฉพาะสำหรับสมการนี้ที่ให้อักขระ ASCII ที่พิมพ์ได้ 26 ตัว

ดังนั้นโดยทั่วไปนั่นคือการทำแผนที่การค้นหาและการคำนวณของฉัน การทำค้นหาเป็นเพียงกรณีของการคำนวณและเปรียบเทียบกับการทำแผนที่ การเพิ่มลง'A'-1ในดัชนีในแผนที่จะทำให้เกิดอักขระ AZ

คุณสามารถลองออนไลน์ได้ที่ TIO ซึ่งแสดงการแมปแบบเต็มของอินพุตและเอาต์พุต เพื่อความสมบูรณ์การแมปเต็มรูปแบบก็อยู่ด้านล่าง:

'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

  • บันทึกการแมป 2 ไบต์เพื่อบันทึกการปรับ+32เปลี่ยน
  • บันทึก 3 ไบต์ด้วยการสร้างอ็อกเทฟอย่างเดียวโดยใช้การทำดัชนีเชิงตรรกะ'A':'Z'แทนที่จะค้นหา
  • บันทึก 6 ไบต์ด้วยการรวมผลคูณของการคูณโดยใช้การคูณเมทริกซ์

วิธีการที่ฉลาดอาจฉลาดเกินไป? 53 ไบต์ขึ้นอยู่กับคำตอบของ
MATL

@Sanchises อาจเป็นไปได้ แต่มันเป็นวิธีที่ฉันคิดขึ้นมาด้วย¯_ (ツ) _ / ¯ คุณสามารถโพสต์เวอร์ชันของคุณเป็นคำตอบแยกต่างหาก
Tom Carpenter

ฉันคิดและฉันยอมรับว่ามันน่าสนใจกว่าที่จะมีวิธีการที่แตกต่างกว่าเพียงแค่คัดลอกแนวทางที่สั้นที่สุด ฉันต้องการเปรียบเทียบวิธีฉันคิดว่าคุณฉลาดกว่า แต่ฉันคิดว่าชุดข้อมูลที่ได้รับอนุญาตสำหรับวิธี mod-based ที่ง่าย (ไม่แน่ใจว่าเป็นเรื่องบังเอิญหรือเป็นไปได้ทางสถิติ)
Sanchises

3

JavaScript (Chrome), 102

หมายเหตุน่าเสียดายที่มันใช้งานได้เฉพาะใน Chrome เนื่องจากการประมาณขึ้นอยู่กับการใช้งานใน parseInt () (ขอบคุณ @Arnauld)

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

ฉันค้นหาฟังก์ชันแฮชการแบ่งส่วนของแต่ละชื่อแปลงเป็นตัวเลขโดยใช้ฐาน 36 แล้วใช้โมดูโล่

ฉันใช้รหัสนี้เพื่อค้นหาแฮชที่ดีที่สุด:

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)
      }

และผลลัพธ์:

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

ฟังก์ชันแฮชที่ดีที่สุดให้ 26 ค่าที่แตกต่างระหว่าง 0 และ 50 แต่ฉันใช้ค่าที่แตกต่างกับ 1 ซ้ำ แต่ช่วงที่เล็กกว่า

ทดสอบ

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]))


คุณอาจต้องการที่จะพูดถึงว่ามันทำงานได้เฉพาะบน Chrome เนื่องจากการประมาณค่าการใช้งานขึ้นอยู่กับparseInt()ใน
Arnauld

@ Arnauld ขอบคุณฉันไม่รู้
edc65

3

C, 65 55 49 ไบต์

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(char*s){return*(long*)s%2004%857%361%94%26+65;}

ลองออนไลน์!

hผลตอบแทนintที่มีค่าเป็นรหัส ASCII A .. Zสำหรับ


2

Javascript, 98 ไบต์

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

ฉันพบว่าการรวมกันของอักขระที่ 2 และ 4 ของชื่อนั้นไม่ซ้ำกันสำหรับแต่ละคน

ดังนั้นฉันจึงสร้างสตริงที่มีการรวมกันของหรือname[4] + name[2]ไม่name[2] + name[4]ฉันจะมีการซ้ำซ้อนของกลุ่มถ่านehชื่อแรก Aretha Franklin ehและเมื่อ Smokey Robinson และ Johnny Cash oehnถูกตัดแบ่ง

ฉันสามารถย้าย Johnny Cash ไปที่ตำแหน่งอื่นของสตริงและรับการแมปที่แตกต่างกัน แต่การต่ออักขระที่ 4 และ 2 ในลำดับนี้เพื่อหลีกเลี่ยงการชนและปล่อยให้ชุดข้อมูลยังคงอยู่โดยไม่เพิ่มความยาวของโซลูชัน ดังนั้นฉันตัดสินใจที่จะไปทางนั้น (เป็นเพียงการตั้งค่าส่วนตัว)

ฉันค้นหาตำแหน่งของการต่อตัวอักษรตัวที่ 4 และ 2 ของพารามิเตอร์ที่กำหนดในสตริงและหารด้วย 2 เพื่อให้ฉันได้รับตัวเลขระหว่าง 0 ถึง 25 จากนั้นฉันเพิ่ม 10 และแปลงเป็นสตริงจากฐาน 36 ที่ 10 สอดคล้องกับaและ 35 ถึงz

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))


มีดมากที่คุณพบ!
Joyal

ใช่แล้ว แน่นอน. ฉันมีสิ่งที่ค่อนข้างคล้ายกัน แต่แทนที่จะเพิ่มถ่านเพื่อกลับมาในสตริงตำแหน่งของปรากฎการณ์สามารถบันทึก 25 ตัวอักษร ฉลาด!
nl-x


1

///, 390 231 ไบต์

/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/

ลองออนไลน์!

231 ไบต์หลังจากลบบรรทัดใหม่

นี่ยาวมาก แต่ /// ไม่สามารถจัดการกับตัวละครต่าง ๆ ได้โดยทั่วไป กล่าวอีกนัยหนึ่ง /// ไม่สนับสนุน regex


0

Excel, 96 ไบต์

หลังจากเสียเวลามากเกินไปในการลองวิธีการอื่น ๆ ได้ใช้แนวทางของ @Eduardo Paez:

=CHAR(FIND(MID(A1,5,1)&MID(A1,3,1),"her DbMbdvsv tdeicsm hnhltirac c i uCyrbOyCmeoie nMn")/2+65)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.