Прикинь по диагонали!


30

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

Как построить диагональную ось?

  • Давайте рассмотрим пример с вводом 0, 5. Наша ось должна выглядеть так:

    0
     1
      2
       3
        4
         5
    
  • Тем не менее, наша ось должна выглядеть хорошо для чисел, которые также имеют больше цифр! Если вход является, например 0, 14, новая ось должна быть:

    0
     1
      2
       3
        4
         5
          6
           7
            8
             9
              10
                11
                  12
                    13
                      14
    
  • Идея состоит в том, что первая цифра следующего числа на оси всегда должна располагаться точно после последней цифры предыдущего числа. Чтобы понять идею еще лучше, вот еще один пример с 997, 1004:

    +997
       998
          999
             1000
                 1001
                     1002
                         1003
                             1004
    

правила

  • Вы можете предположить, что ввод находится в порядке возрастания или убывания (вы можете выбрать между 5,3и 3,5).

  • Вы также можете предположить, что разница между двумя целыми числами меньше 100.

  • У вас может быть начальный перевод строки или последовательный пробел (в каждой строке). Трейлинг-пробелы / переводы строк тоже хороши.

  • По умолчанию лазейки запрещены.

  • Вы можете принимать входные данные и предоставлять выходные данные любым стандартным способом .

  • Это , поэтому выигрывает самый короткий код в байтах на каждом языке!


Другие тестовые случаи

  • 1, 10:

    1
     2
      3
       4
        5
         6
          7
           8
            9
             10
    
  • 95, 103:

    95
      96
        97
          98
            99
              100
                 101
                    102
                       103
    
  • 999999, 1000009:

    999999
          1000000
                 1000001
                        1000002
                               1000003
                                      1000004
                                             1000005
                                                    1000006
                                                           1000007
                                                                  1000008
                                                                         1000009
    

Разрешены ли начальные пробелы, или первое число должно быть точно в левой части экрана?
Натан. Эйлиша Ширайни

@NathanShiraini Разрешены ведущие новые строки
г-н Xcoder


@StepHen Это немного сложнее, спасибо за ссылку.
г-н Xcoder

1
@Adnan В каждой строке может быть начальный символ новой строки или последовательный пробел.
г-н Xcoder

Ответы:


19

05AB1E , 8 7 6 байт

Спасибо Magic Octopus Urn за сохранение байта!

Это как-то работает, но, честно говоря, я понятия не имею, почему.

Код

Ÿvy.O=

Использует кодировку 05AB1E . Попробуйте онлайн!

объяснение

Ÿ          # Create the range [a, .., b] from the input array
 vy        # For each element
   .O      #   Push the connected overlapped version of that string using the
                 previous version of that string. The previous version initially
                 is the input repeated again. Somehow, when the input array is
                 repeated again, this command sees it as 1 character, which gives
                 the leading space before each line outputted. After the first
                 iteration, it reuses on what is left on the stack from the
                 previous iteration and basically attaches (or overlaps) itself 
                 onto the previous string, whereas the previous string is replaced 
                 by spaces and merged into the initial string. The previous string
                 is then discarded. We do not have to worry about numbers overlapping 
                 other numbers, since the incremented version of a number never
                 overlaps entirely on the previous number. An example of 123 and 456:

                 123
                    456

                 Which leaves us "   456" on the stack.
     =     #   Print with a newline without popping

.O = pop a,b push connected_overlap(b) (deprecated)- О, я думаю?
Волшебная урна осьминога

@MagicOctopusUrn Да, .Oон очень глючный и устарел уже больше года, поэтому я понятия не имею, что работает, а что нет. Я мог поклясться, что мне было нужно Î, но вдруг это уже не так (?). Благодарность! :)
Аднан

1
Кстати, это Îбыло необходимо, чтобы уменьшить максимальное количество ведущих пробелов до 1.
Аднан

Я ... Подожди ... Что, как ...?
Волшебная Осьминог Урна

1
@ Mr.Xcoder добавил
Аднан

14

Python 2 , 43 байта

lambda a,b:'\v'.join(map(str,range(a,b+1)))

Использует вертикальную вкладку для создания эффекта лестницы. Способ \vвизуализации зависит от консоли, поэтому он может работать не везде (например, TIO).
бегущий код


Можете ли вы использовать литерал \x0bв своем коде для сохранения байта?
Дом Гастингс

@DomHastings возможно, я не знаю как, хотя
Род

Я только что проверил, и это похоже на работу. Чтобы вставить символ в файл для тестирования, я использовал Sublime Text и выполнил поиск и замену в режиме регулярных выражений для \\vи заменил его на то, \x0Bчто вместо него отображается VTсимвол для оценки, вы можете опубликовать обратимую hexdump ( xxdили что-то еще) или просто заявить, что: « \vэто буквальная вертикальная вкладка», я думаю, что это будет справедливо. Надеюсь, это поможет!
Дом Гастингс

13

Древесный уголь , 9 8 байт

F…·NN⁺¶ι

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

Ссылка на подробную версию кода. Ввод в порядке возрастания.

  • 1 байт сохранен благодаря ASCII-только!

Хорошо, уголь выигрывает это снова!
Мистер Xcoder


РЕДАКТИРОВАТЬ: уголь стал outgolfed ... Wow
г-н Xcoder

2
@ Mr.Xcoder, по крайней мере, я знаю, как работает мой ответ. :-D
Чарли

7

R 70 69 61 байт

function(a,b)for(i in a:b){cat(rep('',F),i,'
');F=F+nchar(i)}

Функция, которая принимает переменные начала и конца в качестве аргументов. Зацикливает последовательность и печатает каждый элемент с добавлением достаточного количества пробелов. Fначинается как FALSE=0, и во время каждой итерации к ней добавляется количество символов для этого значения. Fопределяет количество напечатанных пробелов.

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

-8 байт благодаря @Giuseppe


Я вижу там 70 байт. Использование в scan()два раза может быть уменьшено до 67 байт for(i in scan():scan()){cat(rep(' ',F),i,'\n',sep='');F=F+nchar(i)}.
Джурио

К сожалению, вам нужно сбросить F, иначе функция может использоваться только один раз в новых сеансах. F=0;for(i in scan():scan()){cat(rep(' ',F),i,'\n',sep='');F=F+nchar(i)}(71 байт)
Джурио

@djhurio Внутри функции, в которой нет необходимости, поскольку F изменяется только в своем собственном пространстве имен. Также я считаю 69 байт, используя nchar.
JAD

1
Но замена \nна новую строку также работает, и это, очевидно, не стоит двух байт.
JAD

1
Хорошо, я подумал о злоупотреблении автоматическим интервалом cat, но по какой-то причине я не мог придумать и понять это.
JAD

6

C #, 90 89 85 байт

s=>e=>{var r="";for(int g=0;e>s;g+=(s+++"").Length)r+="".PadLeft(g)+s+"\n";return r;}

Сохранено 1 байт благодаря @LiefdeWen.
Сохранено 4 байта благодаря @auhmaan.

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

Полная / Отформатированная версия:

namespace System
{
    class P
    {
        static void Main()
        {
            Func<int, Func<int, string>> f = s => e =>
            {
                var r = "";
                for (int g = 0; e > s; g += (s++ + "").Length)
                    r += "".PadLeft(g) + s + "\n";

                return r;
            };

            Console.WriteLine(f(0)(5));
            Console.WriteLine(f(0)(14));
            Console.WriteLine(f(997)(1004));
            Console.WriteLine(f(1)(10));
            Console.WriteLine(f(95)(103));
            Console.WriteLine(f(999999)(1000009));

            Console.ReadLine();
        }
    }
}

1
+1, теперь у вас нет 5k точно; D
Мистер Xcoder

1 байт в i<=eкe>i
LiefdeWen

@LiefdeWen Спасибо :)
TheLethalCoder

Я полагаю, что вы можете сохранить больше 4 байтов, удалив iи повторно использовав sвместо этого
auhmaan

@auhmaan Спасибо, не знаю, почему я никогда не думаю об использовании входной переменной.
TheLethalCoder

6

Python 2 , 58 54 байта

def f(a,b,s=''):print s;b<a or f(a+1,b,' '*len(s)+`a`)

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


Ничего себе, удивительное рекурсивное решение и ответы большинства питонов вне игры в гольф, +1.
officialaimm

Очень хорошая работа, Рууд, ваше решение также не зависит от ОС и консоли, поскольку не использует символ вертикальной табуляции, как это сделал Род.
Рафаэль Кот

6

Mathematica, 59, байтов

Grid[(DiagonalMatrix@Range[1+##]/. 0->""+1)-1,Spacings->0]&

вход

[10,15]

-3 байта @JungHwanMin
проблема с 0 исправлена ​​(подробности см. В комментариях),
спасибо @ngenisis


1
Вау, ответ, который на самом деле содержит слово Diagonal
Mr. Xcoder,

Вам нужно добавить, Spacings -> 0если вы хотите, чтобы это было точно символьно.
Mr.Wizard

Ввод только неотрицательный, не гарантированно будет положительным.
user202729

Grid[(DiagonalMatrix@Range[1+##]/. 0->""+1)-1,Spacings->0]&это самый короткий путь, который я смог найти, чтобы решить эти проблемы
ngenisis


5

Mathematica, 48 байтов

Rotate[""<>Table[ToString@i<>" ",{i,##}],-Pi/4]&

так как есть так много ответов, я подумал, что этот должен быть включен

вход

[0,10]

выход
введите описание изображения здесь


1
Это не верно, не так ли? Но +1 только для того, чтобы взять титул буквально.
Захари

5

C 166 134 95 82 байта

Новый ответ

Просто как функция, а не как целая программа.

f(a,b){int s=0,i;while(a<=b){i=s;while(i--)printf(" ");s+=printf("%i\n",a++)-1;}}

Спасибо Фалькену за помощь в удалении 13 байт (и исправлении ошибки)!

Спасибо Стеф Хен за помощь в сбивании 12 байт!

Спасибо Zacharý за помощь сбить 1 байт!

Старые ответы

Избавился от int перед main и изменил const char * v [] на char ** v и избавился от return 0;

main(int c,char**v){int s=0;for(int a=atoi(v[1]);a<=atoi(v[2]);a++){for(int i=0;i<s;i++)printf(" ");printf("%i\n",a);s+=log10(a)+1;}}


int main(int c,const char*v[]){int s=0;for(int a=atoi(v[1]);a<=atoi(v[2]);a++){for(int i=0;i<s;i++)printf(" ");printf("%i\n",a);s+=log10(a)+1;}return 0;}

Это мой первый опыт игры в гольф, и я хотел попробовать что-то в C. Не уверен, правильно ли я отформатировал это, но я получал удовольствие, делая это!

int main(int c, const char * v[]) {
    int s = 0;
    for(int a=atoi(v[1]); a<=atoi(v[2]); a++) {
        for(int i=0; i<s; i++) printf(" ");
        printf("%i\n",a);
        s += log10(a)+1;
    }
    return 0;
}

объяснение

int s = 0; // Number of spaces for each line

for(int a=atoi(argv[1]); a<=atoi(argv[2]); a++) { // Loop thru numbers

for(int i=0; i<s; i++) printf(" "); // Add leading spaces

printf("%i\n",a); // Print number

s += log10(a)+1; // Update leading spaces

использование

введите описание изображения здесь


Добро пожаловать в PPCG! Я полагаю, вы можете переименовать argcи argvв одну букву переменные.
Стивен

Я думаю, что вы можете переместить int s=0цикл for, как в for(int s=0;a<=b;a++).
Захари

Ах, ты прав, спасибо, я обновил пост!
Asleepace

Использование int i=s;while(i--)вместо for(int i=0;i<s;i++)внутреннего цикла сэкономит два байта.
Фалькен,

1
Аааа, ваше право забыл про log10 на 0 и негативы, я обновил решение спасибо!
Asleepace

4

C ++, 167 165 байт

-2 байта благодаря Zacharý

#include<string>
#define S std::string
S d(int l,int h){S r;for(int m=0,i=l,j;i<=h;){for(j=0;j<m;++j)r+=32;S t=std::to_string(i++);r+=t;r+=10;m+=t.size();}return r;}

1. Не могли бы вы переместить в int m=0,i=l,jпервый forцикл, чтобы сохранить байт? 2. Можете ли вы перейти r+=t;r+=10на r+=t+10? 3. Я бью кого-то, ура.
Захари

@ Zacharý Я могу сделать, r+=t+=10но нет r+=t+10, это дало мне ошибку
HatsuPointerKun

А r+=t+=10работает ли? Разве это не повлияет t.size()?
Захари

@ Zacharý Да, это работает, только с +, он говорит, что не может найти перегрузку с параметром int в качестве параметра, но с + = он использует перегрузку с
символом

О, вы могли бы переместить ++iв std::to_string(i)качестве , std::to_string(i++)чтобы сохранить один байт?
Захари

4

APL (Dyalog) , 25 24 байта

-1 спасибо Захари .

Предполагается, что ⎕IO←0отсчет начинается с нуля. Принимает нижнюю границу в качестве левого аргумента и верхнюю границу в качестве правого аргумента.

{↑⍵↑⍨¨-+\≢¨⍵}(⍕¨⊣+∘⍳1--)

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

() Применить следующую неявную функцию между аргументами:

- вычтите верхнюю нижнюю из верхней границы

1- вычесть это из одного (то есть 1 + ∆)

⊣+∘⍳ левая нижняя граница плюс целые 0 через это

⍕¨ форматировать (stringify) каждый

{} Примените к нему следующую анонимность (обозначенную ⍵):

≢¨ длина каждого (число)

+\ накопленная сумма

- NEGATE

⍵↑⍨¨ для каждого строкового числа возьмите столько символов с конца (пробелы с пробелами)

 смешать список строк в символьную матрицу


Может +-⍨быть --?
Захари

@ Zacharý Да, конечно. Спасибо.
Адам

4

Сетчатка , 81 78 байт

.+
$*
+`\b(1+)¶11\1
$1¶1$&
1+
$.& $.&
 (.+)
$.1$* 
+1`( *)(.+?)( +)¶
$1$2¶$1$3

Попробуйте онлайн! Принимает ввод как разделенный новой строкой список из двух целых чисел. Редактировать: 3 байта были сохранены путем кражи кода расширения диапазона из моего ответа на вопрос : разделяем ли мы основной кластер? Объяснение:

.+
$*

Преобразовать оба входа в унарный.

+`\b(1+)¶11\1
$1¶1$&

Хотя последние два элемента (a, b) списка отличаются более чем на 1, замените их на (a, a + 1, b). Это расширяет список из кортежа в диапазон.

1+
$.& $.&

Конвертировать обратно в десятичный в дубликате.

 (.+)
$.1$* 

Преобразуйте дубликат копии в пробелы.

+1`( *)(.+?)( +)¶
$1$2¶$1$3

Суммируйте суммы пробелов от каждой строки до следующей.



3

LOGO , 53 байта

[for[i ? ?2][repeat ycor[type "\ ]pr :i fd count :i]]

Нет "Попробуй онлайн!" ссылка, потому что все онлайн переводчик LOGO не поддерживает список шаблонов.

Это список шаблонов (эквивалент лямбда-функции в других языках).

Использование:

apply [for[i ? ?2][repeat ycor[type "\ ]pr :i fd count :i]] [997 1004]

( applyвызывает функцию)

распечатает

997
   998
      999
         1000
             1001
                 1002
                     1003
                         1004

Заметка:

Здесь используется черепаха ycor(Y-координата) для хранения количества пробелов, необходимых для ввода, поэтому:

  • Черепаха должна быть переведена домой в положение по умолчанию и направление (вверх) перед каждым вызовом.
  • windowдолжен быть выполнен, если ycorстановится слишком большим, чтобы черепаха соскочила с экрана. Описание windowкоманды: в if the turtle is asked to move past the boundary of the graphics window, it will move off screen.отличие от настройки по умолчанию wrap, котораяif the turtle is asked to move past the boundary of the FMSLogo screen window, it will "wrap around" and reappear at the opposite edge of the window.

Объяснение:

for[i ? ?2]        Loop variable i in range [?, ?2], which is 2 input values
repeat ycor        That number of times
type "\            space character need to be escaped to be typed out.
pr :i              print the value of :i with a newline
fd count :i        increase turtle's y-coordinate by the length of the word :i. (Numbers in LOGO are stored as words)


3

JavaScript (ES8), 69 67 62 байта

Принимает ввод в виде целых чисел в порядке возрастания с использованием синтаксиса каррирования. Возвращает массив строк.

x=>y=>[...Array(++y-x)].map(_=>s="".padEnd(s.length)+x++,s="")

Попытайся

o.innerText=(f=

x=>y=>[...Array(++y-x)].map(_=>s="".padEnd(s.length)+x++,s="")

)(i.value=93)(j.value=105).join`\n`
oninput=_=>o.innerText=f(Math.min(i.value,j.value))(Math.max(i.value,j.value)).join`\n`
label,input{font-family:sans-serif}input{margin:0 5px 0 0;width:100px;}
<label for=i>x: </label><input id=i type=number><label for=j>y: </label><input id=j type=number><pre id=o>


3

Japt , 12 байт

òV
£¯Y ¬ç +X

Принимает ввод в любом порядке и всегда возвращает числа в порядке возрастания в виде массива строк.

Попробуйте онлайн!с -Rфлагом, чтобы присоединить массив с символами новой строки.

объяснение

Неявный ввод Uи V.

òV
£

Создать инклюзивный диапазон [U, V]и сопоставить каждое значение с ...

¯Y ¬ç

Значения перед current ( ¯Y), объединенные в string ( ¬) и заполненные пробелами ( ç).

+X

Плюс текущий номер. Результирующий массив неявно выводится.


3

Python 2 , 65 63 62 61 байт

-2 байта благодаря @Mr. Xcoder: execне нужны брекеты

-1 до свидания благодаря @ Zacharý: print s*' 'какprint' '*s

def f(m,n,s=0):exec(n-m+1)*"print' '*s+`m`;s+=len(`m`);m+=1;"

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


1
Вам не нужны брекеты для exec. m,n=input();s=0;exec(n-m+1)*"print s*' '+`m`;s+=len(`m`);m+=1;"достаточно.
г-н Xcoder

1
Я думаю , что вы можете изменить , print s*' 'чтобы print' '*sсохранить один байт.
Захари

2

JavaScript, 57 байт

f=(x,y,s='')=>y>=x?s+`
`+f(x+1,y,s.replace(/./g,' ')+x):s

55 байт: y=>g=(x,s='')=>y<x?s:s+'\n'+g(x+1,s.replace(/./g,' ')+x)Вызов с выделкой с целыми числами наоборот: f(103)(95).
Лохматый

54 байта: x=>y=>g=(s='')=>y<x?s:s+'\n'+g(s.replace(/./g,' ')+x++)вызов как f(x)(y)().
Лохматый

2

Python 2, 60 59 байт

-1 байт, спасибо Mr.Xcoder за определение моего s = 0 как необязательной переменной в моей функции.

def f(l,u,s=0):
 while l<=u:print' '*s+`l`;s+=len(`l`);l+=1

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

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

Я создал диапазон от нижней границы lдо верхней границы, uпечатая каждую строку с пробелом, умноженным на число s. Я увеличиваю множитель с длиной текущего числа.




Я выясню, что вы сделали с этим «exec» -версией позже в этот день. Может быть, это поможет мне в будущих кодировках. Спасибо
Саймон


2

Python 2, 78 77 79 байтов

def f(a,b):
 for i in range(a,b+1):print sum(len(`j`)for j in range(i))*' '+`i`

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

f(A, B) напечатает часть оси между A и B включительно.

Первый раз отвечаю на вызов!

Использует и использует обратные метки Python 2 для подсчета количества пробелов, которые он должен добавить перед числом.

-1 байт благодаря Mr.Xcoder

+2 потому что я забыл +1


4
Добро пожаловать в PPCG! хороший первый ответ. sum(len(`j`)) forможет стать sum(len(`j`)for, -1 байт
г-н Xcoder

1
Для того, чтобы сделать этот ответ действительно, необходимо заменить range(a,b)с range(a,b+1), потому что Python имеет пол инклюзивные диапазонов.
г-н Xcoder

Действительно, я пропустил это. Что более удивительно то , что я сделал добавить , что +1 , когда я сделал мои тесты! Неудивительно, что мне не хватило 2 байтов, когда я набрал его в TiO ...
Натан. Элиша Шираини

2

С (ССЗ) , 41 38 байт

-3 байта благодаря ASCII-только

t(x,v){while(x<=v)printf("%d\v",x++);}

Работает на RedHat6, доступ через PuTTY

доказательство

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


1
Это не дает правильного вывода.
Эрик Outgolfer

это сложно, вывести в файл, а затем использовать moreна этом файле
Джакомо Гарабелло

2
@GiacomoGarabello Вы должны предоставить полный код, чтобы мы могли запустить вашу программу. Если вы не предоставляете рабочую испытательную площадку / не предоставляете инструкций о том, как запустить вашу программу так, чтобы она выдает правильный вывод, удалите этот ответ.
Мистер Xcoder

Перевод строки может вернуться к началу строки, это зависит. Это работает, когда это не так.
user202729

@ Mr.Xcoder Отредактировано
Джакомо Гарабелло

2

V , 16 байтов

ÀñÙywÒ $pça/jd

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

Это было бы намного проще, если бы я мог взять start end - start но я думаю, что это слишком сильно меняет задачу.

Это принимает начальный номер в качестве ввода в буфере и конечный номер в качестве аргумента. Фактически он создает лестницу из startв, start + endа затем удаляет все после конечного числа.


2

MATL , 11 байт

vii&:"t~@Vh

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

объяснение

Это работает путем генерации строки для каждого числа и конкатенации ее с логически отрицательной копией предыдущей строки. Таким образом, char 0 добавляется 0 столько раз, сколько длина предыдущей строки. Char 0 отображается в виде пробела, а каждая строка отображается в отдельной строке

v       % Concatenate stack (which is empty): pushes []
ii      % Input two numbers
&:      % Range between the two numbers
"       % For each
  t     %   Duplicate
  ~     %   Logical negation. This gives a vector of zeros
  @     %   Push current number
  V     %   Convert to string
  h     %   Concatenate with the vector of zeros, which gets automatically 
        %   converted into chars.
        % End (implicit). Display stack (implicit), each string on a diferent
        % line, char 0 shown as space


2

Perl, 19 байт

Примечание: \x0bсчитается одним байтом.

Наряду с другими, я думал, что использование движений курсора будет кратчайшим путем, это означает, что он не работает на TIO:

print"$_\x0b"for<>..<>

использование

perl -e 'print"$_\x0b"for<>..<>' <<< '5
10'
5
 6
  7
   8
    9
     10

Хорошо, я давно не видел Perl. Не могли бы вы добавить ссылку для тестирования? Кроме того, мне было интересно, что 1..там происходит, так как вам дают два целых числа.
г-н Xcoder

@ Mr.Xcoder Да, 1..я не до конца читал спецификацию, теперь это исправлено! Что касается тестирования в Интернете, поскольку вывод содержит вертикальную вкладку, он не отображается должным образом. Попытка узнать, смогу ли я найти средство визуализации, которое поддерживает управляющие символы ... Если нет, то это может быть мой новый проект!
Дом Гастингс

2

Japt , 10 9 байт

òV åÈç +Y

Проверьте это онлайн! Возвращает массив строк; -RФлаг включен, чтобы присоединиться к новым строкам для удобства просмотра.

объяснение

 òV åÈ   ç +Y
UòV åXY{Xç +Y}   Ungolfed
                 Implicit: U, V = inputs, P = empty string
UòV              Create the range [U, U+1, ..., V-1, V].
    åXY{     }   Cumulative reduce: Map each previous result X and current item Y to:
        Xç         Fill X with spaces.
           +Y      Append Y.
                 Implicit: output result of last expression

Старая версия, 10 байт:

òV £P=ç +X

Проверьте это онлайн!

 òV £  P= ç +X
UòV mX{P=Pç +X}  Ungolfed
                 Implicit: U, V = inputs, P = empty string
UòV              Create the range [U, U+1, ..., V-1, V].
    mX{       }  Map each item X to:
         Pç        Fill P with spaces.
            +X     Append X.
       P=          Re-set P to the result.
                   Implicitly return the same.
                 Implicit: output result of last expression

Черт, я только что предложил то же решение, что и улучшение моего собственного ответа.
Джастин Маринер

2

D 133 127 126 125 121 119 байт

import std.conv,std.stdio;void f(T)(T a,T b,T s=0){for(T j;j++<s;)' '.write;a.writeln;if(a-b)f(a+1,b,s+a.text.length);}

Желе и APL были взяты.

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

Если вы согласны с результатами, зависящими от консоли (не соответствует тому же принципу, что и ответ Giacomos на C), вот один для 72 71 байта:

import std.stdio;void f(T)(T a,T b){while(a<=b){a++.write;'\v'.write;}}

Как? (Только D конкретные приемы)

  • f(T)(T a,T b,T s=0) Система шаблонов D может выводить типы
  • for(T j;j++<s;)Целые по умолчанию 0.
  • ' '.write;a.writelnD позволяет вам звонить fun(arg)как arg.fun(одна из немногих вещей в гольф D имеет)
  • a.text.lengthТо же, что и выше, и D также позволяет вам вызывать метод без параметров, как если бы это было свойство ( textэто преобразование в строку)
  • Одна вещь, которая может иметь отношение (хотя я не использовал это), новые строки могут быть в строках!

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