이 줄은 회문인가요?


16

도전

비디오에서 영감을 얻은

아시다시피 회문은 뒤로와 같은 철자가 나오는 단어입니다. 단어 "PULP"는 회문이 아니지만 모스 부호로 변환 될 때 (문자 사이의 간격이 제거 된 경우) "PULP"는 ".--...-.-...--."가됩니다. 회문입니다. 당신의 임무는 문자열을 가져와 그 단어가 국제 모스 코드의 회문인지 여부를 반환하는 프로그램이나 함수를 작성하는 것입니다.

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: --..

규칙

입력

적절한 형식으로 입력 할 수 있습니다. 입력 문자열에는 원하는 경우 문자 만 포함됩니다. 문자열은 공백, 숫자 또는 문장 부호를 포함하지 않습니다.

산출

프로그램은 입력이 회문인지 여부에 따라 2 개의 일정한 고유 결과 중 하나를 출력해야합니다 (예 : True / False, 1/0, HOTDOG / NOTHOTDOG

채점

이것은 이므로 바이트 단위의 최단 답변이 승리합니다. 표준 허점은 금지되어 있습니다.

테스트 사례

입력 => 출력

"PULP"       => True
"RESEARCHER" => True
"HOTDOGS"    => True
""           => True
"A"          => False
"RACECAR"    => False
"PROGRAMMING"=> False
"PUZZLES"    => False


4
내 투표 만이 망치 야 대부분의 솔루션은 입력을 모스 코드로 변환합니다.
Shaggy

1
모든 솔루션이 "역순으로 동일한"체크가 붙은 모스 코드 매핑 인 것처럼 보이므로 중복으로 닫힙니다.
xnor

2
중복 대상이 (a) 입력이 표준 입력에서 온 것 (기능 허용 안함)과 (b) 비 [AZ] | [Az] | [0- 9] 입력에 그대로 있습니다. 이것들을 함께 사용하면 포트에 대한 대답이 간단하지 않습니다.
Jonathan Allan

오 남자-나도 망치로 열린 것 같아! 방금 단일 투표를 한 것으로 생각했습니다. 나는 그것을 다시 닫았지만 어쩌면 안된다고 느꼈다.
Jonathan Allan

답변:


7

젤리 , 28 바이트

ØAŻŻ“¡9o|çṫ¡X1ỴỌġQ’œ?iⱮḃ2FŒḂ

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

ØA                             The uppercase alphabet.
  ŻŻ                           Prepend two zeroes.
    “¡9o|çṫ¡X1ỴỌġQ’œ?          Get the 73540211105102870315464559332nd permutation.
                                  (= “ETIANMSURWDKGOHVF0L0PJBXCYZQ”)
                     iⱮ        Find indices of input letters in this list.
                       ḃ2      Bijective base 2: map [1,2,3,4,5…] to
                                 [1], [2], [1,1], [1,2], [2,1], …
                         F     Flatten.
                          ŒḂ   Is palindrome?

나는 이것들 중 하나를 보고이 답변을 썼다 (오른쪽에서 왼쪽으로 행을 읽으면 내 마법의 끈을 얻는다!) :

enter image description here


73,540,211,105,102,870,315,464,559,332nd... 뭐?! 번호를 어떻게 찾았 습니까? 또한 어떻게 실행하는 데 영원히 걸리지 않습니까?
매직 문어 Urn

@MagicOctopusUrn 기본적으로 order와 관련하여 해당 문자열의 문자 순서를 인코딩합니다 00ABCDEFGHIJKLMNOPQRSTUVWXYZ. Jelly에는 순열을 이러한 숫자로 변환하고 이러한 숫자를 순열로 다시 변환하는 기능이 내장되어 있습니다. Wikipedia의 계승 번호를
Lynn

1
그것은 내가 오랫동안 본 가장 멋진 것입니다! 따라서 기본적으로 계승을 사용하면 순열이 특정 순서로 수행되므로 순열의 위치를 ​​"알 수 있습니다". 그것은 일정한 시간 액세스입니까? 선의? 로그? 완전히 다른 것?
매직 문어 Urn


7

젤리 ,  35 32 27  25 바이트

-2 데니스 덕분에 (피하기 위해 순열을 이동 %32)

Oị“¡\ḣḶɼz3ç³ƝMƒ§’Œ?¤ḃ2FŒḂ

대문자로 입력합니다. 출력은 1true, 0false입니다.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

어떻게?

Oị“...’Œ?¤ḃ2FŒḂ - Link: list of characters (in [A-Za-z]), S   e.g. 'FoOl'
O               - to ordinals                                      [70,111,79,108]
 %32            - modulo by 32 (A->1, a->1, ...)                   [6,15,15,12]
         ¤      - nilad followed by link(s) as a nilad:
  “...’         -   base 250 literal = 41482574787853596522350494865
       Œ?       -   first permutation of [1,N] which resides at that
                -   index when all permutations of [1,N] are sorted
                -   = [8,16,10,24,26,27,18,20,4,23,25,11,1,17,13,15,3,22,12,19,6,5,14,21,28,9,7,2]
                - index into (modular-indexing & vectorises)       [17,14,14,19]
          ḃ2    - to bijective base 2 (vectorises)                 [[1,1,2,1],[2,2,2],[2,2,2],[1,2,1,1]]
            F   - flatten                                          [1,1,0,1,0,0,0,0,0,0,1,0,1,1]
             ŒḂ - is palindromic?                                  1

이전 35 바이트 솔루션 (대문자로도 입력) ...

ØẠḣ29“...’œ?iⱮ⁸d⁴BnⱮ/€FŒḂ - Link: list of characters (in [A-Z] only), S
ØẠ                        - alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  ḣ29                     - head to index 29 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabc'
     “...’                - base 250 literal = 1222276956185766767980461920692
          œ?              - permutation at index = 'EAIWRUSJPaLbFVHcTNMDKGOBXCYZQ'
              ⁸           - chain's left argument = S       e.g. 'FOOL'
             Ɱ            - map with:
            i             -   first index of (char in 'EAI...')  [13,23,23,11]
                ⁴         - literal 16                           16
               d          - divmod                               [[0,13],[1,7],[1,7],[0,11]]
                 B        - to binary (vectorises)               [[[0],[1,1,0,1]],[[1],[1,1,1]],[[1],[1,1,1]],[[0],[1,0,1,1]]]
                     €    - for each:
                    /     -   reduce by:
                   Ɱ      -     map with:
                  n       -       not equal                      [[1,1,0,1],[0,0,0],[0,0,0],[1,0,1,1]]
                      F   - flatten                              [1,1,0,1,0,0,0,0,0,0,1,0,1,1]
                       ŒḂ - is palindromic?                      1


2

MBASIC , 325 바이트

큰 총이 도착하기 전에 첫 번째 시도 :-)

1 DATA .-,-...,-.-.,-..,.,..-.,--.,....,..,.---,-.-,.-..,--,-.,---,.--.,--.-,.-.,...,-,..-,...-,.--,-..-,-.--,--..
2 DIM C$(26):FOR I=1 TO 26:READ C$(I):NEXT:INPUT T$:FOR I=1 TO LEN(T$):N=ASC(MID$(T$,I,1))-64:S$=S$+C$(N):NEXT:L=LEN(S$):FOR I=1 TO L:IF MID$(S$,I,1)<>MID$(S$,(L+1)-I,1) THEN 4
3 NEXT:PRINT"True":END
4 PRINT"False

산출

? PULP
True

? RESEARCHER
True

? HOTDOGS
True

?
True

? A
False

? RACECAR
False

? PROGRAMMING
False

? PUZZLES
False


2

펄 6 , 87 바이트

{$_ eq.flip}o*.trans(/./=>{S/.//}o{'  ETIANMSURWDKGOHVF L PJBXCYZQ'.index($/).base(2)})

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

단어를 일련의 1과 0으로 변환하고 회문인지 확인합니다.

설명:

             *.trans(/./=>  # Translate each letter of the input to
                                   '...'.index($/)   # The index of the letter in the lookup string
                                                  .base(2)  # Converted to binary
                          {S/.//}o{                       } # With the first digit removed
{$_ eq.flip}o   # Return if the string is equal to its reverse

2

파이썬 (3) , 172 (148) 104 바이트

최초의 코드 골프. 친절하고 도움을 주시기 바랍니다 :)

이것은 C # 답변을 기반으로합니다. /codegolf//a/175126/83877 . 같은 아이디어를 가지고 파이썬 3에 적용했습니다. 코드를 골프화하기 위해 최선을 다했지만 더 많은 일을 할 수 있다고 확신합니다.

편집 1 : 공백과 불필요한 코드를 제거하는 데 도움을 준 @Stephen과 @Cowabunghole에게 감사드립니다.

편집 2 : 바이너리로 제안하는 @JoKing 감사합니다. 이것은 '-'와 '.'인 정말 깔끔한 트릭입니다. 필요조차 없습니다. 이로 인해 바이트 수가 크게 줄었습니다.

해결책

def b(w):x=''.join(map(lambda c:bin('  ETIANMSURWDKGOHVF L PJBXCYZQ'.index(c))[3:],w));return x==x[::-1]

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


1
PPCG에 오신 것을 환영합니다! 공백이 제거 된 152 바이트는 다음과 같습니다. 온라인으로 사용해보십시오!
Stephen

1
몇 가지 문자를 저장하기위한 몇 가지 팁 : 가능한 모든 곳에서 공백을 제거하십시오. 예를 들어, 당신은 변경할 수 있습니다 while i > 0:위해 while i>0:2 바이트를 저장합니다. 또한, 나는 틀릴 수 있지만 당신은 > 0완전히 없애고 사용할 수 있다고 생각합니다 while i:. 둘째, while 루프의 명령문은 while과 동일한 행으로 이동하여 줄 바꿈과 들여 쓰기를 저장합니다. 마지막으로 이것은 코드 골프를 제외하고는 모든 곳에서 끔찍한 조언이지만 Python 3 대신 Python 2를 사용하면 나누기 /대신 1 바이트를 절약 할 수 있습니다 //.
Cowabunghole

1
또한, ~-i대신 사용할 수 있습니다 i-1. 이것은 동일한 바이트 수이지만 2 바이트를 절약하는 괄호를 생략 할 수 있습니다.
Cowabunghole

1
-and 대신에 바이너리를 사용할 수 .있습니다. 105 바이트
조 왕

1
아냐, 나는이 기술을 사용 하는 Perl 6 답변 을 이미 가지고 있습니다. 기술을 자유롭게 사용하십시오
Jo King

1

Pyth, 35 33 바이트

이 코드에는 인쇄 할 수없는 문자가 포함되어 있으므로 16 진수 덤프가 있습니다.

00000000: 5f49 7358 7a47 632e 2207 0901 3f08 82ee  _IsXzGc."...?...
00000010: bd3f c256 9d54 c381 7dac 6590 37d3 c8f5  .?.V.T..}.e.7...
00000020: 52                                       R

온라인으로 사용해보십시오. 테스트 스위트.

설명

."코드의 끝 에서 시작 하면 점으로 \x08대시와 대시로 \x07탭으로 구분 된 모스 알파벳이 생성 됩니다.

c 문자열을 탭으로 나눕니다.

XzG알파벳 ( )에서이 "모자 알파벳"으로 X입력 ( z)을 변환 ( )합니다 G.

s모스 기호를 합산 (결합)합니다. 빈 입력의 경우 0을 반환하지만 이것은 문제가되지 않습니다.

_II반전시 결과가 변경되지 않는지 ( ) 확인합니다 ( _). 비어있는 입력의 경우 부정 될 때 0이 변경되지 않는지 확인합니다.


0

레티 나 0.8.2 , 87 바이트

[B-ILNPRSZ]
$&.
[AJKMOQT-Y]
$&-
}T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG
+`^(.)(.*)\1$
$2
^.?$

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

[B-ILNPRSZ]
$&.

이 세트의 문자에 대한 모든 모스 부호는로 끝납니다 ..

[AJKMOQT-Y]
$&-

이 세트의 문자에 대한 모든 모스 부호는로 끝납니다 -.

T`L`\EDKN_UMS\EWNRTTMWGAI_ISADKG

모스 부호 그 편지의 접두어 문자와 각 문자 교체 (여기 ET단순히 이스케이프를 통해 삭제를 _하지만, 일반적으로 그들은 공간으로 전환 될 것이다). 예를 들어, P모스 부호 는 끝에 W여분이 .있습니다. .위 의 내용 을 추가하여 이제 남은 것은 W.

}

글자가 없어 질 때까지 위 단계를 반복하십시오.

^(.)(.*)\1$
$2

첫 문자와 마지막 문자가 동일하면 둘 다 삭제하십시오.

+`

일치하는 문자 수만큼 반복하십시오.

^.?$

이것이 회문이라면, 최대 한 문자가 남습니다.


0

Wolfram Language (Mathematica) , 107 바이트

PalindromeQ[##2&@@@(IntegerDigits[Tr@StringPosition[" ETIANMSURWDKGOHVF L PJBXCYZQ",#],2]&/@Characters@#)]&

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

젤리 답변과 비슷합니다 . Morse 코드를 이진수로 생각 " ETIANMSURWDKGOHVF L PJBXCYZQ"하고 문자의 위치를 ​​이진수로 표시하여 Morse 코드를 제공 하는 문자열을 작성 합니다. 그러나 예를 들어와를 구별 S = 000하고 싶기 때문에 추가 1이 앞에 붙습니다 H = 0000. 그런 다음 ##2&@@@이 주요한 1을 제거하고 평평하게 만듭니다.


허프, 저는 Wolfram Language에 모스 코드가 내장되어있을 것으로 기대했습니다. 아니면 하나가 있지만 너무 장황합니까?
Jack Brounstein

1
찾지 못했습니다. (그리고 문서는 내가하면 기대하지 않을 것이다 어떤 음성 명령을 하드 코드 모스 부호, 예를 들어 코드를 포함하는 내장 된 존재.)
미샤 라브 로프

0

05AB1E , 37 바이트

v•1êÿµµÈ∞Ƶipδ8?a¡š%=тîδ/•3B0¡Aykè}JÂQ

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


베이스 3의 알파벳을베이스 255로 변환하여 인코딩합니다.

12021110212102110101121022101111011012220212012110220210222012210221201210111020112011120122021120212202211

베이스 255 :

•1êÿµµÈ∞Ƶipδ8?a¡š%=тîδ/•

그런 다음 기본적으로 0에서 분리하고 위치별로 문자열을 구성하고 회문을 확인합니다.


0

C # (. NET 코어) 191 바이트

a=>{var s="";int r=1,x=0,i;foreach(var t in a){var c="";for(i=" ETIANMSURWDKGOHVF L PJBXCYZQ".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;s+=c;}i=s.Length;for(;x<i;x++)r=s[x]==s[i-x-1]?r:0;return r;}

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

이 답변의 일부는 Nick Larsen의 mors code golf . 답변에 대한 의견을 바탕으로 잠재적으로 더 골프를 칠 수 있습니다.

언 골프 드 :

a => {
    var s = "";                 // initialize s
    int r = 1, x = 0, i;        // initialize r, x, and i

    /*
        This portion was adapted from Nick Larsen. He described it as follows:
            -- The string of characters is a heap in which the left child is a dot and the right child is a dash.
            -- To build the letter, you traverse back up and reverse the order.
        I have edited it to remove number support, which saves 34 bytes.
    */
    foreach(var t in a)
    {
        var c = "";
        for(i = " ETIANMSURWDKGOHVF L PJBXCYZQ".IndexOf(t); i > 0; i /= 2)
            c = "-."[i-- % 2] + c;
        s += c;
    }

    i = s.Length;               // reuse i and set to the length of the morse code string
    for(; x < i; x++)           // increment x until x reaches i
        r = s[x] == s[i - x - 1] ?      // if the xth character on the left side of s is equal to the xth character on the right side of s
                                    r :     // true: do not change r
                                        0;  // false: set r to zero (set to false)

    return r;
}

0

PowerShell을 , 204 187 바이트

param($a);$a|% t*y|%{$b+=[convert]::ToString("  ETIANMSURWDKGOHVF L PJBXCYZQ".IndexOf($_),2).substring(1)};$c=($b=($b|% *ce 0 .|% *ce 1 -)).ToCharArray();[array]::Reverse($c);$b-eq-join$c

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

null 문자열에 오류가 있습니다. 누구든지 도와 줄 수 있습니까?

테스트 코드 (스크립트 블록에 코드를 래핑하고 변수 $ Z ...에 할당 한 후) :

$tests = @(
    "PULP", "True"
    "RESEARCHER", "True"
    "HOTDOGS", "True"
    "A", "False"
    "RACECAR", "False"
    "PROGRAMMING", "False"
    "PUZZLES", "False"
)
$outputs = @()
for($i = 0; $i -lt $tests.length/2; $i++){
    $output = New-Object "PSObject"
    $output  | Add-Member -MemberType NoteProperty -Name Name -Value "`"$($tests[2*$i])`""
    $output | Add-Member -MemberType NoteProperty -Name Expected -Value $tests[2*$i + 1]
    $output | Add-Member -MemberType NoteProperty -Name Result -Value $(&$Z -a $tests[2*$i])
    $outputs += $output 
}
$outputs | Format-Table

산출:

Name          Expected Result
----          -------- ------
"PULP"        True       True
"RESEARCHER"  True       True
"HOTDOGS"     True       True
"A"           False     False
"RACECAR"     False     False
"PROGRAMMING" False     False
"PUZZLES"     False     False

PPCG에 오신 것을 환영합니다. 당신이 보는 것이 도움이 될 것 PowerShell의 골프에 대한 팁
mazzy

감사합니다, @mazzy!
KGlasier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.