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

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
Добро пожаловать в Программирование головоломок и 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>


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


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

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


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]'


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.