Блог пользователя AlexBurkov

Автор AlexBurkov, 11 лет назад, По-русски

Доброго времени суток! Есть простая задача, по заданному числу N (1 <= N <= 26) вывести N строк в таком формате:

N = 3

a..a

a.ab

aabc

N = 5

a....a

a...ab

a..abc

a.abcd

aabcde

В задаче, вместо точек должны стоять пробелы) Просто так нагляднее)

Задача элементарная, но задание состоит в том, чтобы решить ее, использовав как можно меньше символов. На данный момент лучшее решение на С++ — 99 символов, на С — 81 символ. Если у кого-то есть идеи или реализации, буду рад услышать.

  • Проголосовать: нравится
  • +9
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А откуда задача?

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А эти лучшие решения — они твои? Или хотя бы одного и того же пользователя?

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    Нет, лучшие решения не мои, я их даже не видел, если честно) Да, одного и того же) Просто на С некоторые моменты можно сократить, поэтому получается меньше)

    • »
      »
      »
      11 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Ну просто я тут подумал — в Си можно выкинуть #include <cstdio>, но взамен необходимо прописать return 0;

      Получаем выигрыш в 8 символов. А тут отрыв аж в 18. Где ещё 10 символов сократить? Оо

      • »
        »
        »
        »
        11 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится -9 Проголосовать: не нравится

        Хм... в Си можно не писать ни return, ни cstdio Если ты говорил именно о Си)

        • »
          »
          »
          »
          »
          11 лет назад, # ^ |
            Проголосовать: нравится +12 Проголосовать: не нравится

          Ну, по крайней мере в GNU C на Codeforces если явно не прописать ретурн, оно может вернуть не 0 и это посчитается за ошибку исполнения.

          • »
            »
            »
            »
            »
            »
            11 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

            Вот решение Antonov на Си. 87 вроде бы символов. На КФ нормально работает)

            e[27],c=97,i;main(n){for(scanf("%d",&n),i=n;n--;printf("a%*s\n",i,e))strcat(e,&c),c++;}

            • »
              »
              »
              »
              »
              »
              »
              11 лет назад, # ^ |
                Проголосовать: нравится +5 Проголосовать: не нравится

              Ух ты. Выходит, там ещё и можно не указывать int при объявлении переменных Оо

              P.S. Если убрать printf, начинает выдавать RTE. Этому есть какое-то рациональное объяснение? Оо

              • »
                »
                »
                »
                »
                »
                »
                »
                11 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится

                Я не знаю, если честно)

              • »
                »
                »
                »
                »
                »
                »
                »
                11 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится

                Неправда, RE нет, просто программа не работает

                • »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  11 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится

                  RTE появится, если очистить, допустим, все тело main().

                • »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  11 лет назад, # ^ |
                    Проголосовать: нравится +5 Проголосовать: не нравится

                  ------------------------------------------------------------------------------------------------------- Действительно. А только что RE был Оо Магия.

                  А вот такое RE:


                  e[27],c=97,i;main(n){for(scanf("%d",&n),i=n;n--;)42;}
                • »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  11 лет назад, # ^ |
                    Проголосовать: нравится +8 Проголосовать: не нравится

                  Возможно, тут любой код может вызывать RE, как повезет. Поскольку return 0 явно не прописан, то адрес возврата берется с верхушки стека, а там прописан какой-то мусор — иногда 0, а иногда нет.

            • »
              »
              »
              »
              »
              »
              »
              11 лет назад, # ^ |
                Проголосовать: нравится +10 Проголосовать: не нравится

              Если вместо e[27] сделать e[9], то тоже работает http://ideone.com/xICsk9

              1 символ выиграл :D

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А зачем Вам подсказывать, если можно самим поучаствовать в соревновании и написать более короткий код?

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +15 Проголосовать: не нравится

    Ну, наверное, потому что это не соревнование, а просто с товарищами решили попробовать=) А так, как на это все же было потрачено время, стало интересно, какие еще способы могут быть)

»
11 лет назад, # |
  Проголосовать: нравится +18 Проголосовать: не нравится

80 символов (вероятно, можно укоротить)

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится +13 Проголосовать: не нравится

В коллекцию: в первой правке код на python 2 в 94 символа.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +22 Проголосовать: не нравится

    n=int(input()) => n=input()

  • »
    »
    11 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +13 Проголосовать: не нравится

    format можно заменить на %

    code

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    А переносы строк за символы не считаются?

  • »
    »
    11 лет назад, # ^ |
    Rev. 5   Проголосовать: нравится +10 Проголосовать: не нравится

    Лучше уж так http://ideone.com/WX9Kt7 64 символа

    UPD: стало 64 символа

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

        я не считал переносы, так что 64-1=63 или 65 с переносами

        • »
          »
          »
          »
          »
          11 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          тут не только переносы, но и отступы. Отступы — это принципиально важная часть. Более того, в некоторых случаях обязателен разделитель (н-р C-шное int i;) — если использовать \n вместо пробела — то это экономия символа, ведь "они не считаются".

          • »
            »
            »
            »
            »
            »
            11 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            При чем здесь отступы? Я их считал, если че. Но про переносы — согласен, надо считать.

            • »
              »
              »
              »
              »
              »
              »
              11 лет назад, # ^ |
              Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

              Тогда я не понял смысл вашего комментария.

              $ ls -alh
              -rw-r--r--  1 knst knst   60 янв 16 04:05 1.py
              -rw-r--r--  1 knst knst   64 янв 16 18:03 1-Baz93.py
              

              64 байта и 60 байт. 64 символа и 60 символов. 64 — 4 = 60. Всё правильно, что не так?

              p.s. я убрал именно отступы, поэтому на них акцентировал внимание. А переносы строк заменил на ";".

              • »
                »
                »
                »
                »
                »
                »
                »
                11 лет назад, # ^ |
                  Проголосовать: нравится +1 Проголосовать: не нравится

                Ой, кажется, я все-таки считал переносы. Да, все правильно

»
11 лет назад, # |
Rev. 8   Проголосовать: нравится +32 Проголосовать: не нравится

не знаток perl'a, 50 символов http://ideone.com/mcTl14

UPD: Стало 50 символов

»
11 лет назад, # |
  Проголосовать: нравится +35 Проголосовать: не нравится

(]('a',(' '#~-),a.{~97+[:i.])"0[:>:i.)

Это на J. 38 символов.

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Добавлю Scala. Ровно 100, если писать object A extends App{...

А на Java луче даже и не пробовать:)