이 문자열을 분리 해제하십시오!


48

이 도전 에 따라 생성 된 회문이 주어지면 를 탈회하십시오.

테스트 사례

abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf

이것은 depalindromizing에 관한 것이므로 코드는 palindrome 일 수 없습니다 .

이것은 이므로 바이트 수가 가장 적은 코드가 이깁니다.


23
코드가 회문이 아닌 무의미한 제한은 -1입니다. IMO에는 아무 문제가 없습니다. 매우 적은 언어로도 문제가되지 않습니다.
Rɪᴋᴇʀ

25
제한 +1 그것은 고생물 대 도전을 반영하고 있습니다 ... 그리고 그것은 esolangs에 도전을 추가합니다. 나는 그것을 좋아한다. 입력이 항상 고르지 않은 길이를 갖는다는 가정에서 맞습니까?
Titus

42
비 회 문의 제한은 아마도 이전의 도전에 근거한 농담 일 것입니다. 누군가 그것을 기반으로 진정으로 투표 했습니까?
Luis Mendo

5
단일 바이트 솔루션을 방지합니다. 불필요한 +1의 경우 @diynevala +1
Adám

5
현이 회문이 아닌 경우 어떻게해야합니까?
Xavon_Wrentaile

답변:




6

파이썬 2, 23 바이트

휴대 전화에서 테스트 할 수 없지만 작동해야합니다.

lambda s:s[:-~len(s)/2]

2
Android에서 실행중인 경우 Google Play 스토어에서 QPython을 사용할 수 있습니다. 내가 찾은 최고입니다 :)
Yytsi

termux apt-get install python2
Matt

@Matt 원하는 것이 파이썬이라면 과잉입니다.
mbomb007

@Matt뿐만 아니라 apt-get휴대 전화에서 찾을 수 있다면 일반 휴대 전화가 아닐 수도 있습니다.
합법적 인 게으른

@MathManiac termux는 Google Play에서 루팅되지 않은 Android 휴대 전화에 설치됩니다. 그보다 훨씬 더 평범해질 수는 없습니다.
Matt

6

퍼지 옥토 과카 몰리, 4 바이트

2.^/

나는이 도전이 짧은 언어를 검색하는 데 시간을 보냈고 내가 바보이며 내 언어가 그렇게한다는 것을 깨달았습니다.





4

자바 스크립트 (ES6), 32 26 25 바이트

Neil 덕분에 1 바이트 절약 :

s=>s.slice(0,-s.length/2)



Downgoat 덕분에 이전 솔루션 26 바이트 :

s=>s.slice(0,s.length/2+1)

32 바이트 :

s=>s.slice(0,(l=s.length/2)+l%2)

1
당신은을 단축 할 수 s=>s.slice(0,s.length/2+1)길이 때문에 항상 이상한 것
Downgoat

@ Downgoat 덕분에 1 바이트 이상 더 s=>s.slice(0,s.length/2+.5)긴 길이도 작동 한다는 것을 알았 습니다.
Hedi

2
-s.length/2홀수 및 짝수 길이 모두에 대해 작동합니다.
Neil

4

WinDbg, 87 71 바이트

db$t0 L1;.for(r$t1=@$t0;@$p;r$t1=@$t1+1){db$t1 L1};da$t0 L(@$t1-@$t0)/2

NULL을 삽입하지 않고 길이를 전달하여 -16 바이트 da

psuedo-register의 주소를 통해 입력이 전달됩니다 $t0. 예를 들면 다음과 같습니다.

eza 2000000 "abcdedcba"       * Write string "abcdedcba" into memory at 0x02000000
r $t0 = 33554432              * Set $t0 = 0x02000000
* Edit: Something got messed up in my WinDB session, of course r $t0 = 2000000 should work
* not that crazy 33554432.

중간 char의 오른쪽 (또는 문자열의 길이가 짝수 인 경우 오른쪽 중간)을 null로 바꾸고 원래 시작 메모리 주소에서 문자열을 인쇄하여 작동합니다.

db $t0 L1;                                   * Set $p = memory-at($t0)
.for (r $t1 = @$t0; @$p; r $t1 = @$t1 + 1)   * Set $t1 = $t0 and increment until $p == 0
{
    db $t1 L1                                * Set $p = memory-at($t1)
};
da $t0 L(@$t1-@$t0)/2                        * Print half the string

산출:

0:000> eza 2000000 "abcdeedcba"
0:000> r $t0 = 33554432
0:000> db$t0 L1;.for(r$t1=@$t0;@$p;r$t1=@$t1+1){db$t1 L1};da$t0 L(@$t1-@$t0)/2
02000000  61                                               a
02000000  61                                               a
02000001  62                                               b
02000002  63                                               c
02000003  64                                               d
02000004  65                                               e
02000005  65                                               e
02000006  64                                               d
02000007  63                                               c
02000008  62                                               b
02000009  61                                               a
0200000a  00                                               .
02000000  "abcde"

3

하스켈, 27 바이트

take=<<succ.(`div`2).length

포인트 프리 버전

\x->take(div(length x)2+1)x

또한 27 바이트입니다.


3

MATL , 7 6 바이트

9LQ2/)

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

설명

9L       % Push array [1, 1j]
  Q      % Add 1: transforms into [2, 1+1j]
   2/    % Divide by 2: transforms into [1, 0.5+0.5j]
     )   % Apply as index into implicit input. The array [1, 0.5+0.5j] used as an index
         % is interpreted as [1:0.5+end*0.5]

1
와우, 공격 태도를 보여준 인수로 복잡한 값을 처리 할 수있는 매우 깔끔한 방법입니다
마일

@ 마일 감사합니다! 예, 편리합니다. 허수 단위는로 작동 end하고 배열 요소 사이의 콜론은 암시 적입니다.
Luis Mendo





3

펄, 15 바이트

에 +2 포함 -lp

STDIN에 입력 문자열을 제공하십시오.

depal.pl <<< "HelleH"

depal.pl:

#!/usr/bin/perl -lp
s/../chop/reg

-l입력 한 마지막 개행없이 회문,하지만 난 그것을 사용하는 다른 펄 솔루션을 공정하게 포함하면 정말 필요하지 않습니다.



2

TI 기본, 14 바이트

표준 기능. 인덱스 1에서 인덱스 (길이 / 2 + 1/2)까지 문자열을 반환합니다.

sub(Ans,1,.5+.5length(Ans

2

GameMaker 언어, 59 바이트

a=argument0 return string_copy(a,1,ceil(string_length(a)/2)

2

PHP, 40 바이트

<?=substr($a=$argv[1],0,1+strlen($a)/2);

strlen($a)/2입력이 항상 홀수 길이를 +1가지면 int로 캐스트 됩니다.

모든 길이에 대해 42 바이트 :

<?=substr($a=$argv[1],0,(1+strlen($a))/2);

알 수없는 길이의 경우 (1+strlen)/2int로 캐스팅되고 반올림됩니다 strlen/2.


입력이 this ( codegolf.stackexchange.com/questions/98325/… ) 시도 에서 오는 것으로 정의되므로 길이는 항상 홀수이므로 더 짧은 길이로 갈 수 있습니다.
user59178

2

딥, 8 바이트

H{C'0ÏEI

설명:

           # Implicit input
 H         # Push length of input
  {        # Add 1
   C       # Divide by 2
    '      # Convert to int
     0Ï    # Get string back
       E   # Push prefixes of string
        I  # Push prefixes[a]
           # Implicit print

이것은 아마도 훨씬 향상 될 수 있습니다.


2

Perl, 23 + 2 ( -pl플래그) = 28 25 바이트

perl -ple '$_=substr$_,0,1+y///c/2'

언 골프 드 :

while (<>) {             # -p flag
    chomp($_)            # -l flag
    $_ = substr($_, 0, 1 + length($_) / 2);
    print($_, "\n")      # -pl flag
}

감사합니다 @ardnew.


1
당신은 대체하여 3 개 문자를 저장할 수 length()y|||c
ardnew

2

Befunge , 24 22 바이트

~:0`!#v_\1+
0:-2,\_@#`

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


Befunge에는 문자열 또는 배열 유형이 없으므로 모든 것이 한 번에 한 문자 씩 스택에서 수행됩니다. 맨 위 줄의 첫 번째 루프는 읽은 문자 수를 계산합니다 (스택에서 2 개 미만의 요소로 스와핑하면 초기 0이 생성됨). 두 번째 (가운데 줄)는 문자를 인쇄하며 두 배 빠르게 카운트 다운합니다. 결과적으로 입력의 마지막 절반 만 인쇄되지만 LIFO는 올바른 순서로 인쇄됩니다.

더 나은 첫 번째 루프 버전을 제공 한 Brian Gradin 에게 감사합니다 .


1
당신은 반 시간, 7 바이트 : 나를 이길 befunge.tryitonline.net/...
브라이언 Gradin

@BrianGradin, 좋아. 지금 나는 당신을 9 바이트로 이겼습니다;)
Linus

그래. 당신이 한 일을 봅니다. 인쇄 할 실제 문자 수를 계산하는 대신 2로 카운트 다운하지 않았습니다. 잘 했어요
Brian Gradin

2

Perl, 14 + 3 ( -lF플래그) = 19 17 바이트

5.20.0+의 경우 :

perl -lF -E 'say@F[0..@F/2]'

5.10.0+ (19 바이트)의 경우 :

perl -nlaF -E 'say@F[0..@F/2]'

언 골프 드 :

while (<>) {             # -n flag (implicitly sets by -F in 5.20.0+)
    chomp($_)            # -l flag
    @F = split('', $_);  # -aF flag (implicitly sets by -F in 5.20.0+)
    say(@F[0 .. (scalar(@F) / 2)]);
}

감사합니다 @simbabque.


2
당신은 당신은 설정할 필요가 없습니다, 2 바이트를 저장할 수 있습니다 -n-a때문에 -F그렇게 암시한다.
simbabque

@simbabque 예. 그러나 5.20.0 이상에만 해당됩니다.
Denis Ibaev


2

Pyth , 8 7 바이트

<zh/lz2

@Steven H 덕분에 1을 저장했습니다.

가장 짧은 Pyth 답변 (반으로)이 아니지만 언어를 배우기 위해 노력하고 있으며이 언어를 사용하는 첫 번째 게시물입니다. 의견이나 의견이 있으면 아무 것도 게시하지 않았습니다. 그것은 내가 실제로 일한 첫 번째 Pyth 프로그램이기도합니다. :)

이제 @Maltysen의 4 바이트 답변이 어떻게 작동하는지 알아야합니다. :-)


1
Maltysen의 대답이 어떻게 작동하는지 여전히 알고 싶다면 c입력 Q2조각 으로 홉핑하고 첫 번째 조각을 사용합니다 h(chop의 구현 덕분에 중심 문자도 잡습니다). 코드에 관해서는, 당신은 대체 할 수 +1h숫자를 증가를 위해, 내장을.
Steven H.

설명과 h힌트 @Steven H에 감사드립니다. 너무 많은 내장 기능이 있습니다. 모두 찾기에 시간이 걸리는 것 같습니다. :)
ElPedro

1
문제 없어요! 도움이 필요하면 19 번째 바이트로 핑 (Ping) 해보십시오.
Steven H.


2

C, 31 30 바이트

Cyoce 덕분에 1 바이트 절약.

f(char*c){c[-~strlen(c)/2]=0;}

용법:

main(){
 char a[]="hellolleh";
 f(a);
 printf("%s\n",a);
}

@KevinCruijssen 수정
Karl Napf

안녕하세요, 댓글을 삭제했습니다. 심지어 회문에서도 작동하지 않는다고 말하는 것이 옳았습니다. 그러나 이것은 다른 도전과 반대이므로 회문에도 테스트 사례가 없습니다. 죄송합니다. 변경 사항을 취소 할 수 있습니다. 나에게서 +1 :)
Kevin Cruijssen

2
글쎄, 지금은 길이가 같고 짝수 + 홀드에서 작동하며 골퍼처럼 보입니다. 나는 이것으로 괜찮습니다.
Karl Napf

이것은 틀림없이 메모리 누수 :-)입니다
ShreevatsaR

1
공간을 제거 할 수 있다고 생각합니다char* c
Cyoce

1

파이썬 2, 23 바이트

lambda x:x[:len(x)/2+1]

파이썬 2가 필요하다고 생각합니다. 당신은 당신의 대답에 표시해야합니다
Luis Mendo

@LuisMendo 아, 감사합니다!
Rɪᴋᴇʀ

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