CodeGolf на Nemerle
От: Маслаков Михаил Эстония www.ammyui.com
Дата: 28.03.11 12:01
Оценка:
В семье StackExchange появился сайт "Programming Puzzles & CodeGolf". Вкратце, задающий вопрос даёт всем небольшую задачу, которую отвечающие должны решить. Язык исполнения — любой, наименьшее количество символов побеждает.

Ради самообразования начал решать на Nemerle.
Задача

Решение сжатое (155 символов)
def f(l,r,n){if(n>2)f($"$l 1/$n",$"$(n-1)/$n $r",n-1)else if(n==2)l+" 1/2 "+r else l+" "+r}           
foreach(k in i)WriteLine($"F$k="+f("0/1","1/1",int.Parse(k)));


Решение развёрнутое
def f(l, r, n)
{
    if(n > 2)
        f($"$l 1/$n", $"$(n-1)/$n $r", n - 1)
    else if(n == 2) 
            l + " 1/2 " + r
         else 
            l + " " + r
}
        
foreach(k in i)
    WriteLine($"F$k=" + f("0/1", "1/1", int.Parse(k)));


За input беру
def i = ["4", "3", "1", "2", "0"];


1. Подскажите, где можно ещё "срезать" символов, не меняя алгоритма.
2. Решение на Немерле своим алгоритмом (большинство, кстати, решает через списки -> distinct -> sort, но у меня не получилось это коротко выразить на Немерле)

Кстати говоря, неплохой способ "раскрутить" Немерле
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re: CodeGolf на Nemerle
От: BogdanMart Украина  
Дата: 28.03.11 12:10
Оценка: 1 (1)
Здравствуйте, Маслаков Михаил, Вы писали:


ММ>Решение развёрнутое

ММ>
ММ>def f(l, r, n)
ММ>{
ММ>    if(n > 2)
ММ>        f($"$l 1/$n", $"$(n-1)/$n $r", n - 1)
ММ>    else if(n == 2) 
ММ>            l + " 1/2 " + r
ММ>         else 
ММ>            l + " " + r
ММ>}


ММ>1. Подскажите, где можно ещё "срезать" символов, не меняя алгоритма.


ММ>Кстати говоря, неплохой способ "раскрутить" Немерле


@if(n>2, f($"$l 1/$n", $"$(n-1)/$n $r", n - 1), @if(n==2, l + "1/2"+r, l + " " +r)


ЗЫ. Юзай подсветку немерлы а не шарпа
[Nemerle][/Nemerle]
Re[2]: CodeGolf на Nemerle
От: Маслаков Михаил Эстония www.ammyui.com
Дата: 28.03.11 13:05
Оценка:
Во, спасибо! Не знал про такой вариант макроса if.

На данном этапе получается 150 символов.
def f(l,r,n){@if(n>2,f($"$l 1/$n",$"$(n-1)/$n $r",n-1),@if(n==2,l+" 1/2 "+r,l+" "+r))}
foreach(k in i)WriteLine($"F$k="+f("0/1","1/1",int.Parse(k)));


Интересно было бы посмотреть решение аналогичное Ruby (94):
$_="F#$_ = {#{(1..$_.to_i).map{|d|(0..d).map{|n|n.quo d}}.flatten.uniq.sort*', '}}"


Скорее всего также коротко не получится, но всё же.

BM>ЗЫ. Юзай подсветку немерлы а не шарпа

BM>
BM>[Nemerle][/Nemerle]
BM>


Done!
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: CodeGolf на Nemerle
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 28.03.11 13:24
Оценка: 2 (1)
Здравствуйте, Маслаков Михаил, Вы писали:

ММ>Во, спасибо! Не знал про такой вариант макроса if.


ММ>На данном этапе получается 150 символов.

ММ>
ММ>def f(l,r,n){@if(n>2,f($"$l 1/$n",$"$(n-1)/$n $r",n-1),@if(n==2,l+" 1/2 "+r,l+" "+r))}
ММ>foreach(k in i)WriteLine($"F$k="+f("0/1","1/1",int.Parse(k)));
ММ>


140:
def f(l,r,n){@if(n>2,f($"$l 1/$n",$"$(n-1)/$n $r",n-1),l+ @if(n==2," 1/2 "," ")+r)}i.Iter(k=>WriteLine($"F$k="+f("0/1","1/1",int.Parse(k))))

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[3]: CodeGolf на Nemerle
От: _nn_ www.nemerleweb.com
Дата: 28.03.11 13:36
Оценка:
Здравствуйте, Маслаков Михаил, Вы писали:

ММ>Во, спасибо! Не знал про такой вариант макроса if.


ММ>На данном этапе получается 150 символов.

ММ>
ММ>def f(l,r,n){@if(n>2,f($"$l 1/$n",$"$(n-1)/$n $r",n-1),@if(n==2,l+" 1/2 "+r,l+" "+r))}
ММ>foreach(k in i)WriteLine($"F$k="+f("0/1","1/1",int.Parse(k)));
ММ>


ММ>Интересно было бы посмотреть решение аналогичное Ruby (94):

ММ>
ММ>$_="F#$_ = {#{(1..$_.to_i).map{|d|(0..d).map{|n|n.quo d}}.flatten.uniq.sort*', '}}"
ММ>


ММ>Скорее всего также коротко не получится, но всё же.


Можно попробовать перевести один в один:
// $_=
def f(x)
{
// "F#$_ =
  def p = $"F$x = ";

// {#{(1..$_.to_i).map
  def g = $[1..x-1].Map(d=>
  
//{|d|(0..d).map
    $[0..d-1].Map(
// {|n|n.quo d}}
      n => // что такое n.quo d ??
  ))
// .flatten.uniq.sort*', '}}"
  .. //
  .. // uniq в Nemerle как делается ? |> Set() или есть метод list[T].Unique ?
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: CodeGolf на Nemerle
От: Маслаков Михаил Эстония www.ammyui.com
Дата: 28.03.11 13:53
Оценка:
__>// {|n|n.quo d}}
__> n => // что такое n.quo d ??
__> ))

num.quo(numeric) → real
Returns most exact division (rational for integers, float for floats).
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[4]: CodeGolf на Nemerle
От: Маслаков Михаил Эстония www.ammyui.com
Дата: 28.03.11 14:04
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>140:
KV>
KV>def f(l,r,n){@if(n>2,f($"$l 1/$n",$"$(n-1)/$n $r",n-1),l+ @if(n==2," 1/2 "," ")+r)}i.Iter(k=>WriteLine($"F$k="+f("0/1","1/1",int.Parse(k))))
KV>


Спасибо за отличный вариант. Такое ощущение, что с этим алгоритмом уже больше не сократишь. Разве только вместо WriteLine использовать Write, а к "1/1" добавить \n.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: CodeGolf на Nemerle
От: _nn_ www.nemerleweb.com
Дата: 28.03.11 14:13
Оценка:
Здравствуйте, Маслаков Михаил, Вы писали:

ММ>Во, спасибо! Не знал про такой вариант макроса if.


ММ>На данном этапе получается 150 символов.

ММ>
ММ>def f(l,r,n){@if(n>2,f($"$l 1/$n",$"$(n-1)/$n $r",n-1),@if(n==2,l+" 1/2 "+r,l+" "+r))}
ММ>foreach(k in i)WriteLine($"F$k="+f("0/1","1/1",int.Parse(k)));
ММ>


ММ>Интересно было бы посмотреть решение аналогичное Ruby (94):

ММ>
ММ>$_="F#$_ = {#{(1..$_.to_i).map{|d|(0..d).map{|n|n.quo d}}.flatten.uniq.sort*', '}}"
ММ>


ММ>Скорее всего также коротко не получится, но всё же.


Я не совсем понимаю что этот код делает, но вот почти один в один на Nemerle:

using System.Console;
using Nemerle.Collections;

def f(x:double)
{
  def g = $[1.0 .. x - 1.0].Map(d => $[0.0 .. d - 1.0].Map(n => n/d)).Flatten().RemoveDuplicates();

  WriteLine($"F$x = ..$g");
}

f(4.0);


P.S.
Почему-то нет Sort без аргументов
Это какой-то недочет.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: CodeGolf на Nemerle
От: BogdanMart Украина  
Дата: 28.03.11 14:35
Оценка:
Здравствуйте, Маслаков Михаил, Вы писали:

ММ>Здравствуйте, kochetkov.vladimir, Вы писали:

KV>>140:
KV>>
KV>>def f(l,r,n){@if(n>2,f($"$l 1/$n",$"$(n-1)/$n $r",n-1),l+ @if(n==2," 1/2 "," ")+r)}i.Iter(k=>WriteLine($"F$k="+f("0/1","1/1",int.Parse(k))))
KV>>


ММ>Спасибо за отличный вариант. Такое ощущение, что с этим алгоритмом уже больше не сократишь. Разве только вместо WriteLine использовать Write, а к "1/1" добавить \n.

Отнють!

def f(n){@if(n>2,$"1/$n $(f(n-1))$(n-1)/$n ",@if(n==2,"1/2 ",""))}i.Iter(k=>WriteLine($"F$k=0/1 $(f(int.Parse(k)))1/1"))

121
Re[6]: CodeGolf на Nemerle
От: BogdanMart Украина  
Дата: 28.03.11 14:40
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>
def f(n){@if(n>2,$"1/$n $(f(n-1))$(n-1)/$n ",@if(n==2,"1/2 ",""))}i.Iter(k=>WriteLine($"F$k=0/1 $(f(int.Parse(k)))1/1"))

BM>121

Даже так
def f(n){|2=>"1/2 "|1|0=>""|_=> $"1/$n $(f(n-1))$(n-1)/$n "}i.Map(int.Parse).Iter(k=>WriteLine($"F$k=0/1 $(f(k))1/1"))

119


Настоящее байто @#%тво

з.ы. А почему исходный список строки а не инты(тогда парс не нужен)? (в оригинале вообще надо читать с консоли)
Re[7]: CodeGolf на Nemerle
От: BogdanMart Украина  
Дата: 28.03.11 14:42
Оценка:
Здравствуйте, BogdanMart, Вы писали:


BM>Даже так

BM>
def f(n){|2=>"1/2 "|1|0=>""|_=> $"1/$n $(f(n-1))$(n-1)/$n "}i.Map(int.Parse).Iter(k=>WriteLine($"F$k=0/1 $(f(k))1/1"))

BM>119

Провтыкал с Мар-ом .. экспериментировал. вот окончательный вариант:

def f(n){|2=>"1/2 "|1|0=>""|_=> $"1/$n $(f(n-1))$(n-1)/$n "}i.Iter(k=>WriteLine($"F$k=0/1 $(f(int.Parse(k)))1/1"))

115
Re[8]: CodeGolf на Nemerle
От: hardcase Пират http://nemerle.org
Дата: 28.03.11 14:57
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>
def f(n){|2=>"1/2 "|1|0=>""|_=> $"1/$n $(f(n-1))$(n-1)/$n "}i.Iter(k=>WriteLine($"F$k=0/1 $(f(int.Parse(k)))1/1"))

BM>115

1) считать нужно с using-ами.
2) гдето у Nemerle был макрос printf.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[9]: CodeGolf на Nemerle
От: BogdanMart Украина  
Дата: 28.03.11 14:59
Оценка:
Здравствуйте, hardcase, Вы писали:

H>1) считать нужно с using-ами.

H>2) гдето у Nemerle был макрос printf.

Причем тут мой вариант? в оригинальном так было
Re[9]: CodeGolf на Nemerle
От: _nn_ www.nemerleweb.com
Дата: 28.03.11 15:05
Оценка:
Здравствуйте, hardcase, Вы писали:

H>2) гдето у Nemerle был макрос printf.

using Nemerle.IO;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: CodeGolf на Nemerle
От: Маслаков Михаил Эстония www.ammyui.com
Дата: 28.03.11 15:07
Оценка:
BM>Провтыкал с Мар-ом .. экспериментировал. вот окончательный вариант:

BM>
def f(n){|2=>"1/2 "|1|0=>""|_=> $"1/$n $(f(n-1))$(n-1)/$n "}i.Iter(k=>WriteLine($"F$k=0/1 $(f(int.Parse(k)))1/1"))

BM>115

Есть идеи как коротко организовать последовательное чтение с консоли?
BTW, не хочешь опубликовать сам в качестве ответа там? Ты уже явно больше меня работы тут проделал, так что мне как-то неудобно будет от своего имени выкладывать
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[9]: CodeGolf на Nemerle
От: BogdanMart Украина  
Дата: 28.03.11 15:18
Оценка:
Здравствуйте, Маслаков Михаил, Вы писали:

ММ>Есть идеи как коротко организовать последовательное чтение с консоли?

Вот тут заминка (руби и питон со всеми инклудами и прочим фаршем там выложены)
ММ>BTW, не хочешь опубликовать сам в качестве ответа там? Ты уже явно больше меня работы тут проделал, так что мне как-то неудобно будет от своего имени выкладывать
Леньььь
Re[9]: CodeGolf на Nemerle
От: _nn_ www.nemerleweb.com
Дата: 28.03.11 15:33
Оценка:
Здравствуйте, Маслаков Михаил, Вы писали:

BM>>Провтыкал с Мар-ом .. экспериментировал. вот окончательный вариант:


BM>>
def f(n){|2=>"1/2 "|1|0=>""|_=> $"1/$n $(f(n-1))$(n-1)/$n "}i.Iter(k=>WriteLine($"F$k=0/1 $(f(int.Parse(k)))1/1"))

BM>>115

ММ>Есть идеи как коротко организовать последовательное чтение с консоли?

using System.Console;

def readInt() { int.Parse(ReadLine()) }

def l = $[readInt() | _ in [1..readInt()]];
def l2 = $[1..readInt()].Map(_ => readInt()); // Вариант №2

WriteLine($"..$l");
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[9]: CodeGolf на Nemerle
От: BogdanMart Украина  
Дата: 28.03.11 15:40
Оценка:
Здравствуйте, Маслаков Михаил, Вы писали:
ММ>Есть идеи как коротко организовать последовательное чтение с консоли?

def f(n){|2=>"1/2 "|1|0=>""|_=> $"1/$n $(f(n-1))$(n-1)/$n "}In.ReadToEnd().Split(array["\r\n"],1:>StringSplitOptions).Iter(k=>Write($"F$k=0/1 $(f(int.Parse(k)))1/1\n"))


но опять таки надо:

using Nemerle.Collections;
using Nemerle.Text;
using System;
using System.Console;

может лучше в цикле читать как предложил _nn_
Re[10]: CodeGolf на Nemerle
От: BogdanMart Украина  
Дата: 28.03.11 15:42
Оценка:
Здравствуйте, BogdanMart, Вы писали:

З.Ы. в консльке виндовой EOF -- вводиться комбинацией Ctrl+Z
Re: CodeGolf на Nemerle
От: akochnev Россия  
Дата: 28.03.11 16:42
Оценка:
Здравствуйте, Маслаков Михаил, Вы писали:

У Вас алгоритм неверный. Как, например, для F8 получить 3/8, если мы строим только 1/n и (n-1)/n.

ММ>В семье StackExchange появился сайт "Programming Puzzles & CodeGolf". Вкратце, задающий вопрос даёт всем небольшую задачу, которую отвечающие должны решить. Язык исполнения — любой, наименьшее количество символов побеждает.


ММ>Ради самообразования начал решать на Nemerle.

ММ>Задача

ММ>Решение сжатое (155 символов)

ММ>
ММ>def f(l,r,n){if(n>2)f($"$l 1/$n",$"$(n-1)/$n $r",n-1)else if(n==2)l+" 1/2 "+r else l+" "+r}           
ММ>foreach(k in i)WriteLine($"F$k="+f("0/1","1/1",int.Parse(k)));
ММ>


ММ>Решение развёрнутое

ММ>
ММ>def f(l, r, n)
ММ>{
ММ>    if(n > 2)
ММ>        f($"$l 1/$n", $"$(n-1)/$n $r", n - 1)
ММ>    else if(n == 2) 
ММ>            l + " 1/2 " + r
ММ>         else 
ММ>            l + " " + r
ММ>}
        
ММ>foreach(k in i)
ММ>    WriteLine($"F$k=" + f("0/1", "1/1", int.Parse(k)));
ММ>


ММ>За input беру

ММ>
ММ>def i = ["4", "3", "1", "2", "0"];
ММ>


ММ>1. Подскажите, где можно ещё "срезать" символов, не меняя алгоритма.

ММ>2. Решение на Немерле своим алгоритмом (большинство, кстати, решает через списки -> distinct -> sort, но у меня не получилось это коротко выразить на Немерле)

ММ>Кстати говоря, неплохой способ "раскрутить" Немерле
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.