Helloellolloloo Worldorldrldldd


50

Створіть програму, яка бере слово, яке ви вводите, і додає це слово на звороті за мінусом першої літери, а потім повторюється, поки всі літери не зникнуть. Наприклад, catстав би catattі helloстав helloellolloloo.

Введіть
будь-яку з 26 літер англійського алфавіту. Може бути кілька слів, розділених пробілами, і зміна має бути застосована до кожного слова.

Виведіть Введене
слово (слова), кожне слово, яке вводиться після себе, першою літерою пропущено, а потім другою літерою пропущено тощо, поки не буде більше літер для додавання.

Більше прикладів:

ill eel виходи illlll eelell

laser bat виходи laserasersererr batatt

darth vader виходи dartharthrththh vaderaderdererr

Це кодовий гольф, тому виграє найкоротший код.

Уточнення:
Ви можете розглядати вхідні чи вихідні дані як список. Можна розділити слова, використовуючи новий рядок, а не пробіл. Ви можете додати проміжний простір до вводу.


22
чесно кажучи, річ з декількома словами - це щось дратує. Все, що потрібно зробити - це вимагати розділення, застосувати функцію до кожного слова, а потім знову приєднатися. Це також дуже виснажливо для багатьох езоланг, яким доведеться перевірити пробіл вручну
Jo King

4
Чи можемо ми взяти введення як список слів і вихід як такий?
Квінтек

4
Які слова довжини вам потрібно обробити?
MickyT

5
Чи добре, щоб слова у розділі були відокремлені новим рядком (замість пробілу)?
JayCe

10
1.Будь ласка, оновіть специфікацію новими надбавками (введення / виведення масиву, пробіл простору тощо). 2.Будь ласка, повідомте про існуючі рішення, якщо хтось може зберегти байти, скориставшись ними.
Кудлатий

Відповіді:


34

Japt -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% більше компактним!
Кудлатий

1
Чи не £два байти в UTF-8?
Ві.

7
@Vi, я тут не використовую UTF-8.
Кудлатий

36

мозковий ебать , 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.
Фріріх Раабе

1
@FrerichRaabe: так, але для цього знадобиться import Data.List17 байт.
німі

18

Perl -p, 36 25 23 байти

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

Спробуйте в Інтернеті!

Це єдина регламентація. По-перше, він відповідає всім меж слів або символам, що не містять пробілів:

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

Зауважте, що кожну з цих відповідностей слід замінити рештою слова:

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

Ми можемо досягти цього за допомогою спеціальної змінної $', яка зберігає частину рядка після матчу. Однак нам потрібно застосувати до нього вкладений regsub s/ .*//, який видаляє все, що минуло перший пробіл $', щоб позбутися решти слів у введенні.

Завдяки @nwellnhof за 2 байти.


Ви можете замінити [^ ]на \S.
nwellnhof


17

Желе , 3 байти

ḊƬ€

Спробуйте в Інтернеті!

Більше не потрібно Ks, оскільки вхід / вихід масиву тепер дозволений.

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

Я думаю, що вам потрібно ḊƬẎ)(або ḊƬF), якщо ви хочете).
Ерік Аутгольфер

@EriktheOutgolfer Я так не думаю. Кожне слово представлено окремим масивом у висновку
dylnan

1
Я не впевнений, чи можете ви це стверджувати, оскільки масиви вкладені, і в питанні нічого не вказано, щоб це дозволити.
Ерік Аутгольфер

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"

ТІО


15

JavaScript (ES6), 33 байти

Збережено 1 байт завдяки @ShieruAsakoto

Формат вводу / виводу: масив слів.

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

Спробуйте в Інтернеті!


JavaScript (ES6), 35 байт

Формат вводу / виводу: масив слів.

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

Спробуйте в Інтернеті!


2
44:s=>s.replace(/\S+/g,g=s=>s&&s+g(s.slice(1)))
Шиеру Асакото

1
Дякую за моє "щось нове" на сьогодні; ніколи не знав про $'(або $<backtick>).
Кудлатий

13

R , 82 75 67 байт

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

Спробуйте в Інтернеті!

Деякі байти збереглися завдяки JayCe

Відокремлює виведення новими рядками.

sapply(...)Вираз генерує матрицю / вектор - стовпець відповідних подстрок, прокладки з по ""мірі необхідності. writeпотім друкує елементи матриці yза рядком, відокремлюючи їх "".


4
Гольф інший підхід, тримаючи сонну дитину; пізніше додамо пояснення.
Джузеппе

2
Якщо довжина слів обмежена, наприклад, 99 знаків або ~ 1e6, тоді ви можете збити купу байтів з ...substring,1:1e6,1e6)...подібними або подібними
MickyT

2
Якщо ви можете відокремити слова за новим рядком: tio . Я запитав це в коментарі. Можна працювати з коментарем @ MickyT
JayCe

@JayCe виглядає так, що це може бути 67 байт, перш ніж включити пропозицію MickyT
Джузеппе

8

мозковий ебать , 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 у мозку була використана для початкового космічного навантаження.


Здається, це не припиняється. Це призначено?
Джо Кінг

1
@JoKing Так. У деяких реалізаціях це перевищує межу стрічки, виходячи з помилки.
Джонатан Фрех

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 байт (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

Лушпиння , 6 4 байти

-2 байти завдяки Джонатану Аллану (беручи інформацію як список)!

moΣṫ

Спробуйте в Інтернеті!

Пояснення

Приймає введення як список рядків і відображає таку функцію:

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

Розділення та з'єднання, можливо, більше не потрібні, наразі така специфікація знаходиться у коментарі.
Джонатан Аллан

5

Сітківка 0,8,2 , 15 байт

 
¶
.
$&$%'
¶
 

Спробуйте в Інтернеті! Примітка: пробіли. Пояснення:

Розділіть на пробіли.

.
$&$%'

До кожного букви додайте його суфікс. Це %означає, що ми отримуємо лише суфікс слова.

Об’єднайтеся з пробілами.



5

16-бітний код складання x86, 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! Так, повернення рядка нормально. Сподіваюсь, ви тримаєтесь!
Джо Кінг

Ви можете використовувати симетрію нерівності оператора видалити простір і , таким чином , зберегти байти - return w!=""?може бути return""!=w?.
Джонатан Фрех


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

Піп -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 о, приємно. Я досі вивчаю К, тому мої рішення не будуть такими короткими або настільки витонченими, як я хотів би. Дякую за голову вгору!
J. Sallé

Зрівняти перед зворотним ходом можна опустити "зворотний кожний", збивши його до 10 байт: {|,/,\|x}'
hoosierEE

3

Лист звичайний , 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 байт .
Джонатан Фрех

@Johnathan Frech дякую, що я просто оновив без пробілів
JRowan

Я думаю, ти пропустив чотири зайвих місця.
Джонатан Фрех

Ви, швидше за все, також можете використовувати carзамість цього firstі cdrзамість того, restщоб подальше подати гольф.
Джонатан Фрех

Ні, я добре з цим зараз ха-ха, можливо, недобре повертаюся і псуюся з ним пізніше. Я просто вивчаю ліспи, тепер мій учитель сказав, що ніколи не користуватися автомобілем та
компакт-дисками,

3

Луа , 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. Онарний оператор #повертає розмір таблиці, а функція s:sub(a,b)повертає підрядку на основі рядка, sрозділеного цілими числами, aі b, якщо b не буде передано, він поверне решту рядка.

Довелося використовувати io.write()замість того, print()щоб уникнути розриву рядків, і додав print()наприкінці з протилежної причини.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.