가수 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

여기서 문자열 목록으로 얻을 수 있습니다 .

태스크

가수 이름을 감안할 때, 인쇄하거나 편지 반환 AZ고유이 가수를 식별하는합니다. (코드를 반환하는 경우 위해 밥 딜런 , 그것은 반환 할 수 다른 가수를 위해.)

다른 유사한 문제와 달리, 충돌이없는 한 매핑은 사용자에게 달려 있습니다 .

규칙

  • 입력은이 정확한 철자와 위 또는 뒤에 공백이없는 위에 나열된 26 명의 가수 이름 중 하나임을 보증합니다.
  • 소문자 나 대문자로 문자를 출력 할 수 있습니다. 그러나 일관성이 있어야합니다.
  • 26 개의 모든 입력에 대해 테스트 스위트를 제공하는 것이 좋습니다.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다!


17
롤링 스톤 (Rolling Stone) : Bob Dylan은 진정 최고의 음악가 중 한 명입니다. 그러나 위대한 가수 ?
Luis Mendo

내가 아니라 (이러한 선택의 몇 가지에 대해 조금의 짠 해요 @LuisMendo 기침 기침 스티브 타일러의 기침 )
주님 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 .

2Y2'ijkl o qst uz'h

(소문자) 알파벳을로 누릅니다 2Y2. [1,26] 범위의 숫자를 처리합니다. 그러나 일부 숫자가 누락되어 최대 38 개의 숫자가 있습니다. 따라서 h숫자를 '누락 된'문자에 매핑하여 더 높은 숫자를 처리하는 문자열을 추가 ( )합니다. 공백은 무엇이든 가능합니다. 본인의 편의를 위해 원래 프로그램에서 대문자를 사용했습니다.

w)

이제 첫 번째 단계에서 숫자를 두 번째 단계에서 문자열로 인덱싱 할 수 있습니다 ). w올바른 순서로 인수를 얻는 데 사용 합니다. 0부터 시작하는 인덱싱을 사용하는 것처럼 보일 수 있지만 (숫자는 0에서 38까지이며 문자열의 길이는 39 자입니다.) 실제로는 좀 더 복잡합니다. MATL. 이 수단이 1인덱스에 a, 38사실에 인덱스 u, 그리고 0마지막에 인덱스 z문자열.


23

파이썬 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하게 038

그런 다음 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 BASIC 포인터가 손상되기 때문에이 작업이 필요합니다.

참고 : C64는 기본적으로 소문자가없는 모드입니다. 읽을 수있는 이름 을 입력 하려면 먼저 SHIFT+ 를 눌러 소문자 모드로 전환 하십시오 CBM.


설명

실제로 이러한 이름에 대한 최소한의 완벽한 해시 함수를 찾는 것이 과제입니다. 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

파이썬 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 hash (n)은 모든 이름에 대해 고유 한 정수를 계산합니다. 모듈로 연산은 여전히 ​​이러한 int를 고유하게 유지하지만 값을 낮 춥니 다. 두 번째 부분 ( chr(65+i-i/25*2-i/29*21+i/35*2))은 TFelds answer 와 유사합니다 . 모듈로 연산은 이미 여기여기에서 사용한 스크립트에 의해 무차별 처리됩니다 .
ovs

10

자바 스크립트, 138132

모든 글자가 고유 같이 제외한 MJ= M ichael J의 ackson / M ICK J의 I 구체적 마이클 잭슨 (AN과 유일 확인 아게르 h4 위치에서)를, 다른 모든 이름을 I는 다음 글자의 문자열을 작성 고유 한 편지로.

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

자바 (오픈 JDK 8) , 128 (126) 115 113 바이트

자바 제출에 너무 초라하지 않습니다!

람다 식으로 많은 바이트를 절약 해 준 Kevin에게 감사합니다!

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;}하여 2 바이트를 골프를 a+=i;
타실

1
@ KevinCruijssen 건배, 내가 그것을 그리워 믿을 수 없어! 나는 0에서 25 사이의 고유 한 값을 줄 수있는 '매직 숫자'를 찾으려고 시도하는 스크립트를 작성했지만 최선을 다할 수있는 것은 24이므로 결국 끝에 if 문입니다.
Luke Stevens

1
흠 btw, Java 8을 사용하고 있기 때문에로 골프 char g(String s)를 칠 수도 있습니다 s->. Java 7 메소드에만 익숙한 경우를 위해 TIO를 수정하는 방법을 보여주었습니다.
Kevin Cruijssen

고마워, 나는 당신이 그것을 할 수 있다는 것을 결코 깨닫지 못했습니다, 나는 다시 제출을 업데이트 할 것입니다!
Luke Stevens

하하, 당신은 내가 이것에 새로운 것을 말할 수 있습니다
Luke Stevens

5

파이썬 3, 132 99 96 바이트

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

온라인으로 사용해보십시오!

훌륭하게 골프를 치는 것은 아니지만 나는 이것을 시도 할 것이라고 생각했다.

TFeld에 의해 수정 된 -33 바이트 ovs 대신에
-3 바이트를 사용 find합니다 index.


을 사용하여 6 바이트를 절약 할 수 있으며 128 바이트sum(map(ord,m))Aretha Franklin
TFeld

그리고 chr(97+...)대신에 사용할 수 있습니다 ascii_lowercase: 99 바이트
TFeld

1
설명은 어떻습니까?
Matsemann

3
설명 : sum(map(ord,m))문자열에있는 문자의 ASCII 값을 더합니다 m(702-1506 범위의 정수 제공). 그런 다음 호출 chr은 그 수와 (유니 코드) 문자로 변환 : chr(702)ʾ chr(1506) = ע사이에 제비. 이 솔루션은 색인 (0-26)을 얻기 위해 가능한 모든 문자 (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. 코드 자체에 오류가 있는지 또는 온라인 변환을 시도해보십시오. :)
인지 모르겠다

1
@ crazyloonybin 교체 오타가 수정되었습니다. 힌트 주셔서 감사합니다.
디도

어떻게 이것을 실행합니까? '온라인으로 시도'코드는 해당 <?=부분을 사용하지 않습니다 . 그리고 '파이프로 실행'이 작동하지 않습니다. 또한 명령 줄에서 실행할 때 알림이 표시됩니다.
nl-x

@Titus : CodeGolf에서는 원하는 출력을 생성하는 완전한 기능이나 응용 프로그램을 제공해야합니다. 나는 잘 알고 있습니다 <?=... 그래서 내 질문은 여전히 ​​어떻게 코드를 실행합니까? $argn명령 줄 에서 피드에 실패했습니다 ... 지금까지의 모든 시도는 아티팩트를 제공하고 여전히 실행하려면 더 많은 코드가 필요한 것 같습니다.
nl-x

@ nl-x PHP는 통지를합니다. n 옵션을주지 않았기 때문입니다.echo <input> | php -nF <scriptfilename>
Titus

4

펄, 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

온라인으로 사용해보십시오


좋은 접근 방식! 그래도 전체 호출 가능한 함수를 작성 / 점수해야한다고 생각합니까?
Felix Palmen

@FelixPalmen, 그것은 인라인이라고 부를 수있는 perl 프로그램입니다 : perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'tio에 링크 추가
Nahuel Fouilleul

좋은! 비슷한 접근 방식을 찾고 $1^$2있었지만 사용 하지 않을 것이라고 생각했습니다 crypt... 다시 주문하면 4 바이트를 절약 할 수 있습니다 : 온라인으로보십시오!
Dom Hastings

4

파이썬 2, 50 43 바이트

새 버전의 japh 크레딧

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

온라인으로 사용해보십시오!

참고 : 이것은 hash내장 기능에 의존 하며 모든 구현에서 작동하지는 않습니다.


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

@japh 니스! 내 파이썬 무차별 대입 검사기는 충분히 빠르지 않았다;)
KSab

3

루비, 63 바이트

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

입력의 ASCII 코드를 추가하고, 모드 98을 취한 후 mod 66을 사용 n하여 0..65 범위 의 26 개의 고유 숫자 중 하나를 얻 습니다. 큰 16 진 숫자 1는이 26 개 장소 각각에 비트를 포함 하므로 n오른쪽 으로 시프트하면 1의 숫자를 얻습니다.1 비트가 습니다. 우리 1는 ascii 코드를 추가하고 mod 48을 사용 하여 비트를 계산 한 다음 64를 더하고 ASCII 코드로 변환합니다.

테스트 프로그램

map문자 코드와 가수를 인쇄하는 가수를 반복. 그런 다음 문자 코드의 배열을 반환하며 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 값이기도 한 고유 값을 얻은 3 개의 입력 문자에서 일부 기능을 찾으려고 노력했습니다.

인덱스의 문자에 [1 2 8]정수 행렬을 곱한 [1;15;47]다음 mod 124를 수행하면 모든 인쇄 가능한 ASCII ( '문자열 리터럴을 버그 가있는 문자 는 없음)의 고유 값이 생성됩니다 . 즐겁게 매핑 TIO은 완전히 우연한 것으로 끝납니다 . 흥미롭게도 이것은 유일한 매핑입니다 26 개의 고유 한 인쇄 가능한 ASCII 문자를 제공하는이 방정식 입니다.

기본적으로 이것이 내 조회 매핑 및 계산입니다. 조회는 단순히 계산을 수행하고 매핑과 비교하는 경우입니다. '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.
  • 'A':'Z'find 가 아닌 논리적 인덱싱을 사용하여 Octave 전용으로 만들어 3 바이트를 절약했습니다 .
  • 행렬 곱셈을 사용하여 곱셈을 수행하여 6 바이트를 절약했습니다.

영리한 접근, 너무 영리한가? MATL 답변을 기반으로 한 53 바이트
Sanchises

@ Sanchises는 가능하지만 ¯_ (ツ) _ / ¯를 생각해 냈습니다. 버전을 별도의 답변으로 게시 할 수 있습니다.
Tom Carpenter

나는 가장 짧은 접근법을 복사하는 것보다 다른 접근법을 갖는 것이 더 흥미 롭다는 데 동의했다. 난 그냥 접근 방법을 비교하고 싶어, 나는 당신보다 똑똑하다고 생각하지만, 난 그냥 쉬운 모드 기반의 접근 방식에 허용되는 데이터 집합을 가정 (하지 않도록 즉 통계적으로 가능성이 우연의 일치 또는 인 경우)
Sanchises

3

자바 스크립트 (Chrome), 102

참고 불행히도 parseInt ()의 구현 의존적 근사 때문에 @ Chrome에서만 작동합니다 (@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

가장 좋은 해시 함수는 0에서 50 사이의 26 가지 값을 제공하지만 중복이 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]))


당신은 단지 때문에 크롬에서 작동 언급 할 수 있습니다 구현에 의존 근사치 에서 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는 hashPython과 같은 문자열 함수를 제공하지 않습니다 . 아니면?

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

온라인으로 사용해보십시오!

hint의 값이의 ASCII 코드 인를 반환합니다 A .. Z.


2

자바 스크립트, 98 바이트

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

나는 이름의 두 번째와 네 번째 문자의 조합이 각각 고유하다는 것을 알았습니다.

따라서 나는 조합이 name[4] + name[2]아닌 문자열을 만들 name[2] + name[4]거나 eh아레사 프랭클린이라는 이름 의 문자 그룹 을 반복합니다.eh 때 스모키 로빈슨과 쟈니 현금 oehn연결된됩니다.

Johnny Cash를 문자열의 다른 위치로 옮기고 다른 매핑을 얻을 수는 있지만이 순서로 4 번째와 2 번째 문자를 연결하면 충돌을 피하고 솔루션에 길이를 더하지 않고도 데이터 세트 순서를 그대로 둡니다. 그래서 나는 그렇게하기로 결정했습니다 (단지 개인적인 취향입니다)

문자열에서 주어진 매개 변수의 4 번째와 2 번째 문자의 연결 위치를 검색하고 0과 25 사이의 숫자를 얻도록 2로 나눕니다. 그런 다음 10을 더하고 기수 36에서 문자열로 변환합니다. 여기서 10은 a35에 해당 하고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 바이트

이것은 매우 길지만 ///는 다른 문자를 일반적으로 처리 할 수 ​​없습니다. 즉, ///는 정규식을 지원하지 않습니다.


0

엑셀, 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.