Детонація рядка


34

З огляду на будь-який рядок, надрукуйте його у вигляді трикутника, де текст іде вгору та вниз по кожній діагоналі. Наприклад, вхід "Hello World"має вивести:

                    d
                  l  
                r   d
              o   l  
            W   r   d
              o   l  
        o   W   r   d
      l       o   l  
    l   o   W   r   d
  e   l       o   l  
H   l   o   W   r   d
  e   l       o   l  
    l   o   W   r   d
      l       o   l  
        o   W   r   d
              o   l  
            W   r   d
              o   l  
                r   d
                  l  
                    d

Пробіл між кожним символом у рядку має бути не менше 1, щоб підтримувати належний формат.


1
Можемо припустити, що рядок не порожній?
Містер Xcoder

@ Mr.Xcoder Так, ви можете
machiavelli

1
Пробіл між кожним символом у рядку повинен бути не менше 1 : Чи означає це, що H l o W r dце дійсний центральний рядок? Запитання, тому що у вашому прикладі кожен рядок має 3 пробіли між кожним символом.
Emigna

1
@Emigna Я неправильно зрозумів ваше запитання, мої вибачення. Так, ваш приклад був би дійсним.
machiavelli

1
Дозволені провідні чи кінцеві місця?
Луїс Мендо

Відповіді:


19

Вугілля деревне , 10 7 байт

↗ELθ✂θιUE¹

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

    ↗       Print up and to the right
     ELθ✂θι All suffixes of the input, as a list down and to the right
    UE¹     Insert blank columns

Перший раз мені вдалося скористатися UEкомандою.


Я знав, що Вугілля буде однією з перших відповідей тут. Був майже спокусливим почати з себе, але я недосвідчений з ним, щоб вчасно добути рішення, і все одно вийде з гольфу ..;)
Кевін Cruijssen

6
@Emigna ... але це був мій великий шанс використати UE...
Ніл

6
@EriktheOutgolfer ... але це був мій великий шанс використати UE..
Ніл

1
@Neil Це -3 байти! -3 на гарну жертву! Хто не хоче приємних -3?
Erik the Outgolfer

4
@EriktheOutgolfer Що ти повинен сказати: "Ви не можете дозволити 05AB1E бити вас, чи не так?"
Ніл

12

05AB1E , 10 8 7 байт

Дякуємо Еміньї за збереження 2 байтів!

ðâƶ.cðζ

Використовує кодування 05AB1E . Спробуйте в Інтернеті!


Відповідно до цього рядка Пробіл між кожним символом у рядку має бути не менше 1, який ви можете видалити ¶«. (також перевірив дійсність з ОП)
Emigna

@Emigna Дякую! :)
Аднан

Можливо, хочете оновити посилання на Tio :)
Містер Xcoder

@ Mr.Xcoder ninja'd
Аднан

1
Clever використання âв ðâзамість Sð«!
Ерік Аутгольфер


8

C, 86 78 73 70 символів

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

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

Пояснення

Наївна реалізація: два цикли, заповнення зверху вниз, зліва направо (99 байт):

for(int j=1;j<n*2;j++){for(int i=0;i<n;i++)printf("%c ",(i+j)%2&&i+1>=abs(j-n)?s[i]:' ');puts("");}

Тут, put () просто друкує \ n до виводу. Комбінуємо декларації змінних і комбінуємо j ++ з чимось (94 байтами):

for(int i,j=0;++j<n*2;){for(i=0;i<n;i++)printf("%c ",(i+j)%2&&i>=abs(j-n)?s[i]:' ');puts("");}

Добре. Змінна j має діапазон 0 ... 2n; нехай це буде в межах -n ... n, це робить математику простішою. Зауважте, що булевий вираз праворуч від && завжди має значення 0 або 1. Це означає, що ми можемо замінити && на &. 91 байт:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)printf("%c ",~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

І тепер ми зрозуміли, що друкуємо додатковий простір. І так, нам не потрібен printf (), щоб надрукувати лише один символ. 86 байт:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)putchar(~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Навіть краще. Зауважте, що умова i * i> = j * j така ж, як i> = abs (j), але коротша. Перемістимо ставимо () в вираження збільшення циклу. І вгадайте, що? Насправді, нам не потрібні дужки навколо i + j. 78 байт:

for(int i,j=-n;++j<n;puts(""))for(i=0;i<n;i++)putchar(i*i>=j*j&~i+j?s[i]:' '); 

Чи знаєте ви, що putchar () повертає надрукований символ? Давайте використаємо XOR для тестування чисел на еквівалентність. Давайте замінимо пробіл його кодом ASCII, 32. Пам’ятайте, що код символу кінця рядка дорівнює 13. І нарешті: чи знали ви, що GCC / Clang підтримує https://en.wikipedia.org/wiki/Elvis_operator ? 73 байти:

for(int i,j=-n;++j<n;)for(i=0;putchar(i*i>=j*j&~i+j?s[i]?:13:32)^13;i++);

Нарешті, вгадайте, що? Нам не потрібно дві петлі. Ми можемо замінити потворні ~ i + j на просто ij. 70 байт:

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Майбутня робота: змінити напрямок циклу? Це може зберегти деякі байти, якщо це зроблено правильно.


5

SOGL V0.12 , 13 10 9 байт

ēI*@∑}¹╚H

Для цього використовується функція, яку я щойно додав , але була задокументована деякий час тому.

Спробуйте тут!
У це посилання ,додається, тому що це очікує введення в стек і {додається, тому що в іншому випадку ,буде виконуватися кожен раз у циклі

implicitly start loop over POP
ē            increase the variable E, on first push which will be 0
 I           increase by 1
  *          multiply the current character that many times
   @∑        join with spaces
     }     end loop
      ¹    wrap everything on stack in an array
       ╚   center vertically
        H  rotate counter-clockwise


3

Гайя , 16 байт

$:ċ⟪×$§×⟫†€|$¦tụ

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

Пояснення

$                 Split into list of chars
 :ċ               Push [1 .. len(input)]
   ⟪×$§×⟫†        Apply this block to corresponding elements of the two lists:
    ×              Repetition
     $             Split into chars
      §×           Join with spaces
          €|      Centre align the rows
            $¦    Split each line into chars
              t   Transpose
               ụ  Join each row with spaces, then join the rows together with newlines




3

Java, 292 байти (вибачте)

public class D{
public static void main(String[]r){
String s=r[0];int L=s.length(),n=L*2-1,x=L-1,d=-1,i,j;boolean a=false,o=L%2==1;
for(i=0;i<n;i++){
for(j=0;j<L;j++)System.out.print(j<x||a&&j%2==(o?0:1)||!a&&j%2==(o?1:0)?' ':s.charAt(j));
System.out.println();
x+=d;if(x<0){x=0;d=1;}a=!a;}}}

1
Ви можете видалити нові рядки, інакше це виглядає досить гольф!
Zacharý

1
Ви можете грати в гольф більше: 1 boolean a=1<0,o=L%2>0;. 2. Якщо вам не потрібно iвикористовувати цей цикл: for(i=0;i++<n;). 3. Можна позбутися o: j%2<L%2тоді j%2>L%2. 4. Використання dяк фліп займає стільки символів: просто роби j<(x<0?-x:x). 5. У вас набагато більше змінних, ніж потрібно. 6. Вам не потрібна повна програма: достатньо лямбда або методу. - Якщо ви хочете приклад Java для гольфу, перевірте мою відповідь .
Олів'є Грегоар


3

Java (OpenJDK 8) , 116 байт

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf("%"+l+"s%n",s.substring(i<0?-i:i).replaceAll("(.).","$1 "));}

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

Пояснення

s->{                                // Consumer<String> lambda
 for(int l=s.length(),i=-l;++i<l;)  // For each length between l and 1 and back to l, 
  System.out.printf("%"+l+"s%n",    // Print with align to right
    s.substring(i<0?-i:i)           // skip the first |i| characters
     .replaceAll("(.).","$1 ")      // replace every even-positioned character with a space.
   );
}


3

Haskell , 140 137 байт

(m#n)s=(\(i,x)->' ':(last$"  ":[x:" "|rem i 2==m&&i>n]))=<<zip[0..]s
g s=((++)=<<reverse.tail)$id=<<[[(0#n)s,(1#n)s]|n<-[-1,1..length s]]

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

Збережено 3 байти вдячніші для Challenger5

Я не думаю, що це оптимально ...

fвиробляє один з рядків ( m= 0 або 1 - модуль номера рядка, nце номер рядка)

g інтеркалює "непарні" та "парні" лінії і додає до результату дзеркало себе.


Ви можете зберегти байти, визначивши fфункцію інфікування (як in (m#n)s=...), а не функцію префікса.
Esolanging Fruit



2

Математика 105 байт

(c=Characters@#;l=Length@c;StringRiffle@Table[If[Abs[j-l]<i&&EvenQ[j+i],c[[i]]," "],{j,1,2l+1},{i,1,l}])&

Можливо, я міг би відколоти ще один байт або два, але кількість символів, накладних на розгляд рядків у Mathematica, робить такі прості виклики, як ця неконкурентна.


2

J, 54 байти

[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]

Спробуйте в Інтернеті! (зауважте, що на виході в TIO є новий рядок і три пробіли, але це не від виклику функції - це, мабуть, саме те, що J-інтерпретатор робить автоматично).

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

Попередні варіанти

55 байт

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]

56 байт

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]

Пояснення

Це розділиться на кілька функцій. Крім того, я не був настільки ретельним щодо останніх частин пояснення, тому повідомте мені, чи хочете ви краще пояснити певну частину, і я можу це відредагувати.

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup дублює кожен символ стільки разів, скільки його індекс (плюс один) у рядку
  • space вставляє пробіли між кожним символом
  • pad прокладки символів з потрібною кількістю пробілів
  • trans транспонує отриману матрицю

Приклад дзвінка:

   trans pad space dup 'abc'
  c
 b 
a c
 b 
  c

Дуп

>:@i.@# <@#"0 ]
>:@i.@#         Indices of each character plus one
      #          Length of the string
   i.            Range [0,length)
>:               Add one
        <@#"0 ] Duplicate each character as many times as it index (plus one)
           "0   For each
          #   ]  Copy the character
>:@i.@#           as many times as it index
        <        Box the result

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

Приклад дзвінка:

   dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘

Космос

(,' '&,)/&.>
         &.>  For each boxed element
(,' '&,)/      Insert spaces between each

Приклад дзвінка:

   space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘

Pad

|.@i.@# (>@],~' '#~[)"_1 ]
        (>@],~' '#~[)      Pad the right arg with spaces given by the left arg
|.@i.@#                    Indices in reverse order
   i. #                     Range [0,length)
|.                          Reverse

В основному, прокладіть перший елемент довжиною - 1 пробіл, другий довжиною - 2 і т. Д. Він також знімає бокс.

Приклад дзвінка:

   pad space dup 'abc'
  a  
 b b 
c c c

Перенести

Це лише вбудована функція, |:яка займає транспонування матриці.


1
Я використовував подібний підхід, але уникав боксу. 45 байт: |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#)). це, безумовно, можна було б продовжити гольф далі. ця частина -@i.@-@#є деяким низько висячим фруктом, швидше за все,
Йона

@Jonah Я не можу швидко розшифрувати, як працює ваша відповідь, тому я залишлю це вам, щоб опублікувати, якщо хочете, як я хотів би включити пояснення моєї відповіді. Я думаю, що J для мене зараз - мова лише для запису.
Коул

корисно для швидкого розшифрування:, f=. <some tacit expression>потім 5!:2 <'f'дає візуальну коробку та 5!:4 <'f'візуалізацію дерева. у моєму випадку $"0~1+i.@#спершу спробуйте запустити якусь рядок, потім запустити все праворуч |."0 1, потім зрозуміти, що |."0 1і все ліворуч, зберегти остаточне транспонування, просто виконуючи необхідні обертання.
Іона

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

2
Просто згадав складні аргументи допомоги #тут, 26 байт з|:@((-#)|."_1(1j1##)"0)~#\
миль


1

Perl 5 , 86 + 2 (-F) = 88 байт

Використовуйте пропозиції @ Dom та кілька моїх власних налаштувань, щоб зменшити кількість байтів.

for$k(0..$#F){$i=1;$a[$#F+$k]=$a[$#F-$k]=[map$i++<$k|($i+$k)%2?$":$_,@F]}say"@$_"for@a

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


Вибачте за це, радий, що ви отримали свою відповідь там, хоча! Я трохи розіграв, коли я намагався виправити своє і не зможу отримати рішення, ваш кращий підхід! Можна скинути пару байтів, використовуючи -aFдля того, щоб вставити всі літери @Fі пару маленьких перетворень ( -Fрахується як 3, оскільки для цього потрібно пробіл): Спробуйте в Інтернеті!
Дом Гастінгс

1
Чому -F вважається 3? Хіба це не повинно бути максимум 2? Чи не різниця між perl -e'code...'і perl -eF 'code...'. Також -aнепотрібно при використанні -F, щоб байт можна було скоротити.
Xcali

Саме так. Отже -F, приймаємо аргумент, але ми не хочемо передавати його ( -Fдозволяє контролювати те, що -aрозбивається, ні на який аргумент, розділити кожну таблицю самостійно), тож це різниця між perl -ae '...'і perl -aF -e '...'. За замовчуванням -aрозбивається /\s+/. Сподіваюся, що допоможе уточнити!
Дом Гастінгс

Також приємного використання $#F! Завжди забудь про це!
Дом Гастінгс

0

q / kdb +, 55 байт

Рішення:

-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x};

Приклад:

q)-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x}"Hello World";
          d
         l
        r d
       o l
      W r d
       o l
    o W r d
   l   o l
  l o W r d
 e l   o l
H l o W r d
 e l   o l
  l o W r d
   l   o l
    o W r d
       o l
      W r d
       o l
        r d
         l
          d

Пояснення:

ЗРОБИТИ. версія без гольфу - 66 байт:

-1 flip{{1_a,((2*y)#" ",z),a:x#" "}'[reverse c;1+c:til count x]x};

Бонус:

Щоб отримати такий же вихід, як приклад (74 байти):

q)-1(+){1_'raze{(a,((2*y)#" ",z),a:x#" ";(2*y+x)#" ")}'[(|)c;1+c:(!)(#)x]x}"Hello World";
                    d
                  l
                r   d
              o   l
            W   r   d
              o   l
        o   W   r   d
      l       o   l
    l   o   W   r   d
  e   l       o   l
H   l   o   W   r   d
  e   l       o   l
    l   o   W   r   d
      l       o   l
        o   W   r   d
              o   l
            W   r   d
              o   l
                r   d
                  l
                    d
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.