Цифри в їх смугах


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 ).
  • Якщо ви використовуєте інший символ для від'ємних чисел (наприклад, верхній ¯ ), вам також дозволяється використовувати це замість нього, доки це буде послідовно.
  • Вам дозволяється мати роздільник пробілу між цифрами (тому рядок без 5 або 8 може бути - 0 1 2 3 4 6 7 9замість -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

Стакса , 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
Блискуче! Я не знав, що ǝбуде функціонувати так -0. Але тепер, коли я знаю це, це насправді число, а не рядок, коли я вперше прочитав це як: P
Емінья,

Оооооо ... Я був на 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 Таблиці , 124 байти

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

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

Screenshot

Ще один тестовий випадок та ще один тестовий випадок

Пояснення:

  • 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для$_
Phil H

@PhilH -pі -nякось здається баггі, принаймні на TIO. Чомусь $_не передається блокам. Дивіться приклад 1 , приклад 2 .
nwellnhof

1

Java 8, 53 байти

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

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

Введення та вихід як a 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

Піт, 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
Ерік Аутгольфер




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.