문자열에서 문자 혼합


10

stdin/ command-line arguments / function arguments 를 통해 입력을 받고 문자열에서 문자를 혼합 한 다음을 통해 최종 문자열을 출력 하는 함수 / 프로그램을 작성해야 합니다 stdout.

입력에는 먼저 문자열 (공백 또는 null)이 아닌 공백과 공백이 아닌 짝수의 음수가 아닌 숫자가 포함됩니다. 함수 인수를 통해 입력을 받으면 문자열이 인수 중 하나가되고 공백으로 구분 된 정수가 다른 인수가됩니다. 연속 된 숫자 쌍에 해당하는 색인에서 문자열의 문자를 바꿔야합니다.

예를 들어 :

Hello_world! 0 6

발생해야합니다

wello_Horld!

가정

  • 0 기반 및 1 기반 색인 중에서 선택할 수 있으며 주어진 색인이 항상 범위 내에 있다고 가정 할 수 있습니다.
  • 문자열은 100자를 초과하지 않으며 범위 범위의 ASCII 문자 만 포함 !합니다 ~(문자 코드 0x21 ~ 0x7E 포함). 보기 ASCII 테이블을 참조.
  • 한 쌍의 두 지수는 동일 할 수 있습니다 (이 경우 해당 단계에서 스왑 된 것이 없음).

채점

이것은 코드 골프이므로 가장 짧은 제출 (바이트)이 이깁니다.

테스트 사례

Hello_world! 0 6 => wello_Horld!
First 1 2 1 0 0 4 => tFisr
(Second!$$) 8 7 10 1 => ()econd$!$S
~Third~ 0 0 6 6 0 6 6 0 => ~Third~

2
향후 과제 에 대해서는 메인에 게시하기 전에 피드백을 받고 문제를 해결할 수 있는 샌드 박스를 권장하겠습니다 (이로 인해 누군가 해결해야하는 과제에서 심각한 결함이 발견 될 경우 기존 답변이 무효화 될 위험이 최소화됩니다).
마틴 엔더

예를 들어 명령 행 인수가 아닌 stdin에 입력이 필요한 이유는 무엇입니까?
LRN

@lrn, 맞습니다. 옵션이 2 개 더 추가되었습니다.
Spikatrix

아래의 솔루션은 구현 한 함수에 전달되는 배열로 인덱스 목록을 얻을 수 있다고 가정합니다. 내가 당신의 정의를 읽는 방식으로, 입력은 단일 문자열이며, 여기에는 인덱스와 그들이 작동하는 문자열이 포함되어 있으며 입력 문자열에서 인덱스를 추출하는 것은 골퍼해야 할 코드의 일부입니다. 어떤 해석이 올바른지 명확히 할 수 있습니까?
Reto Koradi

@RetoKoradi, No. 입력이 전체 문자열이 아닙니다. 문자열과 숫자가 있습니다. 문자열에는 숫자가 포함되지 않습니다.
Spikatrix

답변:


6

CJam, 11 바이트

rr{irie\r}h

작동 원리

이것은 약간 다른 접근 방식으로 입력에 숫자 쌍이 남을 때까지 do-while 루프를 실행합니다.

r                 e# Read the first string
 r                e# Read the first number of the first number pair in the input
  {      }h       e# Do a do-while loop
   i              e# Convert the first number from the pair to integer
    ri            e# Read the second number from the pair and convert to intger
      e\          e# String X Y e\ works by swapping the Xth index with the Yth index in the
                  e# String
        r         e# This is our exit condition of the do-while loop. If we still have
                  e# a number on the input left, that means there are more pairs to swap.
                  e# Otherwise, we exit the loop and the result is printed automatically

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


6

파이썬 3, 89 86 바이트

[*s],*L=input().split()
while L:a,b,*L=map(int,L);s[a],s[b]=s[b],s[a]
print(*s,sep="")

모든 것을 풀으십시오. (@potato 덕분에 3 바이트 절약)


몇 바이트를 저장하고 이것을 수행하십시오. [*s],*L=input().split()그런 다음 줄을 가져갈 수 있습니다. 나는 당신의 솔루션을 정말 좋아합니다. 매우 골프를 치더라도 거의 우아합니다.
감자

@potato 오 와우, 당신이 두 개의 포장 풀기를 함께 가질 수 있다는 것을 몰랐습니다 (3.5에서만 가능하다고 생각했습니다). 감사!
Sp3000

4

CJam, 13 바이트

r[q~]2/{~e\}/

여기에서 테스트하십시오.

설명

r             e# Read the first token, i.e. the string.
 [q~]         e# Read the rest of the input, eval it and wrap it in an array.
     2/       e# Split the array into pairs of consecutive elements.
       {   }/ e# For each pair.
        ~     e# Unwrap the array.
         e\   e# Swap the corresponding elements in the string.

우와 그렇게 빠른 답변을 기대하지 않았습니다!
Spikatrix

2

C (137b)

f(char*T,int*V,int L){int C=0;for(int j=0;j<strlen(T);C=++j){for(int i=L-1;i+1;i--)if(C==V[i]){C=V[i-i%2*2+1];i-=i%2;}printf("%c",T[C]);}}

설명이오고 있습니다 ...

인수

T = 형의 단어 문자 * .

V = 짝수 개의 정수 요소의 배열.

L = V의 길이

산출

혼합 문자열

어떻게 작동합니까? :

배열 V의 수를 반대로 스윕하고 실제 지점까지 모든 진행 상황을 추적 한 후 문자열의 n 번째 요소를 배치합니다.

input = T = "처음", V = {1,2,1,0,0,4}

V 역수 = {4,0,0,1,2,1}

V[0] = 4th element -> index 0
0 -> 1
1->2

4th element 't' receives the second = 'r'

V[1] = 0 -> index 4
4 isnt mentionned after so , no changes

0 element='F' receives the fourth= 't'

V[3] = 1st element -> index 0
no changes

V[4] = 2 -> index 1
no changes after ..

여기 사용해보십시오


1
@ Agawa001, 당신은 이것을 훨씬 더 골프 수 있습니다. 반환 유형은 int(예기치 않은 동작이 발생할 수 있습니다) 필요하지 않습니다, 그리고 int를 필요로하지 않는 매개 변수입니다 변수 int대신 루프에 선언, 변수, 루프, 사용 외부 한 곳에서 선언 할 수 있습니다 putchar대신 printf
Spikatrix

2

파이썬 3 - 161 149

import sys
t=sys.stdin.read().split()
q=list(t[0])
c=1
i=int
while c<len(t):n=q;a=i(t[c]);b=i(t[c+1]);n[a]=q[b];n[b]=q[a];q=n;c+=2;
print(''.join(q))

일부 변수를 바꾸고 ;Tim의 의견에서 와 같이 사용하여 더 많은 골프를 쳤다 .

나는 골프가 아닌 것처럼 보일 것이라고 기대했다.


1
당신은 이것을 많이 골프 수 있습니다. 변화 while에를 while c<len(t):line1;line2;line3.... c=c+2로 이동c+=2
Tim

@Tim 감사합니다!
ASCIIThenANSI

c를 0에서 시작하면 안됩니까?
Tim

@ 팀 아니. c실제로 t우리가 교환해야 할 위치를 얻기 위해 인덱싱 (입력)입니다. 그러나 이후 t[0]우리가 주위에 스왑 필요, 문자열입니다 t[1]t[2]스왑의 첫 번째 쌍을 누르고 있습니다.
ASCIIThenANSI

아 그렇습니다. 죄송합니다, 내 솔루션은 입력을 분리 했으므로 동일한 작업을 수행 한 것 같습니다 :)
Tim

2

C, 109 (107) 102 바이트

i;f(l){l=sizeof(a)/sizeof(*a);char t;for(;i<l;i+=2){t=s[a[i]];s[a[i]]=s[a[i+1]];s[a[i+1]]=t;}puts(s);}

참고 : sa요구 글로벌 배열로 선언합니다. s교환하려는 문자열이며 모든 숫자 값으로 a구성된 배열입니다 int.

위의 코드가 작동하지 않으면 void f(){...}대신 사용하십시오f(){...}

Ungolfed 코드 :

int a[]={1, 2, 1, 0, 0, 4};//Integer elements
char s[]="First";          //String to be swapped

i; //Auto initialized to 0 and defaults to type int
void f(l){ //Variables defaults to type int
  l=sizeof(a)/sizeof(*a); //Gets number of elements in array a
  char t;

  for(;i<l;i+=2){ 

    t=s[a[i]];
    s[a[i]]=s[a[i+1]];
    s[a[i+1]]=t;  //Swap each character

  }

  puts(s); //Print the final char array
}

여기에서 테스트


흠 코드가 작습니다 :)
Abr001am

lol 변수 선언은 어디에 있습니까? 그것은 당신의 코드를 강화하는 확실한 방법입니다 : p
Abr001am

@ Agawa001, 바이트는 각 테스트 사례에 따라 달라질 수 있으므로 변수 선언을 포함하지 않았습니다.
Spikatrix

문제에 정의 된 입력과 일치하지 않습니다. 입력은 단일 문자열입니다. 문제를 완전히 이해하지 못하면 입력 문자열에서 인덱스 값을 추출해야합니다.
Reto Koradi

1

파이썬 3, 135

x=input().split()
y=list(x[0])
z=[int(i)for i in x[1:]]
while z:p,c=y[z[0]],y[z[1]];y[z[0]],y[z[1]]=c,p;del z[0],z[0]
print(''.join(y))

설명:

x=input().split()         # Split the input into a list at each space
y=list(x[0])              # First item in list (the word) into a list of chars
z=[int(i)for i in x[1:]]  # Make the list of numbers, into integers
while z:                  # Loop untill the list z is empty
    p,c=y[z[0]],y[z[1]]   # Assign p to the first char and c to the second
    y[z[0]],y[z[1]]=c,p   # Swap around using p and c
    del z[0],z[0]         # Remove the first 2 items in the list of integers
print(''.join(y))         # Print out the altered list as a string

1

C, 70 바이트

입력 문자열의 길이가 최대 100이라는 점을 고려하면 정수 배열의 끝을 나타내는 'NULL'바이트를 명확하게하기로 결정했습니다 0xFF. 아마도 이것은 추가 입력으로 계산되지 않지만 7 3 바이트 의 비용 으로 1 기반 인덱싱으로 만들어 '\0'배열의 끝으로 사용할 수 있습니다 .

f(s,i,t)char*s,*i;{for(;~*i;)t=s[*i],s[*i]=s[*++i],s[*i++]=t;puts(s);}

tmp 변수를 사용하여 정기적으로 스와핑을 수행하고 문자 수가 적지 만 정의되지 않은 동작을 유발하는 xor 스왑의 일부 표시와 달리 쉼표 연산자는 동작을 정의하기 위해 시퀀스 포인트를 도입하는 데 사용합니다.

편집 : 요청에 따라 http://rextester.com/OVOQ23313을 테스트 할 수 있습니다 .


인덱스가 교환 된 배열을 얻는다고 가정 할 수는 없습니다. 색인은 입력 문자열의 일부이므로 게시 된 (및 계산 된) 코드의 일부로 문자열에서 구문 분석해야합니다. 설명에서 : "입력은 먼저 문자열, 공백, 그리고 공백으로 분리 된 짝수의 음수가 아닌 숫자를 포함합니다."
Reto Koradi

1

다트-123

명령 행의 입력이 공백으로 자동 분할된다고 가정합니다. 그렇지 않으면 x=x[0].split(' ');문자열을 텍스트와 인덱스로 분할하기 위해 초기 가 필요합니다 .

main(x,{c,i:1,a,t}){c=x[0].split("");n()=>a=int.parse(x[i++]);for(;i<x.length;t=c[n()],c[a]=c[n()],c[a]=t);print(c.join());}

더 많은 공백으로 :

main(x,{c,i:1,a,t}){
  c=x[0].split("");
  n()=>a=int.parse(x[i++]);
  for(;i<x.length;t=c[n()],c[a]=c[n()],c[a]=t);
  print(c.join());
}

dartpad.dartlang.org에서 이것을 실행 / 테스트하십시오 .


이것을 테스트 할 수있는 온라인 컴파일러를 알고 있습니까?
Spikatrix

DartPad에 링크를 추가하십시오.
LRN

1

리볼-71

s: take i: split input" "foreach[a b]i[swap at s do a at s do b]print s

언 골프 드 :

s: take i: split input " " 
foreach [a b] i [swap at s do a at s do b]
print s

이것을 어떻게 테스트합니까? 이것을 테스트하기위한 온라인 컴파일러가 있습니까?
Spikatrix

@CoolGuy은 - 예 당신은 그것을 테스트 할 수 있습니다 try.rebol.nlinput 거기에서 STDIN를 호출 할 수 없습니다 기능. 해결 방법은 input테스트하려는 값 으로 간단하게 설정 하는 것입니다. 다음은 첫 번째 테스트의 전체 예입니다. Do in Rebol 3 NB를 input: "hello_World 1 7" s: take i: split input" "foreach[a b]i[swap at s do a at s do b]print s 클릭하십시오 . Rebol은 1 기반 인덱싱을 사용합니다.
draegtun

@CoolGuy-또는 rebolsource.net에서 Rebol
draegtun

0

C, 143 바이트

main(a,v,i)char** v;{i=2;char s[101],t;strcpy(s,v[1]);for(;i<a;i+=2){t=s[atoi(v[i])];s[atoi(v[i])]=s[atoi(v[i+1])];s[atoi(v[i+1])]=t;}puts(s);}

위의 프로그램은 명령 줄 인수에서 입력을 받아 문자열을 배열로 복사하고 해당 문자를 교체 한 다음 수정 된 문자열을 출력합니다.

Ungolfed 코드 :

main(int a,char** v,int i){ //Arguments of main 
  i = 2;
  char s[101],t;

  strcpy(s,v[1]); //Copy string literal into an array

  for(;i<a;i+=2){
    t=s[atoi(v[i])];
    s[atoi(v[i])]=s[atoi(v[i+1])];
    s[atoi(v[i+1])]=t;  //Swap each character
  }

  puts(s); // Output the final string
}

숫자에 숫자가 하나만 있다고 가정합니까? 입력이 최대 100 자일 수 있다고 생각하면 유효하지 않다고 생각합니다. 또한 10인덱스 중 하나 인 세 번째 예를 살펴보십시오 .
Reto Koradi

@RetoKoradi, 그것을 발견해 주셔서 감사합니다. 코드를 수정했습니다.
Spikatrix

0

자바 스크립트 (ES6), 95

단일 문자열 입력으로 95 바이트 (아래 함수 f)

2 개의 매개 변수, 문자열 및 숫자 배열을 가진 75 바이트 (아래 함수 g)

(EcmaScript 6, Firefox 만 해당)

f=i=>
(
  n=i.split(' '),
  s=[...n.shift()],
  n.map((v,i)=>i&1?[s[v],s[w]]=[s[w],s[v]]:w=v),
  s.join('')
)

g=(s,n)=>
  n.map((v,i)=>i&1?[s[v],s[w]]=[s[w],s[v]]:w=v,s=[...s])
  &&s.join('')

// TEST
out=x=>O.innerHTML+=x+'\n'

;[['Hello_world! 0 6', 'wello_Horld!']
,['First 1 2 1 0 0 4','tFisr']
,['(Second!$$) 8 7 10 1','()econd$!$S']
,['~Third~ 0 0 6 6 0 6 6 0','~Third~']]
.forEach(t=>{
  u=f(t[0]),
  ok=u==t[1],
  out('Test '+(ok?'OK: ':'FAIL: ')+t[0]+'\n Result:' +u + '\n Check: '+t[1]+'\n')
})
<pre id=O></pre>

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