Цифры на их дорожках


32

Входные данные:

Список целых чисел

Выход:

Поместите каждую цифру (и знак минус) на отдельной дорожке, в порядке -0123456789, игнорируя любые дублирующиеся цифры.

Пример:

Входные данные: [1,729,4728510,-3832,748129321,89842,-938744,0,11111]

Выход:

-0123456789  <- Added as clarification only, it's not part of the output

  1         
   2    7 9
 012 45 78 
-  23    8 
  1234  789
   2 4   89
-   34  789
 0         
  1        

Правила соревнований:

  • Любые повторяющиеся цифры в номере игнорируются.
  • Ввод / вывод может быть в любом разумном формате. Ввод может быть в виде списка / массива строк или символьного массива. Вывод может быть в виде списка строк, символов, символьной матрицы и т. Д.
  • Конечные пробелы не являются обязательными.
  • Любое количество ведущих или конечных новых строк не является обязательным (но не между строк).
  • Ввод всегда будет содержать хотя бы одно целое число
  • Вы должны поддерживать -2,147,483,648хотя бы целочисленный диапазон 2,147,483,647(32-битный).
  • Ввода-лист никогда не будет содержать -0, 00(или более двух нулей), или целые числа с ведущими нулями (то есть 012).
  • Если ваш язык использует другой символ для отрицательных чисел (например, заглавные ¯), вы также можете использовать его, если он соответствует.
  • Вам разрешено иметь разделитель пробелов между цифрами (поэтому - 0 1 2 3 4 6 7 9вместо 5 может быть строка без 5 или 8 -01234 67 9), если она согласована (и, следовательно, между -и должен быть пробел 0).

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.

Тестовые случаи:

Input: [1,729,4728510,-3832,748129321,89842,-938744,0,11111]
Output:
  1         
   2    7 9
 012 45 78 
-  23    8 
  1234  789
   2 4   89
-   34  789
 0         
  1        

Input: [4,534,4,4,53,26,71,835044,-3559534,-1027849356,-9,-99,-3459,-3459,-94593,-10234567859]
Output:
      4     
     345    
      4     
      4     
     3 5    
    2   6   
   1     7  
  0  345  8 
 -   345   9
 -0123456789
 -         9
 -         9
 -   345   9
 -   345   9
 -   345   9
 -0123456789

Input: [112,379,-3,409817,239087123,-96,0,895127308,-97140,923,-748]
Output:
  12       
   3    7 9
-  3       
 01 4   789
 0123   789
-      6  9
 0         
  123 5 789
-01  4  7 9
   23     9
-    4  78 

Input: [-15,-14,-13,-12,-11,10,-9,-8,-7,-5,-4,-3,-1,0,9,100,101,102,1103,104,105,106,116,-12345690]
Output:
- 1   5    
- 1  4     
- 1 3      
- 12       
- 1        
-01        
-         9
-        8 
-       7  
-     5    
-    4     
-   3      
- 1        
 0         
          9
 01        
 01        
 012       
 01 3      
 01  4     
 01   5    
 01    6   
  1    6   
-0123456  9

Input: [99,88,77,66,55,44,33,22,11,10,0,0,0,-941]
Output:
          9
         8 
        7  
       6   
      5    
     4     
    3      
   2       
  1        
 01        
 0         
 0         
 0         
- 1  4    9

Будут ли пробелы между цифрами в выходных данных?
Лохматый

Можем ли мы использовать верхний минус ¯вместо -?
Уриэль

Недостающие цифры по-прежнему будут заменены пробелами, поэтому в вашем примере будет 3 пробела между 4 и 6 и 7 и 9: "-0 1 2 3 4 <space> 6 7 <space> 9"(по некоторым причинам в комментариях сворачиваются несколько пробелов)
Shaggy

1
Я надеялся прокрасться мимо тебя! : D Хорошо заметили!
Лохматый

Ответы:


4

Stax , 8 байт

║V≡u╝─é╢

Запустите и отладьте его

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

Распакованный, распакованный и прокомментированный, вот как это выглядит.

m       for each line of input, execute the rest of the program and print the result
 zs     put an empty array under the line of input
 F      for each character code in the line of input, run the rest of the program
  Vd    "0123456789"
  I^    get the index of the character in this string and increment
  _&    assign this character to that index in the original string

Запустите этот


Как можно вводить список длины один? (Если это просто значение или значение и новая строка, это не работает.)
Джонатан Аллан

1
Ах, да, хорошая мысль. Альтернативная форма ввода, которая также работает для отдельных значений ["7"]. Этот формат также может обрабатывать несколько значений, таких как ["34", "43"].
рекурсивный

6

05AB1E , 13 байтов

Код:

v'-žh«DyмSð:,

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

Объяснение:

v               # For each element in the input..
 '-žh«          #   Push -0123456789
      D         #   Duplicate this string
       yм       #   String subtraction with the current element
                    e.g. "-0123456789" "456" м  →  "-0123789"
         Sð:    #   Replace all remaining elements with spaces
                    e.g. "-0123456789" "-0123789" Sð:  →  "     456   "
            ,   #   Pop and print with a newline

1
Ницца! Переход по маршруту замены был короче, чем вставка, которую я вижу :)
Emigna

2
@Emigna Вставка-маршрут также очень интересный подход. На самом деле, я думаю, вы можете сохранить 4 байта с помощью vðTúyvyÐd+ǝ},;).
Аднан

1
Brilliant! Я не знал, ǝбудет ли так работать -0. Но теперь, когда я понял это, на самом деле это число, а не строка, как я впервые прочитал: P
Emigna

Уууууу ... Я был на 23 байта. 05AB1E (игра за человечность).
Волшебный Осьминог Урна


4

JavaScript, 59 58 байт

Ввод и вывод в виде массива строк.

a=>a.map(x=>`-0123456789`.replace(eval(`/[^${x}]/g`),` `))

Попытайся

o.innerText=(g=s=>(f=
a=>a.map(x=>`-0123456789`.replace(eval(`/[^${x}]/g`),` `))
)(s.split`,`).join`\n`)(i.value="1,729,4728510,-3832,748129321,89842,-938744,0,11111");oninput=_=>o.innerText=g(i.value)
input{width:100%;}
<input id=i><pre id=o></pre>


оригинал

Принимает ввод как массив строк и выводит массив символьных массивов

a=>a.map(x=>[...`-0123456789`].map(y=>-~x.search(y)?y:` `))


1
такое элегантное решение, мне очень нравится.
Брайан Х.


3

05AB1E , 17 13 байт

Сохранено 4 байта благодаря Аднану

vðTúyvyÐd+ǝ},

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

объяснение

v               # loop over elements y in input
 ðTú            # push a space prepended by 10 spaces
    yv          # for each element y in the outer y
      y         # push y
       Ðd+      # push y+isdigit(y)
          ǝ     # insert y at this position in the space-string
           }    # end inner loop
            ,   # print

3

Рубин , 42 байта

Анонимная лямбда-обработка массива чисел:

->a{a.map{|n|"-0123456789".tr"^#{n}",?\s}}

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

Кроме того, полностью Perl-подобная полная программа намного короче. Я бы сказал, что -plпереключатели выглядят довольно забавно в этом контексте:

Рубин -pl , 29 байт

$_="-0123456789".tr"^#$_"," "

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

Наконец, возможно следующее, если для выходных строк допустимо заключать в кавычки:

Рубин -n , 27 байт

p"-0123456789".tr ?^+$_,?\s

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


3

JavaScript (Node.js) , 60 байт

  • Спасибо @Andrew Taylor за сокращение соединения (8 символов)
  • Спасибо @Yair Rand за X.match (8 символов)
a=>a.map(X=>"-0123456789".replace(/./g,x=>X.match(x)?x:" "))

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


О, этот joinтрюк прекрасен - но вопрос звучит так, как будто массив строк в порядке, поэтому, может быть, вы можете побрить 8 байтов, удалив его?
Эндрю Тейлор

Уверен, что вы можете сохранить другой, заменив (X+"").includes(x)наRegExp(x).test(X)
Эндрю Тейлор,

(X+"").match(x)будет еще короче. Вопрос также позволяет входным данным быть массивом строк, так что это может быть даже X.match(x).
Яир Ранд

2

Japt , 16 байт

Ввод и вывод в виде массива строк.

£Ao ¬i- ®iS gXøZ

Попытайся


объяснение

£                    :Map over each element X
 Ao                  :  Range [0,10)
    ¬                :  Join to a string
     i-              :  Prepend "-"
        ®            :  Map over each character Z
         iS          :    Prepend a space
            g        :    Get the character at index
             XøZ     :      X contains Z? (true=1, false=0)

2

Python 3 , 77 64 байта

-12 байт благодаря @Rod

lambda x:[[[" ",z][z in str(y)]for z in"-0123456789"]for y in x]

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

Моя первая правильная попытка игры в гольф на Python. Советы приветствуются!

Возвращает двумерный массив символов.


1
Вы можете использовать '-0123456789'вместо этого range(10)и поместите первый блок и подкачку str(z)с z, вы также можете переключиться на python2 и использовать `y`вместо str(y)( ``это + - эквивалент repr)
Rod

Лишнее пространство в in "-.
Джонатан Фрех


2

Haskell , 47 байтов

map(\s->do d<-"-0123456789";max" "[d|elem d s])

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

Используется maxдля вставки пробела, в котором отсутствует элемент, поскольку пробел меньше любой цифры или знака минус.

Если безбожное количество завершающих пробелов в порядке, можно сохранить два байта:

45 байт

map(\s->do d<-'-':['0'..];max" "[d|elem d s])

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


2

MATL , 13 байт

"45KY2ht@gm*c

Ввод - это массив ячеек строк. Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

         % Implicit input: cell array of strings, for example {'1','729',...,'11111'}
"        % For each cell
  45     %   Push 45 (ASCII code of '-')
  KY2    %   Push predefined literal '0123456789'
  h      %   Concatenate horizontally: gives '-0123456789'
  t      %   Duplicate
  @      %   Push current cell, for example {'729'}
  g      %   Convert cell to matrix. This effectively gives the cell's contents, '729'
  m      %   Ismember: gives an array of zeros and ones indicating membership of each
         %   char from '-0123456789' in '729'. The result in the example is
         %   [0 0 0 1 0 0 0 0 1 0 1]
  *      %   Multiply, element-wise. Chars are implicity converted to ASCII 
         %   Gives the array [0 0 0 50 0 0 0 0 55 0 57] 
  c      %   Convert ASCII codes to chars. 0 is displayed as space. Gives the string
         %   '   2    7 9'
         % Implicit end
         % Implicilly display each string on a different line

2

J , 32 27 байт

-5 байт благодаря FrownyFrog!

10|.":(10<."."0@[)}11$' '"0

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

Оригинальное решение:

J , 32 байта

(('_0123456789'i.[)}11$' '"0)@":

Объяснение:

@": преобразовать в символы и

}11$' '"0 изменить содержимое массива из 11 пробелов на эти символы

'_0123456789'i.[ в местах, обозначенных индексами символов в этом списке

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


1
10|.":(10<."."0@[)}11$' '"0
FrownyFrog

@FrownyFrog Отличное решение, спасибо!
Гален Иванов

2

Google Sheets , 124 байта

=Transpose(ArrayFormula(If(IsError(Find(Mid("-0123456789",Row($1:$11),1),Split(A1,",")))," ",Mid("-0123456789",Row($1:$11),1

Ввод - это разделенный запятыми список в ячейке A1. Выход находится в диапазоне, B1:L?где ?, однако, было введено много записей. (Вы можете разместить формулу где угодно, я просто выбрал B1для удобства.) Обратите внимание, что Sheets автоматически добавит четыре закрывающие скобки в конец формулы, сохранив нам эти четыре байта.

Скриншот

Еще один тест и другой тест

Объяснение:

  • Mid("-0123456789",Row($1:$11),1) выбирает каждого из 11 символов по очереди.
  • Find(Mid(~),Split(A1,","))ищет эти символы в каждом из элементов ввода. Это либо возвращает числовое значение, либо, если оно не найдено, ошибку.
  • If(IsError(Find(~)," ",Mid(~))вернет пробел, если персонаж не был найден, или символ, если он был. (Хотелось бы, чтобы был способ избежать дублирования Mid(~)части, но я не знаю ни одной.)
  • ArrayFormula(If(~))это то, что делает ссылки на несколько ячеек Mid(~)и Find(~)работают. Кроме того, формула в одной ячейке возвращает значения в нескольких ячейках.
  • Transpose(ArrayFormula(~)) транспонировать возвращенный массив, потому что он начинается сбоку.

2

Желе , 12 байт

ØD”-;¹⁶e?€Ʋ€

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

-2 благодаря Джонатану Аллану, который прочитал правило, которое я не сделал.

Обратите внимание, что формат ввода-вывода, используемый в ссылке TIO, не является фактическим, который вводится как список строковых представлений и выводится как список строк.


1

Perl 6 , 35 байт

{.map:{map {m/$^a/||' '},'-',|^10}}

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

Выходными данными является матрица символов, содержащая либо совпадения с регулярным выражением, либо пробелы.


Если «ввод может быть в любом приемлемом формате» может быть stdin, то, вероятно -pe, позволит вам обойтись без начального .map, фигурные скобки и своп $^aдля$_
Фил H

@PhilH -pи -nкак-то глючит , по крайней мере на TIO. Почему-то $_не передается в блоки. Смотрите пример 1 , пример 2 .
nwellnhof

1

Java 8, 53 байта

a->a.map(i->"-0123456789".replaceAll("[^"+i+"]"," "))

Мой собственный вызов легче, чем я думал, когда я это сделал ..

Вход и выход как в java.util.stream.Stream<String>.

Объяснение:

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

a->                              // Method with String-Stream as both input and return-type
  a.map(i->                      //  For every String in the input:
    "-0123456789"                //   Replace it with "-0123456789",
    .replaceAll("[^"+i+"]"," ")) //   with every character not in `i` replaced with a space


1

R , 96 75 байт

for(i in scan())cat(paste(gsub(paste0("[^",i,"]")," ","-0123456789"),"\n"))

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

Спасибо Кевину Круйссену за предложенный подход к регулярному выражению!

Принимает ввод из stdin как целые числа, разделенные пробелами, и печатает ascii-art в stdout.


Я не знаю R слишком хорошо, так что я уверен , что это может быть golfed дальше, но это другой подход 12 байт короче: function(N)for(i in N)cat(paste(gsub(paste("[^","]",sep=i)," ","-0123456789"),"\n")). (Введите как строковый массив вместо целочисленного массива.) Попробуйте онлайн.
Кевин Круйссен,

@KevinCruijssen ах, хорошо, да, я тоже могу сыграть в гольф.
Джузеппе

1

SOGL V0.12 , 14 13 байтов

{ø,{²²⁴WI1ž}P

Попробуй здесь!

Объяснение:

{ø,{²²⁴WI1ž}P

{            repeat input times
 ø,            push an empty string and the next input above that
   {       }   for each character in the input
    ²²           push "0123456789"
      ⁴          copy the character on top
       W         and get it's index in that string (1-indexed, 0 for the non-existent "-")
        I        increment that (SOGL is 1-indexed, so this is required)
         1ž      at coordinates (index; 1) in the string pushed earlier, insert that original copy of the character
            P  print the current line

1

SNOBOL4 (CSNOBOL4) , 85 байт

I	X =INPUT	:F(END)
	S ='-0123456789'
R	S NOTANY(X ' ') =' '	:S(R)
	OUTPUT =S	:(I)
END

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

I	X =INPUT	:F(END)		;* read input, if none, goto end
	S ='-0123456789'		;* set the string
R	S NOTANY(X ' ') =' '	:S(R)	;* replace characters of S not in X + space with space
	OUTPUT =S	:(I)		;* print S, goto I
END

1

Pyth, 14 байт

VQm*d}dNs+\-UT

Принимает ввод как список строк и выводит список строк для каждой строки.
Попробуй здесь

объяснение

VQm*d}dNs+\-UT
VQ                For each string in the input...
  m     s+\-UT    ... and each character in "-0123456789"...
     }dN          ... check if the character is in the string...
   *d             ... and get that character or an empty string.

1

Сетчатка , 26 байт

%"-0123456789"~`.+
[^$&]¶ 

Попробуйте онлайн! Примечание: конечный пробел. Объяснение: %выполняет свой дочерний этап ~один раз для каждой строки ввода. ~сначала выполняет свой дочерний этап, который переносит строку в [^и ]<CR><SP>, создавая программу, которая заменяет символы, не находящиеся в строке, пробелами. В "-0123456789"указывает , что ввод этой программы является данная строка ( $замены допустимы , но я их не нужно).


1

Perl 5 -n , 30 байт

Не сработало бы, если -бы могло появиться где-то еще, кроме первой позиции

#!/usr/bin/perl -n
say"-0123456789"=~s/[^$_]/ /gr

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


Не сработало бы, если -бы могло появиться где-то еще, кроме первой позиции если это может быть правдой, тогда вы не отвечаете на этот вызов, поскольку они больше не будут целыми числами. : P
Эрик Outgolfer


1

CJam , 20 байтов

qS%{'-10,+s_@-SerN}/

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

Принимает ввод как разделенный пробелами список целых чисел. Практически такой же подход, как и в ответе @adnans.



1

К4 , 30 27 байт

Решение:

{?[a in$x;a:"-",.Q.n;" "]}'

Пример:

q)k){?[a in$x;a:"-",.Q.n;" "]}'1 729 4728510 -3832 748129321 89842 -938744 0 11111
"  1        "
"   2    7 9"
" 012 45 78 "
"-  23    8 "
"  1234  789"
"   2 4   89"
"-   34  789"
" 0         "
"  1        "

Объяснение:

Вернуть "-0123 ..." или "" на основе ввода. Интерпретируется справа налево. Нет конкуренции за ответ APL :(

{?[a in$x;a:"-",.Q.n;" "]}' / the solution
{                        }' / lambda for each
 ?[      ;          ;   ]   / if[cond;true;false]
                .Q.n        / string "0123456789"
            "-",            / join with "-"
          a:                / save as a
       $x                   / convert input to string
   a in                     / return boolean list where each a in x
                     " "    / whitespace (return when false)

0

APL + WIN, 33 байта

Запрашивает ввод с экрана в виде строки

n←11⍴' '⋄n['-0123456789'⍳s]←s←⎕⋄n
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.