Helloellolloloo WorldWorldrldldd


50

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

ป้อนข้อมูล
ใด ๆ ของ 26 ตัวอักษรของตัวอักษรภาษาอังกฤษ อาจมีหลายคำคั่นด้วยช่องว่างและควรใช้การเปลี่ยนแปลงกับทุกคำ

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

ตัวอย่างเพิ่มเติม:

ill eel เอาท์พุท illlll eelell

laser bat เอาท์พุท laserasersererr batatt

darth vader เอาท์พุท dartharthrththh vaderaderdererr

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ

Clarification:
คุณสามารถปฏิบัติต่ออินพุตหรือเอาต์พุตเป็นรายการ คุณสามารถแยกคำด้วยการขึ้นบรรทัดใหม่แทนที่จะเว้นวรรค คุณสามารถเพิ่มช่องว่างต่อท้ายไปยังอินพุต


22
จริงๆแล้วคำพูดหลาย ๆ คำนั้นค่อนข้างน่ารำคาญ สิ่งที่มันต้องมีการแบ่งใช้ฟังก์ชั่นกับแต่ละคำแล้วเข้าร่วมอีกครั้ง นอกจากนี้ยังค่อนข้างอ่อนแอสำหรับ esolangs มากมายที่ต้องตรวจสอบพื้นที่ด้วยตนเอง
Jo King

4
เราสามารถรับอินพุตเป็นรายการคำและผลลัพธ์เช่นนี้ได้หรือไม่?
Quintec

4
คุณต้องการคำศัพท์ที่มีความยาวเท่าใด
MickyT

5
มันตกลงไหมสำหรับคำที่จะถูกคั่นด้วยการขึ้นบรรทัดใหม่ในผลลัพธ์ (แทนที่จะเว้นวรรค)?
JayCe

10
1.โปรดอัปเดตข้อมูลจำเพาะด้วยค่าเผื่อใหม่ (อาร์เรย์ I / O, ช่องว่างต่อท้าย ฯลฯ ) 2.โปรดแจ้งโซลูชันที่มีอยู่ในกรณีที่สามารถบันทึกไบต์ได้โดยใช้ประโยชน์จากพวกเขา
ปุย

คำตอบ:


34

Japtap -m, 6 3 ไบต์

อินพุตและเอาต์พุตเป็นอาร์เรย์ของคำ

£sY

ลองมัน


คำอธิบาย

        :For each word in the input array
£       :Map each letter at index Y
 sY     :  Slice the current word from index Y

1
กะทัดรัดจริง ๆ ดี!
qazwsx

9
@qazwsx: ตอนนี้กะทัดรัดขึ้น 50% !
Shaggy

1
ไม่ใช่£สองไบต์ใน UTF-8 ใช่ไหม
วิ

7
@Vi ฉันไม่ได้ใช้ UTF-8 ที่นี่
ขนปุย

36

brainfuck , 60 56 ไบต์

,[>++++++++[-<----<++++>>]<[>>]<[[<]>.[[-]>[.>]<[<]>]],]

ลองออนไลน์!

ต้องการพื้นที่ต่อท้ายและพิมพ์พื้นที่นำหน้า ทั้งสองคนนี้อาจจะโกง แต่ที่สิ้นสุดขึ้นที่112 ไบต์

คำอธิบาย

,[  Loop over each byte of input
  Tape: 32 w o r-32 d'
  >++++++++[-<----<++++>>]   Subtract 32 from the character and add 32 to the previous char
  Tape: 32 w o r d-32 0'
  <[>>]<   If the last character was a space
  Tape: 32 w o r d-32 0'
  or
  Tape: 32 w o r d' space-32
  [
    [<]>.   Move to the end of the word and print out the space
    [   Loop over each letter
      [-]    Remove the first letter (initially space)
      >[.>]  Print the rest of the word
      <[<]>  Move back to the first letter
    ]
    Tape: clear
  ]
,]  Get the next byte of input

21

Haskell, 36 21 ไบต์

map$concat.scanr(:)""

ลองออนไลน์!

แก้ไข: -15 ไบต์เนื่องจากรูปแบบ IO ใหม่ (รายการคำแทนคำคั่นด้วยช่องว่าง)


คุณสามารถโกน 5 ตัวอักษรโดยการแทนที่ด้วยscanr (:) "" tails
Frerich Raabe

1
@ FrerichRaabe: ใช่ แต่นั่นจะต้องมีimport Data.Listที่เพิ่ม 17 ไบต์ให้คะแนน
nimi

18

Perl -p, 36 25 23 ไบต์

s!\b|\S!$'=~s/ .*//r!eg

ลองออนไลน์!

นี่คือ regsub เดียว อันดับแรกมันตรงกับขอบเขตคำทั้งหมดหรืออักขระที่ไม่ใช่ช่องว่าง:

[][H][e][l][l][o] [][W][o][r][l][d]

โปรดทราบว่าการแข่งขันแต่ละรายการควรถูกแทนที่ด้วยคำที่เหลือ:

[→Hello][Hello][ello][llo][lo][o→] (...)

เราสามารถทำสิ่งนี้ให้สำเร็จด้วยตัวแปรพิเศษ$'ซึ่งเก็บส่วนของสตริงหลังการแข่งขัน อย่างไรก็ตามเราจำเป็นต้องใช้ regsub แบบซ้อนs/ .*//กับมันซึ่งจะลบทุกสิ่งที่ผ่านช่องว่างแรก$'ในเพื่อที่จะกำจัดคำที่เหลือในอินพุต

ขอบคุณ@nwellnhofสำหรับ 2 ไบต์


คุณสามารถแทนที่ด้วย[^ ] \S
nwellnhof

17

Python 3 , 49 ไบต์

d=lambda s:' '.join(n+d(n[1:])for n in s.split())

ลองออนไลน์!

สิ่งนี้ใช้ประโยชน์จากข้อเท็จจริงที่"".split()ส่งคืนอาร์เรย์ว่างเพื่อทำหน้าที่ตรวจสอบเคสฐานในการเรียกซ้ำ


17

เยลลี่ 3 ไบต์

ḊƬ€

ลองออนไลน์!

ไม่ต้องการKs อีกต่อไปเนื่องจากอาร์เรย์อินพุต / เอาท์พุตได้รับอนุญาตแล้ว

ḊƬ€
  €   For each word:
Ḋ       Remove the first letter
 Ƭ      until there are none left.

ฉันคิดว่าคุณต้องการḊƬẎ)(หรือḊƬF)ถ้าคุณต้องการ)
Erik the Outgolfer

@EriktheOutgolfer ฉันไม่คิดอย่างนั้น แต่ละคำจะถูกแทนด้วยอาร์เรย์ที่แยกจากกันในเอาต์พุต
dylnan

1
ฉันไม่แน่ใจว่าคุณสามารถอ้างสิทธิ์ได้หรือไม่เนื่องจากมีอาร์เรย์ซ้อนกันและไม่มีการระบุอะไรในคำถามที่จะอนุญาต
Erik the Outgolfer

15

APL (Dyalog), 19 9 ไบต์

{⌽∊,\⌽⍵}¨

ขอบคุณ @ H.PWiz สำหรับการเขย่าสมองของฉัน

ใช้งานได้เนื่องจากสตริงทั้งหมดใน APL เป็นอาร์เรย์อักขระ

{⌽∊,\⌽⍵}¨ 
        ¨ - for each string
      ⍵} - string argument - ex. "hello"
     ⌽ - reverse - "olleh"
   ,\ - scan magic - "o" "ol" "oll" "olle" "olleh"
  ∊ - enlist(join together) "oolollolleolleh"
{⌽ - reverse - "helloellolloloo"

TIO


15

JavaScript (ES6), 33 ไบต์

บันทึก 1 ไบต์ขอบคุณ @ShieruAsakoto

รูปแบบ I / O: อาร์เรย์ของคำ

a=>a.map(g=w=>w&&w+g(w.slice(1)))

ลองออนไลน์!


JavaScript (ES6), 35 ไบต์

รูปแบบ I / O: อาร์เรย์ของคำ

a=>a.map(w=>w.replace(/./g,"$&$'"))

ลองออนไลน์!


2
44:s=>s.replace(/\S+/g,g=s=>s&&s+g(s.slice(1)))
Shieru Asakoto

1
ขอบคุณสำหรับ "สิ่งใหม่" ของฉันในวันนี้; ไม่เคยรู้เกี่ยวกับ$'(หรือ$<backtick>)
Shaggy

13

R , 82 75 67 ไบต์

write(sapply(x<-scan(,""),substring,1:(y=max(nchar(x))),y),1,y,,"")

ลองออนไลน์!

หลายไบต์บันทึกขอบคุณJayCe

คั่นเอาต์พุตด้วยบรรทัดใหม่

sapply(...)แสดงออกสร้างเวกเตอร์เมทริกซ์ / คอลัมน์สตริงที่เหมาะสมกับการขยาย""ตามความจำเป็น writeแล้วพิมพ์องค์ประกอบของเมทริกซ์ต่อบรรทัดแยกพวกเขาด้วยy""


4
ใช้วิธีการที่แตกต่างออกไปขณะถือทารกง่วงนอน จะเพิ่มคำอธิบายในภายหลัง
Giuseppe

2
หากความยาวของคำถูก จำกัด เช่น 99 ตัวอักษรหรือ ~ 1e6 คุณสามารถเคาะจำนวนไบต์ด้วย...substring,1:1e6,1e6)...หรือคล้ายกัน
MickyT

2
หากคุณสามารถแยกคำโดยการขึ้นบรรทัดใหม่: ติ้ว ฉันได้ถามสิ่งนี้ในความคิดเห็น สามารถทำงานกับความคิดเห็นของ @ MickyT
JayCe

@JayCe ดูเหมือนว่าจะเป็น67 ไบต์ก่อนที่จะรวมคำแนะนำของ MickyT
Giuseppe

8

brainfuck , 94 93 ไบต์

-[-[-<]>>+<]>-<<+[[[-]<,[->+>+<<]>[-<+>]>>[-<->>+<]<]<<[>>+<<[-]]<[<]>[[.>]<[<]>[-]>]>>>>.<<]

ลองออนไลน์!

  • ที่บันทึกไว้หนึ่งขอบคุณไบต์Nitrodon - เล่นกอล์ฟไป.[-]>[.>]<[<]>[.>]<[<]>[-]>

คำอธิบาย

[[[ (dynamic) tape layout: ... NUL STR ... STR CHR FLG BUF SPC NUL ... ]]]

load a 32 into SPC
-[-[-<]>>+<]>-

while FLG
<<+[

 read a word
 [
  clear FLG; read CHR
  [-]<,
  copy CHR to BUF (using FLG as a temporary)
  [->+>+<<]>[-<+>]
  subtract SPC from BUF and save SPC
  >>[-<->>+<]
  move tape layout one to the right
  <
 ]

 strip trailing space; set FLG to true
 << [>>+<<[-]]
 to STR's first character
 <[<]>
 print word in all reduced forms
 [
  [.>]<[<]>[-]>
 ]

 print SPC; move to FLG
 >>>>.<<
]

ลองออนไลน์!

การแสดงที่มา

การรวบรวมอย่างต่อเนื่องทางสมองของ Esolang ถูกใช้สำหรับการโหลดพื้นที่เริ่มต้น


ดูเหมือนจะไม่สิ้นสุด นั่นตั้งใจหรือไม่
Jo King

1
@ โจกิ้งใช่ ในการใช้งานบางอย่างมันจะเกินขีด จำกัด เทปออกจากข้อผิดพลาด
Jonathan Frech

6

05AB1E , 5 ไบต์

€.síJ

ลองออนไลน์!

คำอธิบาย

€.s        # push suffixes of each
   í       # reverse each
    J      # join suffixes

1
ทางเลือกที่น่าเบื่อ 5 ไบต์: í€ηJí(เนื่องจากคำนำหน้าเป็นบิลด์ 1 ไบต์แทนที่จะเป็น 2 ไบต์เช่นคำต่อท้าย แต่ยังต้องการการย้อนกลับเพิ่มเติมแต่ละจุดอย่างไรก็ตามในตอนเริ่มต้นอย่างไรก็ตามจำนวนไบต์ยังคงอยู่ 5)
Kevin Cruijssen

6

Vim , 47 bytes (จังหวะสำคัญ 38 ครั้ง)

เริ่มต้นด้วยอินพุตของคุณเป็นบรรทัดเดียวในบัฟเฟอร์ Vim

:s/<Space>/\r/g<CR>ggqaywPlxqqb99@aj0q99@bgg99J

คำอธิบาย

สิ่งนี้ทำให้แต่ละคำอยู่ในบรรทัดของตัวเองซ้ำทุกบรรทัดแล้วเข้าร่วมพวกเขาทั้งหมด แตกถ้าคำมีความยาวมากกว่า 99 ตัวอักษรหรือถ้าข้อมูลของคุณมีมากกว่า 99 คำ

  1. :s/<Space>/\r/g<CR> แทนที่ช่องว่างด้วยบรรทัดใหม่ ( \r)
  2. gg วางเคอร์เซอร์ที่ตำแหน่งเริ่มต้นของบรรทัดแรก
  3. qaเริ่มบันทึกแมโคร a :
  4. qbเริ่มบันทึกแมโครb :
    • 99@aรันแมโครเก้าสิบเก้าครั้ง (แนะนำขีด จำกัด ของตัวอักษร)
    • j0 วางเคอร์เซอร์ที่ตำแหน่งเริ่มต้นของบรรทัดถัดไป
    • qหยุดการบันทึกแมโครb
  5. 99@bรันแมโครbเก้าสิบเก้าครั้ง (แนะนำขีด จำกัด ของคำ)
  6. gg วางเคอร์เซอร์ที่บรรทัดแรก
  7. 99J รวมเก้าสิบเก้าบรรทัดต่อไปนี้ด้วยช่องว่าง (ขีด จำกัด ของคำอีกครั้ง)

สำหรับอีก 2 ไบต์ (กดแป้น 2 ครั้ง) คุณสามารถขยายขีด จำกัด ของคำได้ถึง 999 ส่วนอีก 4 ไบต์, 9999 เป็นต้น


6

Husk , 6 4 ไบต์

-2 ไบต์ขอบคุณJonathan Allan (รับข้อมูลเป็นรายการ)!

moΣṫ

ลองออนไลน์!

คำอธิบาย

รับอินพุตเป็นรายการของสตริงและแม็พฟังก์ชันต่อไปนี้:

Σṫ  -- example argument: "abc"
 ṫ  -- tails: ["abc","bc","c"]
Σ   -- concat: "abcbcc"

การแยก & เข้าร่วมอาจไม่จำเป็นอีกต่อไปปัจจุบันข้อกำหนดดังกล่าวอยู่ในความคิดเห็น
Jonathan Allan

5

Retina 0.8.2 , 15 ไบต์

 
¶
.
$&$%'
¶
 

ลองออนไลน์! หมายเหตุ: ช่องว่างต่อท้าย คำอธิบาย:

แยกบนช่องว่าง

.
$&$%'

ต่อท้ายคำต่อท้ายตัวอักษรแต่ละตัว %หมายความว่าเราจะได้รับต่อท้ายของคำ

เข้าร่วมกับช่องว่าง



5

รหัสแอสเซมบลี x86 16 บิต 24 ไบต์

     47             inc    di
     B020           mov    al,20h
l1:  3806           cmp    [si],al
     7212           jb     l5 ;less means end of string
     7401           je     l2  ;equal means space was seen
     4F             dec    di ;overwrite extra space
l2:  E80300         call   l3
     46             inc    si ;move to next character in word
     75F1           jne    l1
l3:  56             push   si
l4:  3806           cmp    [si],al
     A4             movsb      ;copy character
     77FB           ja     l4  ;until either zero or space is seen
     5E             pop    si
l5:  C3             ret

โทรด้วย si = ตัวชี้ไปยังสตริงต้นทาง, di = ตัวชี้ไปยังบัฟเฟอร์เอาต์พุต
สตริงต้นทางต้องมีศูนย์ไบต์เพื่อสิ้นสุด
รหัสเหมือนกันใน 16- หรือ 32- หรือ 64- บิต (si / di กลายเป็น esi / edi หรือ rsi / rdi)
รหัส 32 บิตมีขนาดใหญ่กว่าสองไบต์เนื่องจากการโทรที่ขยาย
รหัส 64 บิตยังมีขนาดใหญ่กว่าสามไบต์เนื่องจาก inc / dec ของ rsi / rdi ดึงดูดส่วนนำหน้า (แต่ถ้าทราบว่าอยู่ภายในพื้นที่หน่วยความจำ 32- บิตดังนั้นพวกเขาจึงสามารถ esi / edi อีกครั้งเพื่อหลีกเลี่ยงการถูกลงโทษ) .


4

MATL , 18 16 ไบต์

"@gXH"HX@Jh)]0&h

อินพุตคืออาร์เรย์ของคำ ลองออนไลน์!

คำอธิบาย

"         % Implicit input: cell array of strings. For each cell
  @g      %   Push content of current cell, that is, a word
  XH      %   Copy into clipboard H
  "       %   For each letter
    H     %     Push word
    X@    %     Push iteration index
    Jh)   %     Index from that until the end into current word
  ]       %   End
  0       %   Push 0. Will be cast to char. Char(0) is displayed as space
  &h      %   Concatenate horizontally all elements so far. Implicit display


4

C ++ (เสียงดังกราว) , 174 ไบต์

#include<map>
#include<string.h>
std::string r(std::string w){while(auto x=strchr(w.c_str(),32))return r(w.substr(0,x-w.c_str()))+" "+r(x+1);return w!=""?w+r(w.substr(1)):w;}

ลองออนไลน์!

นี่เป็นการส่งครั้งแรกของฉันและฉันไม่รู้ว่าการส่งคืนสตริงแทนที่จะพิมพ์มันก็โอเค :)


2
ยินดีต้อนรับสู่ PPCG! ใช่การส่งคืนสตริงไม่เป็นไร หวังว่าคุณจะไปรอบ ๆ !
Jo King

คุณสามารถใช้สมมาตรผู้ประกอบการไม่เท่าเทียมกันที่จะเอาพื้นที่และทำให้ประหยัดไบต์ - สามารถreturn w!=""? return""!=w?
Jonathan Frech


3

ถ่าน 14 ไบต์

⪫E⪪S ⭆ι✂ιμLι¹ 

ลองออนไลน์! หมายเหตุ: พื้นที่ต่อท้าย การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

   S            Input string
  ⪪             Split on spaces
 E              Map over each word
      ι         Current word
     ⭆          Map over each character and join
        ι       Current word
         μ      Current index
           ι    Current word
          L     Length
            ¹   Literal 1
       ✂        Slice
⪫               Join with spaces
                Implicitly print


3

Pip -s 11 ไบต์

J_@>,#_Mq^s

ใช้รายการคำที่คั่นด้วยช่องว่างจาก stdin ลองออนไลน์!

คำอธิบาย

             s is space (implicit)
        q    Read a line of stdin
         ^s  Split it on spaces
       M     Map this lambda function to each word:
 _            The word...
  @>          sliced starting at index...
    ,#_       range(len(word))
              This creates len(word) slices ["word" "ord" "rd" "d"]
J             Join those into a single string
             The resulting list of modified words is printed; the -s flag uses space
             as the separator





3

K (oK) , 17 13 ไบต์

{,/|:'|,\|x}'

ลองออนไลน์!

ฟังก์ชั่นที่ไม่ระบุชื่อคำนำหน้า; อินพุตถูกใช้เป็นรายการของสตริงซึ่งจะเป็นรายการของอักขระ

ขอบคุณ @streetster เป็นเวลา 4 ไบต์

วิธี:

{,/|:'|,\|x}' //Main function, argument x → ("ill";"eel")
            ' // For each element of the argument
         |x}  // Flip it. x → ("lli";"lee")
       ,\     // Concatenate each element, keeping intermediates. x → (("l";"ll";"lli");("l";"le";"lee")
      |       // Flip it again. x → (("lli";"ll";"l");("lee";"le";"l"))
   |:'        // Now flip each element. x → (("ill";"ll";"l");("eel";"el";"l"))
{,/           // Concatenation scan. x → ("illlll";"eelell")

คุณสามารถกลับรายการนอกจากนี้ยังจะดูที่ฉันตกลงแก้ปัญหา
streetster

@streetster โอ้ดี ฉันยังอยู่ในขั้นตอนของการเรียนรู้ K ดังนั้นการแก้ปัญหาของฉันจะไม่สั้นหรือสวยงามเท่าที่ฉันต้องการ ขอบคุณสำหรับหัวขึ้น!
J. Sallé

แผ่ก่อนที่จะกลับจะทำให้คุณไม่ต้อง "ย้อนกลับ - ย้อนกลับ" ซึ่งจะลดลงเหลือ 10 ไบต์: {|,/,\|x}'
hoosierEE

3

Lisp ทั่วไป , 179 ไบต์

(defun r(s)(cond((endp s)nil)((eql(first s)#\Space)(princ " ")(r(rest s)))(t(q s)(r(rest s)))))(defun q (l)(cond((eql(first l)#\Space)t)((endp l)t)(t(princ(first l))(q(rest l)))))

ลองออนไลน์!

นี่เป็นครั้งแรกที่ฉันได้ลองเล่นกอล์ฟการแก้ไขใด ๆ ยินดีต้อนรับ


สวัสดีและยินดีต้อนรับสู่ PPCG การลบช่องว่างสามารถช่วยให้คุณประหยัด 29 ไบต์
Jonathan Frech

@Johnathan Frech ขอบคุณฉันเพิ่งปรับปรุงโดยไม่มีช่องว่าง
JRowan

ฉันคิดว่าคุณพลาดพื้นที่ฟุ่มเฟือยสี่แห่ง
Jonathan Frech

คุณมักจะสามารถใช้carแทนfirstและcdrแทนที่จะrestเล่นกอล์ฟที่คุณส่งมา
Jonathan Frech

เอาล่ะตอนนี้ฉันก็สบายดีฮ่าฮ่าบางทีฉันอาจจะกลับมายุ่งกับมันในภายหลัง ฉันแค่เรียนรู้เสียงกระเพื่อมตอนนี้ครูของฉันบอกว่าอย่าใช้รถยนต์และ cdr ดังนั้นพวกเขาจึงออกไปจากหัวของฉันในขณะที่ฉันกำลังทำมัน
JRowan

3

Lua , 70 ไบต์

for i=1,#arg do x=arg[i]for i=1,#x do io.write(x:sub(i))end print()end

ลองออนไลน์!

คำอธิบาย

อาร์กิวเมนต์ใน Lua ถูกเก็บไว้ในตารางargเริ่มต้นที่ดัชนี 1 ตัวดำเนินการ unary #ส่งคืนขนาดของตารางและฟังก์ชันs:sub(a,b)ส่งคืนซับสตริงตามสตริงที่sคั่นด้วยจำนวนเต็มaและbถ้าไม่ผ่าน b จะส่งคืนส่วนที่เหลือของสตริง

ฉันต้องใช้io.write()แทนprint()เพื่อหลีกเลี่ยงการแตกแถวและเพิ่มprint()ตอนท้ายด้วยเหตุผลตรงกันข้าม

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