การผสมอักขระในสตริง


10

คุณต้องเขียนฟังก์ชั่น / โปรแกรมที่จะเข้าผ่านทางstdin/ อาร์กิวเมนต์บรรทัดคำสั่ง / 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
สำหรับความท้าทายในอนาคตให้ฉันแนะนำsandboxที่คุณสามารถรับข้อเสนอแนะและขัดกับความท้าทายของคุณก่อนที่จะโพสต์ไว้บนหลัก
Martin Ender

เหตุใดจึงต้องป้อนข้อมูลใน stdin และไม่ใช่เช่นเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
LRN

@lrn ถูกต้อง เพิ่มอีก 2 ตัวเลือก
Spikatrix

ฉันเห็นวิธีแก้ไขปัญหาด้านล่างซึ่งสมมติว่าพวกเขาสามารถรับรายการดัชนีเป็นอาร์เรย์ที่ได้รับการส่งผ่านไปยังฟังก์ชันที่ใช้งานได้ วิธีที่ฉันอ่านคำนิยามของคุณอินพุตเป็นสตริงเดี่ยวซึ่งมีดัชนีเช่นเดียวกับสตริงที่พวกเขาทำงานอยู่และการแยกดัชนีจากอินพุตสตริงนั้นเป็นส่วนหนึ่งของรหัสที่จำเป็นต้องมี golfed คุณช่วยอธิบายการตีความที่ถูกต้องได้หรือไม่?
Reto Koradi

@RetoKoradi เลขที่การป้อนไม่ใช่สตริงแบบเต็ม มันมีสตริงและตัวเลข ตัวเลขไม่รวมอยู่ในสตริง
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

Python 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="")

แกะทุกสิ่ง (บันทึก 3 ไบต์ด้วย @potato)


บันทึกสองสามไบต์และทำสิ่งนี้: [*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 (137 b)

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 = คำพูดของชนิดchar *

V = อาร์เรย์ขององค์ประกอบจำนวนเต็มคู่

L = ความยาวของ V

เอาท์พุต

สตริงผสม

มันทำงานยังไง? :

กวาดตัวเลขของอาร์เรย์ V ในทางกลับกันและวางองค์ประกอบที่ n ของสตริงหลังจากติดตามความคืบหน้าทั้งหมดจนถึงจุดที่เกิดขึ้นจริง ตัวอย่าง

input = T = "First", 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

Python 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+2c+=2
ทิม

@Tim ขอบคุณสำหรับความช่วยเหลือของคุณ!
ASCIIThenANSI

ไม่ควรเริ่มที่ 0
ทิม

@ Tim Nope cอันที่จริงคือการจัดทำดัชนีt(อินพุต) เพื่อให้ได้ตำแหน่งที่เราต้องการสลับ แต่เนื่องจากt[0]เป็นสตริงที่เราจำเป็นต้องสลับไปมาt[1]และt[2]ถือแลกเปลี่ยนคู่แรก
ASCIIThenANSI

อ่าฉันเข้าใจแล้วใช่ ขออภัยแยกวิธีการแก้ปัญหาของฉันออกป้อนข้อมูลดังนั้นฉันเดาคุณต้องการทำ :) เดียวกัน
ทิม

2

C, 109 107 102 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);}

หมายเหตุ: sและaจำเป็นต้องประกาศให้เป็นอาร์เรย์ระดับโลก sคือสตริงที่คุณต้องการสลับและaเป็นอาร์เรย์ของintค่าตัวเลขทั้งหมด

หากรหัสด้านบนใช้งานไม่ได้ให้ลองใช้void f(){...}แทนf(){...}

รหัสไม่ได้รับการตอบกลับ:

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
}

ทดสอบที่นี่


อืมรหัส ur เป็น :) ขนาดเล็ก
Abr001am

ฮ่า ๆ การประกาศตัวแปรอยู่ที่ไหน? นั่นเป็นวิธีที่โกงที่จะกระชับรหัสของคุณ: p
Abr001am

@ Agawa001 ฉันไม่ได้รวมการประกาศตัวแปรเนื่องจากไบต์จะแตกต่างกันไปในแต่ละกรณีทดสอบ
Spikatrix

สิ่งนี้ไม่ตรงกับอินพุตตามที่กำหนดไว้ในปัญหา อินพุตเป็นสตริงเดี่ยว คุณจะต้องแยกค่าดัชนีออกจากสตริงอินพุต
Reto Koradi

1

Python 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 ฉันตัดสินใจที่จะทำให้ 'โมฆะ' 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 และใช้สิ่งที่ผู้ประกอบการเครื่องหมายจุลภาคแนะนำจุดลำดับที่จะมีพฤติกรรมที่กำหนด

แก้ไข: ตามคำขอคุณสามารถทดสอบออก: 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());
}

Run / ทดสอบนี้ในdartpad.dartlang.org


คุณรู้จักคอมไพเลอร์ออนไลน์ที่ฉันสามารถทดสอบได้ไหม?
Spikatrix

เพิ่มลิงค์ไปยัง DartPad
LRN

1

Rebol - 71

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

Ungolfed:

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ให้เป็นค่าที่คุณต้องการทดสอบ นี่คือตัวอย่างเต็มรูปแบบของการทดสอบครั้งแรก - 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 3 NB Rebol ใช้การจัดทำดัชนีแบบ 1 ฐาน
draegtun

@CoolGuy - อีกวิธีหนึ่งคุณสามารถดาวน์โหลด Rebol 3 ไบนารีได้จากrebolsource.net
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);}

โปรแกรมด้านบนรับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งคัดลอกสตริงลงในอาร์เรย์สลับอักขระที่สอดคล้องกันจากนั้นส่งเอาต์พุตสตริงที่แก้ไข

รหัสไม่ได้รับการตอบกลับ:

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 อักขระฉันไม่คิดว่าจะถูกต้อง ดูตัวอย่างที่ 3 ซึ่งมี10หนึ่งในดัชนี
Reto Koradi

@RetoKoradi ขอบคุณสำหรับการตรวจสอบว่า ฉันแก้ไขรหัส
Spikatrix

0

JavaScript (ES6), 95

95 ไบต์ด้วยอินพุตสตริงเดียว (ฟังก์ชัน f ด้านล่าง)

75 ไบต์พร้อม 2 พารามิเตอร์สตริงและอาร์เรย์ตัวเลข (ฟังก์ชัน 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.