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 Нет такой вещи. Вы не должны бить Пита с С (потому что вы никогда не собираетесь). Радость состоит в том, что вы побеждаете другие представления на том же языке или языках схожего многословия. Если бы уже было 50-байтовое представление C, я мог бы понять, что не отправляю сообщения (хотя даже тогда я мог бы опубликовать его, если подход другой и интересный). Но так как нет, пожалуйста, оставьте свой ответ. Вы довольно близки к JavaScript и Python, поэтому для C. это определенно не слишком долго
Мартин Эндер

Ответы:

8

Pyth, 10 байт

FNG<.<N4 2

Попробуйте онлайн: Pyth Compiler / Executor

(Первые 4 символа =G.Qчитают все данные и сохраняют их G)

объяснение

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements
Jakube
источник
4
красивая, я уже начинаю любить Пита
Хуан Кортес
3
@ JuanCortés: Это может быть хорошим ресурсом, если вы хотите начать с Pyth.
Алекс А.
7

Perl, 24

perl -pe's/(\d+,){4}|,\d+,\d+$//'

Пример:

perl -pe's/(\d+,){4}|,\d+,\d+$//' <in
103,2
106,1
67,2
4,20
nutki
источник
1
Это будет 20 байт в сетчатке . ;)
Мартин Эндер
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])
monguin
источник
8
Добро пожаловать в Программирование головоломок и Code Golf! Поскольку это соревнование по коду для игры в гольф , вы должны сделать свой код максимально коротким. Одна вещь, которую вы могли бы сделать, это уменьшить количество места, используемого для отступов; достаточно одного пробела в Python. Этот пост перечисляет советы по игре в гольф на Python и может быть хорошим справочным материалом.
Алекс А.
@ Алекс, спасибо - я пытался выяснить, каковы точные правила, я надеялся, что смогу игнорировать некоторые пробелы, но, думаю, нет.
Monguin
Нет, символы новой строки и пробелы влияют на количество ваших персонажей.
Алекс А.
На самом деле, в этом случае вам даже не нужен перевод строки и отступ. Операторы блока like forмогут находиться в одной строке в Python, если в теле нет другого оператора блока.
DLosc
3
Хорошее начало. Вы можете поставить все на той же линии , как forизбежать отступы. Условное [0,4][...] можно сократить до 4*(...) , используя тот факт, что bools равен 0/1. Кроме того, если вы пишете d[x:x+2]как d[x:][:2], хотя и на один символ длиннее, вы можете избежать сохранения выражения для xпеременной.
xnor
4

Sed, 32 байта

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

Это удаляет все до 4-й запятой, если она есть. Затем он удаляет все со 2-й запятой (которая ранее могла быть 6-й).

И мне даже удалось прямо-оправдать!

Тоби Спейт
источник
Есть ли шанс увидеть демо?
Хуан Кортес
Я не уверен, что вы хотите от демонстрации - я запустил ваш тестовый ввод и получил требуемый вывод.
Тоби Спейт
4

Javascript, 44 байта

Предполагая ввод в переменную G.

Редактировать: Я только что понял, это выглядит как решение Perl Nutki.

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>

nderscore
источник
4

Скала, 68 байт

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

- MrBones

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

RichieAHB
источник
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]], который автоматически печатается в конце программы. -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

* В настоящее время. Я могу изменить это поведение, но я все еще планирую иметь флаг, который делает то же самое.

DLosc
источник
1

Perl, 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]'
hmatt1
источник
1

Баш, 54

while IFS=, read {a..f};do echo ${e:-$a},${f:-$b};done
izabera
источник
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
}

Проверьте это здесь

Spikatrix
источник
0

Руби, 53

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

или это хорошо.

MegaTom
источник