Разобрать Реву'а


16

На самом деле не вдохновлен ни Atbash Self Palindromes, ни обобщенным калькулятором гематрии .

Учитывая , строка ев длины п Вывести последовательность Revu'a , который является первым символом S , первые два символа S , ... первые п -2 символы с , первым п -1 символов с , вся с .

Строка будет состоять только из символов Unicode (любой кодировки), которые имеют сильную направленность и находятся в диапазоне от 0x0000 до 0xFFFF. Тем не менее, никаких символов управления направленностью не будет. Все символы в любой заданной строке будут иметь одинаковую направленность.

Вы можете вернуть в нотации массива ["t","te","tes","test"], в виде строки "t te tes test", разделенной пробелами , в виде многострочного текста
t
te
tes
test
, предварительно отформатированный массив

T
тэ
тес
тестовое задание
или что-нибудь подобное. Количество начальных, разделительных и конечных интервалов не имеет значения, равно как и конечный перевод строки. Спросите, если сомневаетесь.

Ввод справа налево должен приводить к выводу справа налево в правильном порядке:
Вход: "נחמן"
Выход: "נ נח נחמ נחמן"или

נ
נח
נחמ
נחמן
или ["נ","נח","נחמ","נחמן"]. Среди недействительных результатов "נחמן נחמ נח נ", "ן מן חמן נחמן"и "נחמן חמן מן ן".

Ответы:


17

Дьялог АПЛ, 2 байта

,\

Кумулятивное уменьшение по конкатенации. Попробуй это здесь .

Форматирование вывода лучше, когда вы префикс a , но он четко показывает правильный порядок без.


2
Точно такое же решение работает по той же причине в K.
JohnE

@JohnE K обрабатывает Unicode?
Адам

12

JavaScript (ES6), 27 26 25 байт

Сохранено один байт благодаря @nicael и @ MartinBüttner, одно благодаря @Neil

x=>x.replace(/.?/g,"$` ")

Использует некоторые встроенные функции функции JS .replace. В частности, при замене $`становится все , что предшествует сопоставляемому символу. Использование регулярного выражения, /.?/gа не /./gозначает, что оно также соответствует пустой строке в конце.


Я сохранил еще один байт: f=x=>x.replace(/.?/g,"$")`. Вы получаете дополнительный начальный пробел, но это разрешено.
Нил

@Neil Спасибо, я понятия не имел, что сработает!
ETHproductions

Тьфу, я забыл процитировать мои слова "правильно", но я вижу, ты понял, что я имел в виду.
Нил

6

Japt, 10 4 байта

Я не понимал, что кумулятивное снижение было бы так полезно в этом случае. :-)

UŒ+

Выводится как массив, по умолчанию разделенный запятыми. Если это не разрешено, используйте вместо этого 6-байтовый код:

U¬å+ ·

Попробуйте онлайн!

Как это устроено

      // Implicit: U = input string
U¬    // Split U into chars.
  å+  // Cumulative reduce: loop through each item in the array, concatenating it to the total.
      // ["t","e","s","t"] => ["t","te","tes","test"].
      // Implicit: output last expression

7
Использует фразу "Попробуйте онлайн!" и не ссылки на Попробуйте онлайн! морально приемлемо? : P
Мартин Эндер

3
@ MartinBüttner Я использовал эту фразу в ответах на Japt около месяца, прежде чем Деннис сделал ее торговой маркой. Я чувствую, что у меня должно быть какое-то моральное право продолжать его использовать: P
ETHproductions

6

Brainfuck, 40 байт

Моя консоль не поддерживает символы справа налево, но я не думаю, что она будет работать: c

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

Ungolfed:

++++++++++> # Store 10 (Newline)
,[>,]       # Store input
<[<]>       # Goto first character
[           # While next character
  [<+>-]    # Copy character to the left
  <[<]>     # Goto first character
  [.>]      # Print all charaters
  >         # Go to next character
]

13
Вы можете опубликовать их как отдельные ответы.
Никель

20
Вы должны опубликовать их как отдельные ответы.
Тимви

17
Вы должны опубликовать их как отдельные ответы.
Никель

21
Вы БУДЕТЕ размещать их как отдельные ответы.
Тимви

11
Вы убедили меня опубликовать их как отдельные ответы.
YoYoYonnY

5

Сетчатка, 11 7 байт

.
 $`$0

Вывод разделен пробелом, с начальным пробелом и завершающим переводом строки.

Попробуйте онлайн!


Для потомков он переносим в Perl еще на 5 байтов: perl -pE 's/./$$ & \ n / g'`. (Я опоздал на 11 месяцев, я знаю)
Дада

4

Python, 35

f=lambda s:f(s[:-1])+[s]if s else[]

Не удалось найти способ использования and/orдля упрощения рекурсии, потому что[] это ложь.

Рекурсивное решение, возвращает список строк.

Попробуйте онлайн


4

Пролог (SWI), 60 49 байтов

Код:

p(X):-findall(S,atom_prefix(X,S),[_|R]),write(R).

Разъяснение:

atom_prefix с X, установленным на input, и S в качестве переменной, дает 1 префикс атома X, начиная с пустого атома.

findall получает все решения и помещает их в список.

[_ | R] выбрасывает голову (пустой атом) и сохраняет хвост в R

Примеры:

p('נחמן').
[נ, נח, נחמ, נחמן]

p('test').
[t, te, tes, test]

Попробуйте онлайн здесь

Редактирование: сохранено 11 байт лишь хранить хвост R .



3

GNU Sed, 21

Оценка включает +1 для -Eопции для sed:

:
s/^(\S+)\S/\1 &/
t

Работает для LTR, но не для RTL - я пропустил этот бит. , На самом деле это делает работу, то RTL просто не правильно рендеринг в моем терминале. Он отлично работает при просмотре ввода-вывода в разумном текстовом редакторе (например, emacs). Это также работает в Ideone:

Попробуйте онлайн.


3

Брахилог , 5 байт (неконкурирующий)

@[@w\

Попробуйте онлайн!

объяснение

@[       Take a prefix of the input
  @w     Write this prefix to STDOUT followed by a linebreak
    \    False: try another prefix

Right-to-left strings seem to work properly, even though I never even considered them.


Why non-competing?
Adám

@Adám @[ and @w were implemented necessarily after April/May 2016. One could find the exact date on the Github commits but it surely isn't before this challenge was submitted.
Fatalize

2

CJam, 9 bytes

l{N2$@+}*

Output is linefeed-separated.

Test it here.

Explanation

l     e# Read input.
{     e# Fold this block over the input, which is effectively a foreach-loop which skips
      e# the first character...
  N   e#   Push a linefeed.
  2$  e#   Copy the previous string.
  @   e#   Pull up the current character.
  +   e#   Concatenate.
}*

I totally expected CJam to be shorter than that.
Timwi

@Timwi There is neither a "get all prefixes/suffixes" built-in nor a higher-order function for generalised accumulation, so even if this isn't optimal I doubt it can be beaten significantly.
Martin Ender

Ll{+_p}/; is same length, posting because I'm not sure if someone with more experience might be able to golf it more, and also maybe fix the quotes thing :P
FryAmTheEggman

2

JavaScript, 36 bytes

x=>[...x].map((c,i)=>x.slice(0,i+1))

Demo:

a=x=>[...x].map((c,i)=>x.slice(0,i+1));
document.write(
  a("test")+"<br>"+
  a("נחמן")
)

The principle is to map and output the slice of string from the first char to the every char in the word. Surprisingly, this works perfectly for the RTL strings too, no optimization needed.


2

My console doesn't support Right-to-Left characters, but I don't think it will work :c

C, 74 bytes (2nd entry)

char m[2<<9];i;main(){do{m[i]=getchar();printf("%s ",m);}while(m[i++]>0);}

Ungolfed:

#include <stdio.h>

// char, because `printf("%s", str);` expects a array of characters.
char str[2<<9];
int  str_len = 0;
int main(void) {
    do {
        str[str_len]=getchar();
        printf("%s ", str);
    } while(m[i++]>0);
    return 0;
}

2

My console doesn't support Right-to-Left characters, but I don't think it will work :c

C, 105 bytes (3th entry)

m[2<<9];i;j;k;main(){while((m[i++]=getchar())<0);for(;j<i;j++,putchar(10))for(k=0;k<j;k++)putchar(m[k]);}

Ungolfed:

#include <stdio.h>

int str[2<<9];
int str_len = 0;
int main(void) {
    do {
        str[str_len] = getchar();
    } while(str[str_len++] != EOF);
    int i;
    for(i=0; i<str_len; i++) {
        int j;
        for(j=0; j<i; j++) {
          putchar(str[j]);
        }
        putchar(10);
    }
}

2

TI-BASIC, 18 bytes

For(X,1,10^(9
Disp sub(Ans,1,X
End

Not technically valid: TI-BASIC doesn't support Unicode.

Name this prgmA, and input using Ans.

Program recursion would be shorter, but there would be no way to initialize the variables. Therefore, we display a substring of the input at each iteration. The input is never overwritten, since Disp doesn't return a value.

Eventually, the program terminates with an error after printing the whole string.



2

Java 7, 95 92 bytes

String d(String a){for(int i=a.length();i-->0;a=a.substring(0,i)+(i>0?"\n":"")+a);return a;}

Previous answer (95 bytes):

String c(String s){String r="";for(int i=0;++i<=s.length();r+=s.substring(0,i)+"\n");return r;}

I tried a recursive approach, but I couldn't really get it to work. Perhaps someone else will (shorter than this for-loop).

Ungolfed & test cases:

Try it here.

class M{
  static String d(String a){
    for(int i = a.length(); i-- > 0; a = a.substring(0, i) + (i > 0 ? "\n" : "") + a);
    return a;
  }

  public static void main(String[] a){
    System.out.println(c("test"));
    System.out.println();
    System.out.println(c("נחמן"));
  }
}

Output:

t
te
tes
test

נ
נח
נחמ
נחמן


1

MATL, 8 bytes

Uses current version (8.0.0) of language/compiler

jtn1X"YR

Example

>> matl
 > jtn1X"YR
 >
> test
t
te
tes
test

Explanation

j           % input string
tn          % duplicate and get length, say "N"
1X"         % repeat string N times vertically. Gives a char matrix
YR          % lower triangular part of matrix. Implicitly print


1

𝔼𝕊𝕄𝕚𝕟, 7 chars / 16 bytes

ᴉⓜᵖ ᵴ˖$

Try it here (Firefox only).

There's probably a builtin for this somewhere - I just haven't found it.

Explanation

ᴉⓜᵖ ᵴ˖$ // implicit: ᴉ=split input, ᵴ=empty string
ᴉⓜ      // map over ᴉ
   ᵖ ᵴ˖$ // push ᵴ+=(mapped item char)
         // implicit stack output, separated by newlines



1

Python, 32 bytes

f=lambda s:s and f(s[:-1])+" "+s

Recursive function that outputs a space-separated string with a leading space.

A 34-byte program (Python 2):

s=""
for c in input():s+=c;print s

1

V, 5 bytes (non-competing)

òÄ$xh

Try it online!

This language is newer than the challenge, making this answer non-competing. Explanation:

ò       " Recursively:
 Ä      "   Duplicate this line
  $     "   Move to the end of this line
   x    "   Delete one character
    h   "   Move one character to the right, which will throw an error when the line is one character long

1

PowerShell v2+, 28 bytes

[char[]]$args[0]|%{($o+=$_)}

Takes input $args[0], casts it as a char-array, pipes the characters into a loop |%{...}. Each iteration, we accumulate onto $o via += the current character $_. That expression is encapsulated in parens so a copy is placed on the pipeline. At end of execution, the pipeline is flushed via Write-Output which puts a newline between elements.

PS C:\Tools\Scripts\golfing> .\spell-out-the-revua "נחמן"
נ
נח
נחמ
נחמן

PS C:\Tools\Scripts\golfing> .\spell-out-the-revua "PPCG"
P
PP
PPC
PPCG


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.