이 도전 에 따라 생성 된 회문이 주어지면 이 를 탈회하십시오.
테스트 사례
abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf
이것은 depalindromizing에 관한 것이므로 코드는 palindrome 일 수 없습니다 .
이것은 code-golf 이므로 바이트 수가 가장 적은 코드가 이깁니다.
이 도전 에 따라 생성 된 회문이 주어지면 이 를 탈회하십시오.
abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf
이것은 depalindromizing에 관한 것이므로 코드는 palindrome 일 수 없습니다 .
이것은 code-golf 이므로 바이트 수가 가장 적은 코드가 이깁니다.
답변:
휴대 전화에서 테스트 할 수 없지만 작동해야합니다.
lambda s:s[:-~len(s)/2]
apt-get
휴대 전화에서 찾을 수 있다면 일반 휴대 전화가 아닐 수도 있습니다.
Dg;î£
설명:
D Duplicate
g;î Divide length by two and round up
£ First b letters of a
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)
s=>s.slice(0,s.length/2+1)
길이 때문에 항상 이상한 것
s=>s.slice(0,s.length/2+.5)
긴 길이도 작동 한다는 것을 알았 습니다.
-s.length/2
홀수 및 짝수 길이 모두에 대해 작동합니다.
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"
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]
end
하고 배열 요소 사이의 콜론은 암시 적입니다.
œs2Ḣ
œs2 Split input into 2 chunks of similar lengths. For odd-length input,
the first chunk is the longest
Ḣ Keep the first chunk
@2tr
@2 Split in half
t Take the second half
r Reverse it
입력의 길이가 홀수이면에 의해 생성 된 후반 @2
은 가장 긴 것입니다 (반전 후).
String c(String s){return s.substring(0,s.length()/2+1);}
}
(57 바이트).
<?=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)/2
int로 캐스팅되고 반올림됩니다 strlen/2
.
~:0`!#v_\1+
0:-2,\_@#`
Befunge에는 문자열 또는 배열 유형이 없으므로 모든 것이 한 번에 한 문자 씩 스택에서 수행됩니다. 맨 위 줄의 첫 번째 루프는 읽은 문자 수를 계산합니다 (스택에서 2 개 미만의 요소로 스와핑하면 초기 0이 생성됨). 두 번째 (가운데 줄)는 문자를 인쇄하며 두 배 빠르게 카운트 다운합니다. 결과적으로 입력의 마지막 절반 만 인쇄되지만 LIFO는 올바른 순서로 인쇄됩니다.
더 나은 첫 번째 루프 버전을 제공 한 Brian Gradin 에게 감사합니다 .
-lF
플래그) = 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.
-n
및 -a
때문에 -F
그렇게 암시한다.
,
[
[>,]
<[<]
>.,>[>]
<<
]
이것은 메인 루프를 시작하기 전에 입력을 소비하는보다 간단한 접근 방식보다 바이트를 절약합니다.
,[>,]
<
[
[<]
>.,>[>]
<,<
]
<zh/lz2
@Steven H 덕분에 1을 저장했습니다.
가장 짧은 Pyth 답변 (반으로)이 아니지만 언어를 배우기 위해 노력하고 있으며이 언어를 사용하는 첫 번째 게시물입니다. 의견이나 의견이 있으면 아무 것도 게시하지 않았습니다. 그것은 내가 실제로 일한 첫 번째 Pyth 프로그램이기도합니다. :)
이제 @Maltysen의 4 바이트 답변이 어떻게 작동하는지 알아야합니다. :-)
c
입력 Q
을 2
조각 으로 홉핑하고 첫 번째 조각을 사용합니다 h
(chop의 구현 덕분에 중심 문자도 잡습니다). 코드에 관해서는, 당신은 대체 할 수 +1
와 h
숫자를 증가를 위해, 내장을.
h
힌트 @Steven H에 감사드립니다. 너무 많은 내장 기능이 있습니다. 모두 찾기에 시간이 걸리는 것 같습니다. :)
Cyoce 덕분에 1 바이트 절약.
f(char*c){c[-~strlen(c)/2]=0;}
용법:
main(){
char a[]="hellolleh";
f(a);
printf("%s\n",a);
}
char* c
lambda x:x[:len(x)/2+1]
Easterly Irk의 답변 에서 아이디어를 빌리는 1 바이트 오프 ( 1
대신 추가 .5
)
@StewieGriffin 덕분에 2 바이트 오프 (불필요한 괄호)
@(x)x(1:end/2+1)