히스토그램, 회문, 오 마이!


28

(첫 번째 과제는 문제가있는 경우 알려 주시기 바랍니다.)

heterogram는 알파벳의 어떤 문자가 두 번 이상 발생하지 않는 단어이며, 회문은 앞으로 같은 뒤로를하는 문구입니다.

여기서 과제는 단어 (단지 문자)를 입력으로 받아 이종법 (truthy / falsy)인지 여부를 출력하는 코드를 작성하는 것입니다. 중요한 것은 프로그램이 회문이어야한다는 것입니다. 앞뒤로 같은 것을 읽습니다. 대문자 사용 여기서 중요 하지 않으므로 이종도를 유효하게하려면 예를 들어 q와 Q를 모두 가질 수 없습니다. 주석은 허용되지 않으며 회문 부분을 쉽게 만들려고 코드 (또는 코드의 상당 부분)가 포함 된 문자열을 배치 할 수 없습니다.

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다. 행운을 빕니다!

편집 : 왼쪽 및 오른쪽 형태의 괄호, 대괄호 또는 기타 기호는 회문 부분에 대해 적절하게 반전되어야합니다. 그래서 (helloolleh)는 회문이지만, (helloolleh (는 그렇지 않습니다. 분명히 이것은 회문이라고합니다.

편집 2 : 빈 입력, 여러 단어로 입력 또는 문자 이외의 문자로 입력하지 않습니다. 그래서 걱정하지 마십시오 :)


괄호는 회문과 동등한 것으로 간주됩니까? 즉, (hellolleh)유효한 회문입니까? 에 대한 유사 [], {}그리고 <>(적절한 경우).
Glen O

예. 미안, 내가 설명 했어야했는데
스파게티

새로운 라인에 대해 무엇을 할 것이다 asdsa동일하게 간주 asd\nsa?
wendelbsilva

아니요, 그들은 동등하지 않습니다.
스파게티

5
나는 그것이 편리한 회문 이라고 믿습니다 .
lirtosiast

답변:


9

Pyth-11 바이트

(트레일 및 선행 공간이 필요하고 계산 됨).

 z.{ z }.z 

테스트 스위트 .

<space>        Suppress print
 z             Input (for palindromness)
.{             Unique - actually does testing
  z            Input
<space>        Suppress print
  }            In operator
   .z          Cached input list
   <space>     At end of program makes empty tuple

Mike의 Pyth 답변은.을하기 전에 소문자로 변환됩니다. {, 그렇게 할 필요가 없습니까?
Sparr

18

Pyth, 17 바이트

 Z.{rzZ.q.Zzr}.Z 

여기에서 온라인으로 사용해보십시오.

선행 공간이 필요합니다. 나는 그것을 카운트하고 바이트 수에서 후행 공간을 계산했습니다.

고장은 다음과 같습니다.

     z            z is initialized to the input
    r Z           Z is initialized to 0, and r(string)0 converts the string to lowercase
  .{              .{ is pyth's builtin uniqueness test
       .q         .q terminates the program
         .Zzr}    This is just the program mirrored
              .Z  . requires a number to immediately follow it
                  If left blank the parser would throw an error
 Z                This is just mirrored from the end
                  The leading space suppresses the automatic printing of this 0
                  The trailing space mirrors the leading space

3
Jeez, 나는 이것이 너무 어려울까 걱정했다 ... 잘 했어!
스파게티

2
귀하는 .q귀하의 의견에는 있지만 .w귀하의 프로그램에는 있습니다.
James Webster

@JamesWebster 지적 해 주셔서 감사합니다. .q
Mike Bufardeci

16

파이썬 3, 125

주요 문제는 코드의 역을 파싱 할 수있게 만드는 것입니다. 그런 다음 정의되지 않은 식별자에서 오류가 발생하도록 할 수 있습니다.

w=[str.lower][0]((input)())
(print)((max)((map)(w.count,w))<2)
(2>((w,tnuoc.w)(pam))(xam))(tnirp)
(()(tupni))[0][rewol.rts]=w

아주 작은 점이지만 규칙에서 두 번째 <>!
Jarmex

12

펄, 43 바이트

print+m:^(?!.*(.).*\1|1/*.(.)*.!?)^:m+tnirp

사용 예 :

echo "abcde" | perl -n entry.pl

와우, 그거 놀랍습니다. 좋은 작업!
스파게티

6

> <> , 137131 바이트

이 도전을 보았을 때, 나는 언어를 사용하면 대부분 회문을 무시할 수 있기 때문에> <>가 결국 언어의 좋은 선택이라고 생각했다. 포인터가 원하는 곳에만 머 무르도록하는 것은 간단합니다. 이것이 사실이지만, 불행히도> <>는 골프 조건을 극도로 흥분시킨다 (또는 일반적인 골프). 나는 이것을 보상하기 위해 생각한 이상한 트릭을 사용하고 싶지만 여기에 "빠른"(실제로는 프로그램과 창조 모두가 아니라) 대답이 있습니다. 여기에서 온라인으로 사용해 볼 수 있습니다 .

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
  ;n1<^  -*48<   .00~<  ;n-10<01-n;  >~00.   >84*-  ^>1n;
<.0e&$v?=@:}:&v?)1:-1lv?("Z":<v?)0:i

true의 경우 1을 반환하고 false의 경우 -1을 반환합니다 (0으로 변경할 수는 있지만 길이는 동일하게 유지됩니다)

항상 그렇듯이 작동하지 않는 경우와 골프를 치는 방법에 대한 아이디어가 있는지 알려주십시오. 몇 가지 테스트 사례에 대해 테스트했지만 항상 예외가있을 수 있습니다.

여기 좀 더 영리하다고 생각되는 또 다른 버전이 있습니다. 이번의 Truthy / falsey 값은 1이며 오류 ( something smells fishy...) :

>i:0(?v>:"Z")?vl: 2(?v&{:@$:@=01-*2.
 < ;n1<^  -*48<f6+0.0<
 &1-:1)e*1.1*e(1:-1& 
>0.0+6f>84*-  ^>1n; > 
.2*-10=@:$@:}&v?)2 :lv?("Z":<v?)0:i<

설명:

다음은 회문으로 만들기 위해 부품을 추가하지 않은 코드입니다. 이것은 대체 버전에 사용하려고 시도한 "더 영리한"트릭을 사용하지 않으므로 설명하기가 더 쉽습니다 (누군가 "트릭"에 대한 설명에 관심이있는 경우 그러나).

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
  ;n1<^  -*48<   .00~<  ;n-10<

1 행 :

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
i:0(?v                                 #Pushes input and directs down if negative
      >:"Z")?v                         #Directs down if input is greater than "Z"
                                       #(reduces lowercase input to uppercase)
              l                        #Pushes length

                                       #Main loop begins
               1-:1(?v                 #Decrements top, and then directs down if less than 1
                      &                #Pushes top of stack onto register (length minus 1)
                       :{              #Duplicates top, shifts stack to the left
                         :@            #Duplicates top, shifts top three values of the stack to the right

                           =?v         #If top two values are equal, directs down
                              $        #Swaps top two values of the stack
                               &       #Pushes register onto stack
                                e0.    #Jumps back to the "1" after "?vl"
                                       #Main loop ends

                                   >   #Makes sure when the pointer jumps back to i it goes the right way

다음은 복잡한 스와핑 ( :{:@=?v$)의 작동 방식입니다.이 스택의 테스트 사례를 사용하겠습니다 [5,1,8,1]. 마지막 문자가 맨 위입니다.

:{스택의 상단이 복제되고 스택이 [5,1,8,1,1]왼쪽으로 이동합니다.[1,8,1,1,5]

:@상단이 복제 된 [1,8,1,1,5,5]다음 상단 3 개 값이 오른쪽으로 이동합니다.[1,8,1,5,1,5]

=?v 설명의이 부분에 불필요

$최상위 값은 한 번 더 산출량으로 교체됩니다 [1,8,1,5]. 이것은 주목할 것입니다. 원래 스택이 한 번 넘겨졌습니다 ( {유일한 명령 인 것처럼 ).


이것이 영어로하는 것 ( "고마워요, 실제로 설명하고 있습니다") 은 전체 스택을 최상위 값과 비교하여 확인하고 어떤 값이 상위와 같으면 두 번째 줄의 한 지점으로 이동합니다. 이 검사는 스택에있는 값의 수 (스택 의 길이는 l - 1어디에 있는지)에 비례하여 수행 l되므로 모든 값이 서로 비교됩니다.

2 행 :

  ;n1<^  -*48<   .00~<  ;n-10<
   n1<                          #If input is less than 0 (i.e. there is none), print 1
  ;                             #and terminate

             <                  #If redirected because input is greater than "Z"
         -*48                   #Push 32, subtract (reducing lowercase to uppercase, numerically)
      ^                         #And move back to the portion that tests if input 
                                #is uppercase (which it will pass now)

                     <          #If counter is less than 1 (for main loop)
                 .00~           #Pop the counter and jump to the beginning (i)

                             <  #If any two values in the stack are equal
                          -10   #Push -1 (subtract 1 from 0)
                        ;n      #Print and terminate

> <> 답변을 만나서 반갑습니다 :)
스파게티

1
또한 ><>회문 자체 (편리한 것은 아님)
Jo King

5

PHP, 126 바이트

5.4 이상에서 short_tagsini 지시문을 끈 상태 에서 이를 실행해야합니다 .

최초의 골프. 두 사본, 첫 번째는 허위 / 거짓 결과와 함께 전체 쓰레기를 인쇄합니다.

<?=var_dump(max(array_count_values(str_split(end($argv))))<2)?><?(2>((((vgra$)dne)tilps_rts)seulav_tnuoc_yarra)xam)pmud_rav=?>

이 버전은 전문 용어 (162 바이트)를 인쇄하지 않습니다.

<?=var_dump(max(array_count_values(str_split(end($argv))))<2);__halt_compiler()?><?()relipmoc_tlah__;(2>((((vgra$)dne)tilps_rts)seulav_tnuoc_yarra)xam)pmud_rav=?>

명령 줄에서 다음을 실행하십시오.

php -f golf.php heterogram

아마 조금 더 골프를 칠 수 있습니다


영리하지만 타당성의 한계를 넓히고 있습니다. 아마 스포츠에 대한 의견이있는 해결책을 생각해보십시오
Martijn

대신을 ?><?사용할 수 있습니다 //\\. 그 요구 사항을 제거해야합니다. 그리고 대신 __halt_compiler()사용return;
이스마엘 미구엘

무시하십시오. 댓글을 사용할 수 없습니다. 그러나 return;여전히 유효합니다.
Ismael Miguel

2

05AB1E, 9 바이트

lDÙQqQÙDl

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

* 최초의 도전으로 되돌아가는 것에 대해 무언가를 삽입하십시오 *

05AB1E 이후 비경쟁은이 도전 이후에 이루어졌습니다.

설명

lDÙQqQÙDl
l           Take input and lowercase it.
 DÙ         Duplicate and uniquify.
   Q        Compare the two strings.
    q       Immediately exit.
     QÙDl   The rest of the program is ignored.

1
"05AB1E 이후 비경쟁은이 도전 전에 이루어졌다." 아마도 당신은 이 도전 후에 의미했을 까요? ;)
ETHproductions

2

Brachylog , 3 바이트, 언어 날짜 도전

DdD

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

이것은 Brachylog 1과 Brachylog 2에서 모두 작동하는 매우 적은 프로그램 중 하나입니다. TIO 링크는 옛날 Brachylog 1과 연결되어 있습니다. 또한 부수적으로 Brachylog의 경우 이것은 기능이 아닌 전체 프로그램입니다. (Brachylog의 전체 프로그램은 암시 적으로 부울을 출력하는데, 이것은 우리가이 질문에 원하는 것입니다.)

여기에서 일반적인 원칙은 동일한 대문자 쌍 사이에 술어를 배치하는 것이 현재 값이 해당 술어에서 변하지 않는다는 주장입니다. 따라서 종종 AoA"정렬 됨"( "정렬 불변") 과 같은 것을 보게 됩니다. A↔ABrachylog 2에서 "는 회문"( "반전의 불변")을 의미합니다. 이 프로그램은 "중복 제거시 불변"즉 "중복을 포함하지 않습니다"입니다. 불변을 지정하는이 방법이 회문이되는 것이 정말 편리합니다.



0

MATL , 7 바이트

tuX=Xut

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

입력이 이종도이면 목록 [1, 1]을 반환하고 그렇지 않으면 [0, 0]을 반환합니다.

설명:

t       % duplicate the input
u       % remove duplicates from the original
X=      % check the two lists are equal
Xu      % unique rows (does nothing as we now have a boolean)
t       % duplicate the result
        % (implicit) convert to string and display
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.