CodeGolf - ігноруйте шум №1


15

Інструкції

Баррі - не настільки хороший розробник бекенда, який відповідає за невеликий API, який повинен дати вам інформацію про покупки, зроблені в магазині клієнта. Однак він не зробив великої роботи, і ваш начальник каже вам, щоб виправити це на стороні клієнта. В ідеалі ви повинні отримати значення , розділені комою , такі як , 927,2,45,90які відповідають що - щось подібне item_id, item_amount, unit_price,total

У цій першій головоломки ми дбаємо тільки про те item_idй , item_amountале нам потрібні інші поля в місці , щоб представити цю проблему. Баррі іноді отримує речі переплутали і повертає шумові як частина виробництва, він також отримує неправильний порядок, повернувшись noise, noise, unit_price, total, item_id, item_amount.

Ваше завдання

Вам потрібно зберігати в карті (або подібній структурі) пари пар item_idі item_amountнезалежно від того, повертає їх Баррі правильно чи ні, і друкувати кожен елемент у новому рядку з мінімально можливою кількістю символів. (Зберігання не є обов'язковим, ми просто дбаємо про вихід)

Зразок введення (змішаний правильний і брудний формати)

103,2,50,100
106,1,900,900
459,40,150,300,67,2
4,20,30,6000

Іншими словами, введенням буде a,b,x,xабо x,x,x,x,a,bте, де ми дбаємо про a& b. Вам потрібно надати код, припускаючи, що у нас є змінна, що називається G(або будь-яка інша назва) з усіма рядками csv.

Вибірка зразка

103,2
106,1
67,2 //This one was messy
4,20

Толерантність

Існує певна межа для толерантності, коли мова йде про відповідь. Відповіді у подібних форматах, але дотримуючись правильних значень, також будуть прийняті. Формати подобається [a,b], (a,b)або {a,b}є дійсними, але a,bнайбільш прийнятний.

Хоча перша головоломка мала змішане сприйняття через те, що її було легко та швидко вирішити, я також відчував, що деяким людям це теж подобається. Тому я зараз продовжую робити швидкі гольфи


Чи завжди введення буде формату x,x,x,xі x,x,x,x,x,xде xпозначає число?
Spikatrix

Так, введення буде слідувати одному з цих двох форматів, дозвольте мені уточнити
Хуан Кортес

Чи потрібно нам подати програму чи функцію чи щось інше? Крім того, звідки можна взяти всі матеріали?
Spikatrix

3
швидкий гольф - це по суті складність. Здається, що консенсус полягає в тому, що ми цього не хочемо , тому я зараз видаляю цей тег. Якщо ви хочете, щоб теги складності були повторно оцінені, будь ласка, створіть мета-повідомлення для цього. Але це було б масштабним зусиллям щодо переназначення, яке, на мою думку, повинно відбуватися скоординовано, а не окремі користувачі, що створюють для нього нові довільні теги.
Мартін Ендер

2
@CoolGuy Немає такого. Ви не повинні бити Pyth C (тому що ніколи не збираєтесь). Радість полягає в побитті інших подань тією ж мовою або мовами подібної багатослівності. Якби вже було 50 байт C подання, я міг би зрозуміти, що не публікувати (хоча навіть тоді, я можу опублікувати його, якщо підхід інший і цікавий). Але оскільки цього немає, будь ласка, опублікуйте свою відповідь. Ви досить близькі до JavaScript та Python, тому для C. це точно не надто довго
Мартін Ендер

Відповіді:


8

Pyth, 10 байт

FNG<.<N4 2

Спробуйте в Інтернеті: компілятор / виконавець Pyth

(Перші 4 символи =G.Qчитають усі дані і зберігають їх у G)

Пояснення

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements

4
прекрасно, мені вже починають подобатися Піти
Хуан Кортес

3
@ JuanCortés: Це може бути хорошим ресурсом, якщо ви хочете почати роботу з Pyth.
Олексій А.


7

Python 3, 123 76 72 62 байт

Я новачок, треба десь почати ...

 for l in G:
  d=l.rstrip().split(',');x=[0,4][len(d)>5];print(d[x:x+2])

З пропозиціями xnor та DLosc (62 байти):

for l in G:d=l.rstrip().split(',');print(d[4*(len(d)>5):][:2])

8
Ласкаво просимо до головоломки програмування та коду для гольфу! Оскільки це змагання з кодового гольфу , ви хочете зробити свій код якомога коротшим. Одне, що ви можете зробити, це зменшити кількість місця, яке використовується для відступів; в Python вистачає одного простору. У цьому дописі перераховані поради щодо гри в гольф на Python і, можливо, буде хорошим посиланням.
Олексій А.

@ Алекс, спасибі - я намагався розібратися, які саме правила, я сподівався, що можу проігнорувати деякий пробіл, але, мабуть, ні.
monguin

Ні, нові рядки та пробіли є факторами для вашого числа персонажів.
Олексій А.

Насправді в цьому випадку вам навіть не потрібні новий рядок та відступ. Блокування висловлювань на зразок forможе бути все в одному рядку в Python, доки в тілі немає іншого оператора блоку.
DLosc

3
Гарний старт. Ви можете розмістити все в одному рядку , forщоб уникнути відступів. Умовно [0,4][...] може бути скорочений до 4*(...) , використовуючи той факт , що Bools дорівнювати 0/1. Крім того, якщо ви пишете d[x:x+2]як d[x:][:2], хоч на один символ довше, ви можете уникати збереження виразу для xзмінної.
xnor

4

Сід, 32 байти

s/,/=/4
s/.*=//
s/,/:/2
s/:.*//

Це видаляє все до 4-ї коми, якщо є. Потім він видаляє все з 2-ї коми (яка, можливо, раніше була 6-ю).

І мені навіть вдалося правильно-виправдати!


Будь-який шанс побачити демонстрацію?
Хуан Кортес

Я не впевнений, що ви хочете від демонстрації - я запустив ваш тестовий вхід і отримав необхідний результат.
Toby Speight

4

Javascript, 44 байти

Припускаючи введення змінної G.

Редагувати: Я щойно зрозумів, що це дуже схоже на рішення нутків.

alert(G.replace(/(\d+,){4}|,\d+,\d+$/gm,''))

Демонстраційний фрагмент:

function run(){
    G = input.value;
    /* start solution */
    alert(G.replace(/(\d+,){4}|,\d+,\d+$/gm,''))
    /* end solution */
}
<textarea id="input" cols="25" rows="6">103,2,50,100
106,1,900,900
459,40,150,300,67,2
4,20,30,6000</textarea><br />
<button id="run" onclick="run();">Run</button>


4

Scala, 68 байт

G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))

- МістерБунс

Scala, 46 70 байт

Редагувати: роздрукувати результат

for{l<-G;r=l.split(",");x=(r++r).slice(4,6).mkString(",")}{println(x)}

Демо


1
На 1 байт менше, використовуючи натомість картуG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly

1
ще один байт врятували, відкинувши палітурку:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
Кальмар

3

CJam, 18 15 14 байт

r{',/4m<2<pr}h

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

r      e# Read a whitespace separated token from STDIN.
{      e# Do-while loop:
  ',/  e#    Split at commas.
  4m<  e#    Rotate the resulting array 4 units to the left.
  2<   e#    Discard everything but the first 2 elements.
  p    e#    Print the array.
  r    e#    Read a whitespace separated token from STDIN.
}h     e# If the token is a nonempty string, repeat the loop.

3

Оболонка POSIX, 30 байт

Припускаючи POSIX sedта cutприсутні:

sed 's/.*/&,&/'|cut -d, -f5,6

Дублює рядок, залишаючи дані, що цікавлять, готовими до отримання з полів 5 та 6.


3

Javascript, 117 112 99 95 84 76 71 байт

for(r of G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])

JS Fiddle


1
Будь ласка, опублікуйте загадку чи демонстрацію
Хуан Кортес

Ви можете видалити два б шляхом заміни ;з ,в тілі циклу і , отже , видалення дужок {і}
Хуан Кортеса

@ JuanCortés - спасибі, не знав цього. Яка теорія стоїть за цим?
RichieAHB

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

1
Використовуючи for ofви можете зберегти 3 байти. Він працює в будь-якому сучасному браузері. for(r of q=G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])
edc65

2

Піп , 12 + 1 = 13 байт

Використовує -lпрапор, який дає вихід у вигляді розділених пробілом списків чисел у кожному рядку. *

_@[4 5]Mg^',

Пояснення:

  • Список номерів очікується в g. Оскільки gзазвичай ініціалізується аргумент командного рядка, ви також можете поставити туди вхід для тих же результатів.
  • ^', розбиває (кожен рядок в) список на коми.
  • M відображає функцію для кожного елемента в результаті.
  • _@[4 5]визначає лямбда-функцію. Аргумент функції представлений символом _; @[4 5]повертає список 4-го та 5-го елементів. Якщо список містить шість елементів, це будуть останні два. Якщо його чотири, індекси обертаються, і тому результат - перші два. (Наприклад "abcd"@4 == "abcd"@0 == "a")
  • Тепер у нас є список таких списків, [[103 2] [106 1] [67 2]]який автоматично роздруковується в кінці програми. The-lПрапор приєднується кожен суб-лист на просторі , а потім все це на новому рядку, тому результат виглядає наступним чином :
C: \> pip.py -le "_ @ [4 5] Mg ^ '," 103,2,50,100 106,1 900,900 459,40,150,300,67,2
103 2
106 1
67 2

* На даний момент. Я можу змінити таку поведінку, але я все ще планую мати якийсь прапор, який робить те саме.


1

Перл, 37

@c=/(\d+,\d+)/g;$_=@c>2?$c[2]:$c[0]

35символи +2для -pта -l. Я не впевнений, чи є підхід в Perl, який би переміг рішення @ nutki , але я подумав, що все-таки опублікую цю ідею.

Виконати з:

cat input.txt | perl -ple'@c=/(\d+,\d+)/g;$_=@c>2?$c[2]:$c[0]'


0

C, 95 байт

f(a,b,c,d){scanf("%d,%d,%*d,%*d,%d,%d",&a,&b,&c,&d)>2?printf("%d,%d",c,d):printf("%d,%d",a,b);}

Код простий. Ось незворушний варіант:

f(a,b,c,d){                                    //Four int variables
    scanf("%d,%d,%*d,%*d,%d,%d",&a,&b,&c,&d)>2 //Scan input
        ?                                      //If scanf returned a value > 2
        printf("%d,%d",c,d)                    //Print last two values
        :                                      //else 
        printf("%d,%d",a,b);                   //Print first two values
}

Тестуйте це тут


0

Рубі, 53

G.each_line{|x|g=x.split',';p[g[4]||g[0],g[5]||g[1]]}

або це добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.