lwap เธอโหยหาโซ่ตรวน!


27

ให้ลิสต์หรือสตริงคั่นรายการเอาต์พุตหรือสตริงที่คั่นด้วยอักขระแรกของแต่ละคำหนึ่งคำในภายหลัง

สำหรับความท้าทายนี้ "คำ" ประกอบด้วยอักขระ ASCII ที่พิมพ์ได้ทั้งหมดยกเว้นช่องว่างบรรทัดใหม่และอักขระแท็บ

ตัวอย่างเช่นใช้สตริง "สวัสดีตอนบ่ายโลก!" (คั่นด้วยช่องว่าง):

1. String
"Good afternoon, World!"

2. Get the first characters:
"[G]ood [a]fternoon, [W]orld!"

3. Move the characters over. The character at the end gets moved to the beginning.
"[W]ood [G]fternoon, [a]orld!"

4. Final string
"Wood Gfternoon, aorld!"

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ!

กรณีทดสอบ:

Input -> output (space-delimited)

"Good afternoon, World!" -> "Wood Gfternoon, aorld!"
"This is a long sentence." -> "shis Ts i aong lentence."
"Programming Puzzles and Code Golf" -> Grogramming Puzzles Pnd aode Colf"
"Input -> output" -> "onput I> -utput"
"The quick brown fox jumped over the lazy dog." -> "dhe Tuick qrown box fumped jver ohe tazy log."
"good green grass grows." -> "good green grass grows."

อนุญาตพื้นที่ส่วนท้ายในเอาต์พุตหรือไม่?
ธุรกิจ Cat

เราคิดได้ไหมว่าจะมีช่องว่างระหว่างคำมากที่สุด?
คณิตศาสตร์ junkie

ด้วยกฎบางอย่างที่ตัวอักษรสามารถติดตามกันได้คุณจะต้องมีตัวสร้างสปูนเนอร์en.wikipedia.org/wiki/Spoonerism
ชื่อที่แสดง

@BusinessCat ใช่
สหาย SparklePony

@mathjunkie ใช่
สหาย SparklePony

คำตอบ:



8

Japt , 11 10 9 8 ไบต์

ใช้ประโยชน์จากการห่อดัชนีของ Japtor และการจัดทำดัชนีเชิงลบ

ËhUgEÉ g

ลองออนไลน์


คำอธิบาย

        :Implicit input of array U (each element is an individual word).
Ë       :Map over the array.
h       :Replace the first character of the current element (word) ...
Ug      :  with the word in the array at index ...
EÉ      :    current index (E) -1's ...
g       :  first character.
        :Implicit output of array of modified words

ฉันคิดว่าคุณสามารถป้อนข้อมูลเป็นรายการได้เช่นกันประหยัดไบต์ต่อไปใน¸
ETHproductions

นั่นอาจจะเป็นการยืด @ETHproductions แต่ฉันจะถาม แก้ไข: ยืนยันที่นี่
Shaggy

1
ใช่ที่จุดเริ่มต้นของการโพสต์บอกว่า "ได้รับรายการหรือสตริงที่คั่นด้วย" ไม่แน่ใจว่านานแค่ไหนที่มีแม้ว่า (ฉันเดาตั้งแต่ความท้าทายถูกโพสต์ครั้งแรก)
ETHproductions

ทำได้ดีนี่! การใช้hเป็นความคิดที่ดี ฉันมาด้วย£g´Y ¯1 +XÅซึ่งสามารถเป็น£ XhUg´Y ¯1โดยใช้เทคนิคของคุณ
Oliver

5

Haskell , 43 ไบต์

p%((a:b):r)=(p:b):a%r
_%e=e
(%)=<<head.last

ลองออนไลน์! ใช้รายการสตริงสำหรับอินพุตและเอาต์พุต

จดจำตัวอักษรตัวแรกของคำก่อนหน้านี้pและทำให้ตัวอักษรตัวแรกของคำปัจจุบันซ้ำในขณะที่ส่งตัวอักษรตัวแรกใหม่ลงห่วงโซ่ ตัวอักษรตัวแรกก่อนหน้านี้เริ่มต้นเป็นตัวอักษรตัวแรกของคำสุดท้าย


4

Ruby, 85 77 63 ไบต์

ค่อนข้างแน่ใจว่านี่อาจสั้นกว่านี้มาก

แก้ไข: ขอบคุณสำหรับ @manatwork สำหรับการรวบรวม -> แผนที่

a=gets.split;$><<a.zip(a.rotate -1).map{|x,y|y[0]+x[1..-1]}*' '

คุณสามารถแทนที่ทั้งสอง.collectและมี.each .map
จัดการ

1
-pตั้งค่าสถานะ (+1 ไบต์) และi=-2;gsub(r=/\b\w/){$_.scan(r)[i+=1]}golfage ที่สุด
Value Ink


4

CJam , 12 10 9 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ jimmy23013

q~Sf+:()o

รับอินพุตเป็นรายการของคำ

ลองออนไลน์!

คำอธิบาย

     e# Example input: ["Good" "afternoon," "World!"]
q~   e# Read and eval the input.
     e# STACK: [["Good" "afternoon," "World!"]]
Sf+  e# Append a space to each word.
     e# STACK: [["Good " "afternoon, " "World! "]]
:(   e# Remove the first character from each substring.
     e# STACK: [["ood " 'G "fternoon, " 'a "orld! " 'W]]
)o   e# Remove and print the last element of the array.
     e# STACK: [["ood " 'G "fternoon, " 'a "orld! "]]
     e# Implicitly join the remaining array with no separator and output.

คุณสามารถนำเข้าและส่งออกเป็นรายการคุณรู้
สหาย SparklePony

@ComradeSparklePony คุณยืนยันว่าหลังจากฉันตอบ: P Golfing มันตอนนี้
Business Cat

)o1m>สำหรับ
jimmy23013


3

JavaScript (ES6), 46 ไบต์

s=>s.map((k,i)=>s.slice(i-1)[0][0]+k.slice(1))

รับประโยชน์จากความจริงที่slice(-1)คืนองค์ประกอบสุดท้ายของอาร์เรย์

เศษเล็กเศษน้อย


คุณสามารถลบการเข้าร่วมได้หรือไม่ คำถามระบุว่าคุณสามารถส่งออกรายการ มันจะประหยัดได้ 8 ไบต์
Craig Ayre

1
@ CraigAyre หวานขอบคุณ!
Rick Hitchcock

3

เป็นกลุ่ม, 16 , 9 ไบต์

<C-v>GdjPGD{P

บันทึก 7 ไบต์ด้วย @Wossname!

ใช้อินพุตหนึ่งคำต่อบรรทัดเช่น

Hello
world
and
good
day
to
you

ฉันเชื่อว่าสิ่งนี้ควรจะดีเพราะการป้อนข้อมูลเป็นรายการที่ได้รับอนุญาต

ลองออนไลน์!


มันสามารถทำได้ใน 12 การกดแป้นถ้าคุณทำ 'ด้วยมือ' เหมือนเดิม ไม่แน่ใจว่าจะประกบไวยากรณ์นั้นที่นี่ได้อย่างไรหรือถ้ามันใช้ได้แม้ในจิ๊กซอว์นี้ ^vGdjPGd$ggP (โดยที่ ^ v คือคำสั่งผสมคีย์ [control + v] เพียงให้แน่ใจว่าได้เริ่มต้นด้วยเคอร์เซอร์ที่ด้านบนซ้ายและอยู่ในโหมดคำสั่ง)
Wossname

@ Wossname อานั่นเป็นความคิดที่ยอดเยี่ยม! มีสิ่งเล็ก ๆ สองสามอย่างที่ฉันเพิ่มเข้ามาเพื่อช่วยประหยัดไบต์ได้มากขึ้น (เช่นdd -> D,, gg -> }) ขอบคุณสำหรับเคล็ดลับ
DJMcMayhem

ฉันไม่รู้ว่า dd และ gg ทั้งคู่มีเวอร์ชั่นที่สั้นกว่า! ยอดเยี่ยม :)
Wossname

วิธีการเกี่ยวกับการใช้ "แท็กตัวยก HTML" รอบตัวอักษร v ในรหัสแทนที่จะเป็น "<Cv>"? นั่นจะทำให้โค้ดดูยาวมากเมื่อเห็นในคำตอบ ดังนั้นโค้ดของคุณจะดูเหมือน ... <sup> V </sup> GdjPGD {P ... ซึ่งดูค่อนข้างเรียบร้อยเมื่อหน้าเว็บสแต็กการแลกเปลี่ยนรูปแบบถูกต้อง
Wossname

1
เห็นไหมวงเล็บปีกกากระโดดไปมาระหว่างย่อหน้ามันใช้งานได้ที่นี่เพราะเราเกี่ยวข้องกับย่อหน้าเดียวเท่านั้น เย็น. โอ้ว้าวที่ทำให้การเลื่อนอย่างรวดเร็วผ่านไฟล์โค้ดขนาดใหญ่นั้นง่ายจริงๆ! ขอบคุณสำหรับเคล็ดลับนั้น :)
Wossname

3

> <> , 44 45 ไบต์

90.f3+0.>&i&01.>~r&l0=?;o20.
 i:" "=?^:1+ ?!^

ถือว่าคำที่คั่นด้วยช่องว่าง

การแก้ไขโดย Aaron เพิ่ม 1 ไบต์


2

Python 2, 74 ไบต์

ลองออนไลน์

S=input().split()
print' '.join(b[0]+a[1:]for a,b in zip(S,S[-1:]+S[:-1]))

-5 ไบต์ขอบคุณ @Rod


@Rod ข้อเสนอแนะที่ดีขอขอบคุณ!
Possum ที่ตายแล้ว

4
S[:-1]สามารถย่อให้เหลือน้อยS; การบีบอัดรายการความยาวที่แตกต่างกันจะตัดให้สั้นกว่าโดยอัตโนมัติ
Julian Wolf

2

Haskell , 50 ไบต์

f=zipWith(:).((:).last<*>init).map head<*>map tail

อินพุตและเอาต์พุตเป็นรายการคำศัพท์


1
f=ฟังก์ชั่นสามารถเป็นชื่อเพื่อให้คุณสามารถละเว้น
nimi

1
โอ้เยี่ยมฉันไม่ทราบว่ามีคอมไพเลอร์ออนไลน์สำหรับ Haskell ฉันจะลบความคิดเห็นของฉันเนื่องจากฉันผิด ^^
คดีของกองทุนโมนิกา


2

C #, 78 77 ไบต์

using System.Linq;a=>a.Select((s,i)=>a[i-->0?i:a.Count-1][0]+s.Substring(1));

คอมไพล์ให้เป็นFunc<List<string>, IEnumerable<string>>เวอร์ชั่นเต็ม / ฟอร์แมต:

using System;
using System.Collections.Generic;
using System.Linq;

class P
{
    static void Main()
    {
        Func<List<string>, IEnumerable<string>> f = a =>
                a.Select((s, i) => a[i-- > 0 ? i : a.Count - 1][0] + s.Substring(1));

        Console.WriteLine(string.Join(" ", f(new List<string>() { "Good", "afternoon,", "World!" })));
        Console.WriteLine(string.Join(" ", f(new List<string>() { "This", "is", "a", "long", "sentence." })));

        Console.ReadLine();
    }
}

2

Brachylogขนาด 12 ไบต์

{hᵐ↻|bᵐ}ᶠzcᵐ

ลองออนไลน์!

คำอธิบาย

Example input: ["Good","afternoon,","World!"]

{      }ᶠ       Find: [["W","G","a"],["ood","fternoon,","orld!"]]
 hᵐ↻              Take the head of each string, cyclically permute them
    |             (and)
     bᵐ           Get the strings without their heads
         z      Zip: [["W","ood"],["G","fternoon,"],["a","orld!"]]
          cᵐ    Map concatenate on each list: ["Wood","Gfternoon,","aorld!"]

2

R, 72 70 ไบต์

function(x)paste0(substr(x,1,1)[c(y<-length(x),2:y-1)],substring(x,2))

ลองออนไลน์

บันทึก 2 ไบต์ด้วย Giuseppe

อินพุตและเอาต์พุตเป็นรายการ ใช้สตริงย่อยที่ประกอบด้วยตัวอักษรตัวแรกวนรอบตัวสุดท้ายไปด้านหน้าและวางไว้พร้อมกับซับสตริงที่เหลือของแต่ละคำ ขั้นตอนการขี่จักรยานเป็นนักฆ่า แต่ฉันไม่สามารถหาวิธีที่จะลดความมันลงได้อีก


1
คุณสามารถใช้2:y-1แทน1:(y-1)เนื่องจาก:จะมีความสำคัญมากกว่า-ซึ่งจะช่วยให้คุณประหยัด 2 ไบต์
Giuseppe


2

Python 2 + Numpy, 104 ไบต์

from numpy import *
s=fromstring(input(),"b")
m=roll(s==32,1)
m[0]=1
s[m]=roll(s[m],1)
print s.tobytes()

1
คุณต้องรวมคำสั่งการนำเข้าในการนับไบต์ คำตอบที่ยอดเยี่ยม!
สหาย SparklePony

นอกจากนี้คุณต้องมีรหัสอินพุทและเอาท์พุทของคุณในจำนวนไบต์
Felipe Nardi Batista

1
ฉันคิดว่าคุณสามารถวางบรรทัดใหม่สุดท้ายสำหรับ 1 ไบต์
Ørjan Johansen

@ ØrjanJohansenใช่เช่นกัน "b" แทน "u1" ทำงานดังนั้น -2 ไบต์
Mikhail V



1

Retina, 46 37 31 ไบต์

(\S)(\S* +)
$2$1
(.* .)(.)
$2$1

ลองออนไลน์

ยังคงถูก golfed ..


1
คุณไม่สามารถวาง(.*)และ$3?
Neil

@Neil ใช่ขอบคุณ
คณิตศาสตร์ junkie

หากคุณเปลี่ยน+ในบรรทัดแรกเป็น*คุณจะเปลี่ยน(.* .)เป็นบรรทัดที่สาม(.*)เป็น -2 ไบต์ ลองออนไลน์!
PunPun1000

1

kdb +, 25 22 ไบต์

วิธีการแก้:

rotate[-1;1#'a],'1_'a:

ตัวอย่าง:

q)rotate[-1;1#'a],'1_'a:("The";"quick";"brown";"fox";"jumped";"over";"the";"lazy";"dog.")
"dhe"
"Tuick"
"qrown"
"box"
"fumped"
"jver"
"ohe"
"tazy"
"log."

คำอธิบาย:

1_'a:             // (y) drop first character of each element of a
,'                // join each left with each right
rotate[-1;1#'a]   // (x) take first character of each element of a, rotate backwards 1 char

เสริม:

เวอร์ชันที่ใช้สตริงปกติ (37 ไบต์):

q){" "sv rotate[-1;1#'a],'1_'a:" "vs x}"The quick brown fox jumped over the lazy dog."
"dhe Tuick qrown box fumped jver ohe tazy log."


0

เรติน่า25 25ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

Om$`^.((?=.*¶))?
$#1

ลองออนไลน์!

อินพุตและเอาต์พุตแยกจากกันด้วยการป้อนบรรทัด ชุดทดสอบดำเนินการแปลง I / O ที่จำเป็นจากการแยกพื้นที่


มันเป็นเรื่องปกติที่จะใช้การแยก linefeed
สหาย SparklePony

0

Mathematica, 134 ไบต์

(w=Characters@StringSplit@#;d=Drop[w,0,1];StringRiffle[StringJoin/@Table[PrependTo[d[[i]],RotateRight[First/@w][[i]]],{i,Length@w}]])&


0

Java (OpenJDK 8) , 97 ไบต์

for(int n=s.length,i=0,j=n-1;i<n;j%=n)System.out.print(s[j++].charAt(0)+s[i++].substring(1)+" ");

ลองออนไลน์!


นี่เป็นตัวอย่างไม่ใช่ฟังก์ชั่น นอกจากนี้คุณควรใช้สตริงทั้งหมดเป็นหนึ่งอาร์กิวเมนต์และเก็บเครื่องหมายจุลภาคและเครื่องหมายคำถาม / การตรวจสอบในผลลัพธ์ตามที่เป็นอยู่
Kevin Cruijssen

0

C, 106 77 ไบต์

i,a,b;f(char*o){a=*o;for(i=0;o[i++];)if(o[i]==32){b=o[++i];o[i]=a;a=b;}*o=a;}

-29 ไบต์จาก scottinet

แก้ไขสตริงในสถานที่

Ungolfed:

char *f(char *o){
    char a=*o,b; // start with a as the first character of the first word
    for(int i=0;++i<strlen(o);){
        // iterate through the string with i as the index
        if(o[i]==32){ // if the current character is a space, 
                      // i.e. if a word begins after this character
            b=o[++i]; // store the beginning of the next word in b
            o[i]=a; // set the beginning of the next word to a
            a=b; // set a to what the beginning of the next work used to be
        }
    }
    *o=a; 
    // set the beginning of the first word to the old beginning of the last word
}

ข้อเสนอเวอร์ชัน Golfier (รหัสเดียวกันแน่นอน): -29 bytes
scottinet



0

Huskขนาด 11 ไบต์

Foz:ṙ_1TmΓ,

อินพุตและเอาต์พุตเป็นรายการสตริงลองออนไลน์!

(ส่วนหัวเพียงแปลงอินพุตเป็นรายการคำและรวมรายการผลลัพธ์ด้วยช่องว่าง)

คำอธิบาย

F(z:ṙ_1)TmΓ,  -- example input: ["Good" "afternoon,","World!"]
         m    -- map the following (example on "Good")
          Γ   -- | pattern match head & tail: 'G' "ood"
           ,  -- | construct tuple: ('G',"ood")
              -- : [('G',"ood"),('a',"fternoon,"),('W',"orld!")]
        T     -- unzip: ("GaW",["ood","fternoon,","orld!"])
F(     )      -- apply the function to the pair
    ṙ_1       -- | rotate first argument by 1 (to right): "WGa"
  z:          -- | zip the two by (example with 'W' and "ood")
              -- | | cons/(re)construct string: "Wood"
              -- :-: ["Wood","Gfternoon,","aorld!"]

ทางเลือก 11 ไบต์

§oz:ṙ_1m←mt

ลองออนไลน์!


0

AWK , 63 ไบต์

{for(R=substr($NF,1,1);++j<=NF;R=r)sub(r=substr($j,1,1),R,$j)}1

ลองออนไลน์!

ดูเหมือนว่าควรจะมีวิธีการลดความซ้ำซ้อน แต่ฉันไม่เห็น

หมายเหตุ: ลิงก์ TIO มี 4 ไบต์พิเศษเพื่ออนุญาตให้ใช้อินพุตแบบหลายบรรทัด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.