shell golf (посоревнуемся?)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: shell golf

Сообщение SLEDopit »

Что то и я стормозил
В седе -n и p все равно не используются. Итого - короче на 5 символов + убирание двоеточия в конце исправил -2, т.е. уже 62:

Код: Выделить всё

ls -lR|sed '/^.\//h;G;s/\n/ /;s_:$_/_'|awk '/^-/{print $9$8}'

t.t писал(а):
30.04.2010 21:00
А с пробелами?
Думаю пока, то что есть длинновато получается.
POSIX несовместимо, но вроде не очень длинно. Обошелся без ока. Правда шелла под рукой проверить нету.

Код: Выделить всё

ls -lR|sed -r '/^.\//h;G;s/\n/ /;s_:$_/_;/^-/!d;s_(.*\s+)7+(.*) (\./.*)_\3\2_'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

/dev/random писал(а):
30.04.2010 22:51
Кстати, я предполагал, что это не сохраняется в файл, а вводится в ком. строке, и никакие $0, естественно, невозможны.
Почему? Такого в условиях не было. Более того: это предположение косвенно опровергается обсуждением sha-bang в первых постах темы.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

И опять торможу: $i -- это ведь файл. Не надо никакого echo, достаточно ls.
-2
62, 74

Код: Выделить всё

ls -A "$1"|while read i;do i="$1/$i";[ -d "$i" ]&&. $0 "$i"||ls "$i";done


Код: Выделить всё

for i in `ls -A $1`;do i=$1/$i;[ -d $i ]&&. $0 $i||ls $i;done
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: shell golf

Сообщение SLEDopit »

/dev/random писал(а):
30.04.2010 18:30
если убрать ненужные пробелы, 62 символа.
SLEDopit писал(а):
30.04.2010 23:51
т.е. уже 62:
t.t писал(а):
01.05.2010 07:03
62
Вот и ищи теперь победителя:
Мало того, что все три предложенных варианта одинаковы по длине, так еще и попадают в разные категории (:

зы с пробелами:

Код: Выделить всё

ls -AR|sed -r '/^.\//h;G;s/\n/ /;/: /d;s_:$_/_;s_(.*) (\./.*)_\2\1_'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

SLEDopit писал(а):
01.05.2010 08:33
Вот и ищи теперь победителя:
Мало того, что все три предложенных варианта одинаковы по длине, так еще и попадают в разные категории (:
Будем считать, что это была разминка. (;

Кто придумает следующее задание?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

По решению /dev/random есть два замечания. С одной стороны, в нём есть ошибка, на которую я указал сразу: в опциях [ вместо -f должно быть ! -d. С другой -- он забыл при подсчёте убрать пробелы вокруг &&. Итого так на так. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

А я, оказывается, при подсчёте забыл убрать перевод строки.

Код: Выделить всё

$ echo -n 'for i in `ls -A $1`;do i=$1/$i;[ -d $i ]&&. $0 $i||ls $i;done' | wc -c
61
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

И последний аккорд: странно, что никто не догадался внести в решение от /dev/random моё последнее улучшение. Раз так, сделаю это сам:

Код: Выделить всё

$ echo -n 'shopt -s globstar;for i in **;do [ ! -d "$i" ]&&ls "$i";done' | wc -c
60


t.t писал(а):
01.05.2010 21:52
И последний аккорд: странно, что никто не догадался внести в решение от /dev/random моё последнее улучшение. Раз так, сделаю это сам:

Код: Выделить всё

$ echo -n 'shopt -s globstar;for i in **;do [ ! -d "$i" ]&&ls "$i";done' | wc -c
60
Не последний. Опять сразу не сообразил:

Код: Выделить всё

$ echo -n 'shopt -s globstar;for i in **;do [ -d "$i" ]||ls "$i";done' | wc -c
58
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: shell golf

Сообщение SLEDopit »

t.t писал(а):
01.05.2010 10:00
Кто придумает следующее задание?
Что, так никто ничего придумывать не хочет? (:
Давайте вот такую сделаем:
Определить есть ли повторяющаяся последовательность в строке и вывести ее:

Код: Выделить всё

'aaaaaa' -> 'a'
'ababab' -> 'ab'
'ababaa' -> 'ababaa'
мое решение - 85 символом вместе с ша-бангом. но мне пока не следует выкладывать, да?)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

SLEDopit писал(а):
04.05.2010 00:50
t.t писал(а):
01.05.2010 10:00
Кто придумает следующее задание?
Что, так никто ничего придумывать не хочет? (:
Давайте вот такую сделаем:
Определить есть ли повторяющаяся последовательность в строке и вывести ее:
Не совсем для shell задачка. Скорее для sed.

SLEDopit писал(а):
04.05.2010 00:50

Код: Выделить всё

'aaaaaa' -> 'a'
'ababab' -> 'ab'
'ababaa' -> 'ababaa'
Т.е. ищется последовательность только начинающаяся с первого символа? Иначе в последнем случае было бы 'baba'.

SLEDopit писал(а):
04.05.2010 00:50
мое решение - 85 символом вместе с ша-бангом. но мне пока не следует выкладывать, да?)
Это на Ваше усмотрение. Я своё решение не выкладывал сразу, т.к. понимал, что у той задачи есть много различных вариантов решения и не хотел сразу направлять ход событий в какое-то одно русло. Здесь, на мой взгляд, ситуация в этом смысле иная: кроме sed ничего в голову не приходит.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: shell golf

Сообщение SLEDopit »

t.t писал(а):
04.05.2010 08:55
Не совсем для shell задачка. Скорее для sed.
А я вот на чистом шелле решил:

Код: Выделить всё

#!/bin/bash
for N in `seq ${#1}`
do
D=${1:0:$N}
[ -z ${1//$D/} ]&&echo $D&&exit
done

t.t писал(а):
04.05.2010 08:55
Т.е. ищется последовательность только начинающаяся с первого символа?
Я думаю да. Хотя задача ненамного усложнится, если искать последовательность начиная с любого символа. Просто иначе начинают возникать всякие спорные ситуации:
'ababaa' -> 'ababaa' - последовательность ba [ в аbabаа ] или а [ в ababаа ] или аb [ в ababаа ].
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

А, так это вообще не то, что Вы сказали. Это не "есть ли повторяющаяся последовательность в строке", а "является ли вся строка последовательностью повторов". Т.е. значительно более простая задача. Я, правда, мог бы понять и сразу, т.к. иначе в Вашем последнем примере всё равно была бы повторяющаяся подстрока: ab (видать, тогда ещё не совсем проснулся).
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: shell golf

Сообщение SLEDopit »

Нда, немного некорректно выразился (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

Хотел было написать, что задача настолько простая, что улучшить уже не получится. Но один символ всё-таки смог убрать. (:

Код: Выделить всё

#!/bin/bash
for N in `seq ${#1}`
do
D=${1:0:$N}
[ -z ${1//$D} ]&&echo $D&&exit
done
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: shell golf

Сообщение Red User »

Ещё немного короче:

Код: Выделить всё

#!/bin/bash
for N in `seq ${#1}`
do
D=${1:0:$N}
[ ${1//$D} ]||break
done
echo $D

А лучше так:

Код: Выделить всё

#!/bin/bash
while D=${1::((++N))};[ ${1//$D} ]
do
:
done
echo $D

Во втором варианте, правда, могут быть проблемы, если N до выполнения скрипта чему-нибудь равно.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

Да, хорошие варианты. Всё время забываю, что -n для test можно не указывать.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: shell golf

Сообщение Red User »

Рекурсивный вариант:

Код: Выделить всё

#!/bin/bash
D=${1::((++N))}
[ ${1//$D} ]&&. $0 $1||echo $D
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: shell golf

Сообщение watashiwa_daredeska »

GNU sed:

Код: Выделить всё

#!/bin/sed -rnf
s/^(.*)\1+$/\1/p
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

watashiwa_daredeska писал(а):
08.05.2010 16:52
GNU sed:

Код: Выделить всё

#!/bin/sed -rnf
s/^(.*)\1+$/\1/p
Я и говорил, что это для sed, а не для shell задачка. (: Название темы как бы намекает, что решения на чистом sed скорее вне конкурса.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

watashiwa_daredeska писал(а):
08.05.2010 16:52
GNU sed:

Код: Выделить всё

#!/bin/sed -rnf
s/^(.*)\1+$/\1/p
Только у тебя ошибочка вышла. В варианрте автора вся строка тоже выводится как единичное "повторение". Так что на самом деле на два символа короче:

Код: Выделить всё

#!/bin/sed -rf
s/^(.*)\1+$/\1/
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: shell golf

Сообщение watashiwa_daredeska »

t.t писал(а):
08.05.2010 17:04
Я и говорил, что это для sed, а не для shell задачка.
А для shell — это на работу с ФС, процессами и т.п. На обработку текста почти всё — sed или awk.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: shell golf

Сообщение t.t »

watashiwa_daredeska писал(а):
08.05.2010 18:12
t.t писал(а):
08.05.2010 17:04
Я и говорил, что это для sed, а не для shell задачка.
А для shell — это на работу с ФС, процессами и т.п. На обработку текста почти всё — sed или awk.
Ну да. В отдельных случах shell с coreutils и/или grep будет проще лбибо эффективнее, но не часто.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: