Эта строка квадрат?


44

Строка считается квадратной, если выполняются следующие условия:

  • Каждая строка имеет одинаковое количество символов
  • Количество символов в каждой строке равно количеству строк.

Ваша задача - написать программу или функцию, которая определяет, является ли данная входная строка квадратом.

Вы можете потребовать, чтобы ввод был ограничен вашим выбором LF, CR или CRLF.

Символы новой строки не считаются частью длины строки.

Вы можете потребовать, чтобы в вводе была или не была завершающая новая строка, которая не считается дополнительной строкой.

Ввод - это строка или одномерный массив символов; это не список строк.

Вы можете предположить, что ввод не является пустым и содержит только печатный ASCII, включая пробелы.

Вы должны вывести истинное значение для квадратных строк и ложное значение для других строк.

Правдивые тестовые случаи:

Foo
бар
Baz
,
.с.
.ss
.с.
(s представляет пространство)
сс
сс
(s представляет пространство)
ааааа
ааааа
ааааа
ааааа
ааааа

Ложные тесты:

..
,
,

,
....


....
4444
333
22
333
333
abc.def.ghi

Обратите внимание на дополнительные пустые строки в некоторых ложных случаях.

Это - побеждает меньше байтов!


Возможная копия языкового дизайна: 2-D Pattern Matching . Проблема № 5 такая же, как этот вопрос.
mbomb007

1
@ mbomb007 Я чувствую, что разные критерии выигрыша делают это не дубликатом? «Гольфность» была одним из критериев голосования, но я не думаю, что ответы на этот вопрос в значительной степени отразятся здесь.
FryAmTheEggman

2
@ mbomb007 Я голосую, чтобы оставить этот вопрос открытым, потому что, хотя он является подмножеством другого вопроса, другой вопрос ограничен языками, созданными специально для этого вопроса.
ETHпродукция

2
@ mbomb007: Это не дубликат, потому что этот вопрос просит вас разработать язык для ответа на вопрос, а не для ответа на существующем языке. Очень немногие ответы здесь были бы законными там.

1
@ mbomb007: Это не повод закрывать эту задачу и не давать людям нигде не публиковать свои ответы на уже существующих языках. Это может быть аргументом для закрытия другой проблемы (потому что это просто более ограничительная версия этой), хотя я бы посчитал это плохим аргументом и считаю, что оба должны быть оставлены открытыми.

Ответы:


19

Брахилог (2), 3 байта

ṇẹṁ

Попробуйте онлайн!

Полная программа. Выходы true.для правды, false.для фальси.

объяснение

ṇẹṁ
ṇ     Split {standard input} into lines
 ẹ    Split {each line} into basic elements {in this case, characters}
  ṁ   Assert that the result is square

Я немного скептически относился к полезности встроенной функции, когда она была добавлена, но я не могу отрицать, что она полезна здесь…

Брахилог (2), 7 байт

ṇẹ.\l~l

Попробуйте онлайн!

Не встроенное решение. По-прежнему бьет все остальные записи, на момент написания. РЕДАКТИРОВАТЬ: Не совсем, запись Jelly равной длины вошла, когда я писал это, и превосходит его через тай-брейк с отметкой времени.

объяснение

ṇẹ.\l~l
ṇ         Split {standard input} into lines
 ẹ        Split {each line} into basic elements {in this case, characters}
   \l     Assert that the result is rectangular, and the number of columns
  .  ~l     is equal to the number of rows

1
Правильный инструмент для работы!
Павел

10
= "Утверждаю, что результат квадратный" :(
Эрик Аутгольфер

5
Некоторое время назад была проблема, когда я изо всех сил пытался написать квадрат утверждения (это было что-то вроде .\l~lтого времени, за исключением того, что команда обратной косой черты, которая среди прочего утверждает, что ее ввод является прямоугольником , была сломана; обратите внимание, что даже если мы заменим на .\l~l, это по- прежнему самая короткая программа, подумайте об этом, я добавлю это в пост). Команда обратной косой черты была исправлена, но автор языка решил добавить квадрат подтверждения одновременно. Я думал, что "конечно, это никогда не придет снова". Видимо я был не прав.

2
@ Phoenix: номер версии языка, это не будет работать в Brachylog v1. Большинство людей просто говорят «Brachylog» (точно так же, как большинство людей говорят «Perl», а не «Perl 5»), но некоторое время назад я привык к этому, потому что я редко использую Brachylog v1.

2
@iFreilicht Это плохо, потому что до сих пор превосходит любой другой язык игры в гольф.
Эрик Outgolfer

21

Python 2 , 52 байта

x=input().split('\n')
print{len(x)}==set(map(len,x))

Попробуйте онлайн! или попробуйте все тестовые случаи


4
Мне нравится тот факт, что это и гольф, и читабельный.
jpmc26

Вам не нужно '\n', просто оставьте его пустым (поскольку на входе нет пробелов и табуляций).
12431234123412341234123

@ 12431234123412341234123 нет, он не работает для квадратных строк, содержащих пробелы !!!
г-н Xcoder

@ Mr.Xcoder Должен ли он работать с пробелами? Как я понял, на входе никогда не бывает пробелов.
12431234123412341234123

Вы неправильно поняли спецификации: вы можете предположить, что ввод не пустой и содержит только печатный ASCII. и пробел (``) для печати в формате ASCII
Mr. Xcoder

14

JavaScript (ES6), 46 45 байт

s=>!(s=s.split`
`).some(x=>x.length-s.length)

объяснение

  1. Разделить строку на массив в новых строках.
  2. Цикл по массиву.
  3. Вычтите длину массива из длины каждой строки.
  4. Если ненулевое (то есть истинное) значение возвращается для любой строки, строка не является квадратной.
  5. Отрицательный результат цикла, чтобы получить trueза квадрат, а falseза нет.

Попытайся

f=
s=>!(s=s.split`
`).some(x=>x.length-s.length)
oninput=_=>o.innerText=f(i.value)
o.innerText=f(i.value=`foo
bar
baz`)
<textarea id=i></textarea><pre id=o>


3
Я думаю, что вы можете сохранить байт сs=>!(s=s.split`\n`).some(x=>x.length-s.length)
ETHproductions

Спасибо, @ETHproductions. У меня ужасная привычка увольнять !someиз-под контроля, просто потому что это такая же длина как every.
Лохматый

9

05AB1E , 10 8 байт

¶¡€gDgQP

Попробуйте онлайн!

-2 спасибо Райли, это в основном его ответ ._.

Code       # Explanation                  | Truthy Example          | Falsy Example
-----------#------------------------------+-------------------------+--------------
¶¡         # Split on newlines            | [['aaa','aaa','aaa']]   | [['aa']]
  €g       # Get length of each           | [[3,3,3]]               | [[2]]
    D      # Dupe                         | [[3,3,3],[3,3,3]]       | [[2],[2]]
     g     # Get length                   | [[3,3,3],3]             | [[2],1]
      Q    # Check equality               | [[1,1,1]]               | [[0]]
       P   # Take product                 | 1                       | 0

@ Райли, аааа, хороший улов, моя оригинальная идея была больше похожа на то, что у тебя было, но немного отличалась. Итерировал еще два раза и не уловил мою математическую ошибку.
Волшебная урна осьминога

Я не думаю, что «Заголовок» является допустимой формой при вводе.
Павел

@ Феникс это лучше?
Волшебная урна осьминога

1
Вход также может быть взят с тремя кавычками, как это .
Аднан

1
Если вы получите длину каждого первого вы можете избежать s. Как это¶¡€gDgQP
Райли


9

Haskell, 38 34 байта

l=length
(all=<<(.l).(==).l).lines

Попробуйте онлайн!

Бессмысленная версия f s = all ((==length (lines s)).length) (lines s), т.е. разделить входные данные на строки и проверить, равна ли длина каждой строки количеству строк.

Редактировать: Спасибо @xnor за 4 байта.


1
Я думаю, что вы можете использовать allдля mapрезки and..
xnor

9

Желе , 7 байт

ỴµL;L€E

Попробуйте онлайн!

объяснение

Ỵµ       Split the input on newline and use as input in the second link     
  L      Get the number of list items
   ;     And append to that
    L€   A list with the legth of each list item
      E  Check to see if all items are equal.

1
Ваша ссылка TIO, кажется, указывает на то, что не должно быть завершающего символа новой строки.
Павел

@Phoenix исправлена ​​/ возвращена ...
Steenbergh

Это просто проверяет, все ли строки имеют одинаковую длину, и вообще не учитывает количество строк. Когда вы достигнете атома E, у вас появится список длин строк, и все.
разброс

@ Кристиан исправил и укоротил. Извините за путаницу, я думаю, что-то пошло не так после того, как у меня было рабочее решение, и я попытался
сыграть

9

Japt , 9 байт

=Ur.Q)¥Uy

Проверьте это онлайн!

объяснение

 =Ur.Q)¥ Uy
U=Ur.Q)==Uy
             // Implicit: U = input string, Q = quotation mark
U=    )      // Set U to
  Ur.Q       //   U with each non-newline (/./g) replaced with a quotation mark.
       ==Uy  // Return U == U transposed. U is padded to a rectangle with spaces before
             // transposing; if U was not a rectangle before, or the sides are not of
             // equal length, the result will not be the same as U.
             // Implicit: output result of last expression

Используя некоторые функции, реализованные вскоре после публикации этого вызова, это может быть 6 байтов:

r.Q
¥y

Проверьте это онлайн!

объяснение

       // Implicit: U = input string
r.Q    // Replace each non-newline (/./g) in U with a quotation mark.
       // Newline: set U to the result.
¥      // Return U ==
 y     //   U transposed.
       // Implicit: output result of last expression

Как в мире ты так быстро?
полностью человек

@totallyhuman Я случайно увидел вопрос в тот момент, когда он был опубликован, и мне потребовалось две минуты, чтобы придумать алгоритм. После этого это было просто внедрение и размещение. (Также у меня есть вещи, чтобы вернуться к ха-ха)
ETHproductions

Хорошо :) Я знал, что это yбыло решение, но мое входило еще на несколько байтов.
Лохматый

« Использование некоторых функций, реализованных вскоре после публикации этого вызова » - теперь вы можете опубликовать это как свой ответ.
Лохматый

7

Retina , 33 31 байт

.
.
^(.(.)*)(?<-2>¶\1)*$(?(2).)

Попробуйте онлайн! Объяснение: На первом этапе все печатаемые ASCII просто заменяются одним и тем же символом, чтобы упростить сопоставление. (Это может быть сделано без, но это кодовый гольф, а не кодовый вызов.) Второй этап затем соответствует по крайней мере одному символу в первой строке. Тем не менее, для каждого дополнительного символа в первой строке он затем может совпадать с новой строкой, за которой следует копия первой строки. Последняя часть выражения приводит к сбою сопоставления, если столбцов больше, чем строк.


К сожалению, это выводит истину для этого теста .
Kritixi Lithos

@KritixiLithos Я полагаю, что для представления требуется завершающий перевод новой строки, что разрешено.
Павел

Также я считаю, что использование \S\n;вместо первой строки экономит один байт
Kritixi Lithos

@KritixiLithos На самом деле замена .на .экономит два, но спасибо.
Нил

@Neil Это действительно умно!
Kritixi Lithos

6

Шелуха , 6 байт

S≡T'a¶

Принимает строку и печатает либо 1или 0. Попробуйте онлайн! Первая строка перебирает тестовые случаи; удалите его, если вы хотите проверить одно значение.

объяснение

Husk - это новый функциональный язык игры в гольф, созданный мной и Лео . В нем отсутствуют многие функции, и разработка продолжается. Его основной особенностью является система жестких типов, которая позволяет нам перегружать функции более высокого порядка.

На высоком уровне программа работает так:

S≡T'a¶  Define a function:
     ¶  split on newlines,
  T'a   transpose and pad to rectangle using character 'a',
 ≡      check if this has the same shape as
S       the split input.

Функция фактически проверяет, имеют ли два массива одинаковую форму и одинаковое распределение истинных элементов. В Husk все символы, кроме нулевого байта, являются правдивыми, и этого не произойдет в наших входных данных. Кроме того, Sэто S-комбинатор , функция, которая принимает в качестве входных данных две функции, здесь и T'a, и возвращает новую функцию, которая отображается xна ≡(x)(T'a x). Результат Sсостоит из , и эта функция применяется ко входу неявно.

Как Husk узнает, что она должна применяться Sк следующей функции, но должна быть составлена ​​с функцией слева? Просто: он просто пробует каждую интерпретацию и выбирает ту, в которой типы имеют смысл. Это объясняется более подробно в документации Husk .


5

Pure Bash (без коммунальных услуг), 55

mapfile -t a
for l in ${a[@]};{
((c+=${#l}^${#a[@]}))
}
  • mapfile читает ввод в массив a
  • затем число элементов массива XORed с каждой длиной строки и взятой суммой. Для идеального квадрата каждый результат XOR (и, следовательно, сумма) будет равен 0. Для всего остального результат будет> 0.

Противоположный смысл этого возвращается в виде кода возврата оболочки (исследуем с помощью echo $?) - идеальный квадрат равен 1, все остальное равно 0.

Попробуйте онлайн (правда) .

Попробуй онлайн (фальшивка) .


Предыдущий ответ с использованием eval-escape-extension hell, 78:

mapfile -t a
echo $[0$(eval eval echo +\\$\{#a[{0..$[${#a[@]}-1]}]}^${#a[@]})]

Попробуйте онлайн (правда) .

Попробуй онлайн (фальшивка) .


5

Perl 6 , 27 байт

{.lines==all .lines».comb}

Проверяет, равно ли количество строк во входной строке количеству символов в каждой строке.


это игнорирует символ новой строки?
Khaled.K

Да, переводы строк не возвращаются .linesметодом.
Шон

4

Pyth, 7 байт

CImL1.z

Попробуй здесь

Не требует завершающего перевода строки. Заменяет ввод двумерным массивом 1 с, где 1 представляет любой символ в исходном вводе. Затем мы проверяем, не изменился ли этот массив после транспонирования (заменив столбцы на строки). Только квадрат вернет истину в такой ситуации.


4

Java (OpenJDK 8) ,96 91 90 87 байт

-5 байт благодаря @KevinCruijssen
-1 байт благодаря @TheLethalCoder
-2 байт благодаря @ OlivierGrégoire

a->java.util.Arrays.stream(a.split("\n")).allMatch(x->x.length()==a.split("\n").length)

Попробуйте онлайн!


1
Вы можете удалить пробел в String[]sи вы можете удалить ,0в .split("\\n");for -3 байта. И точку с запятой / ;в самом конце вам не нужно считать, так что еще один -1. Ох, и вы должны включить java.util.перед Arraysбоюсь. Импорт / использование также являются частью подсчета байтов.
Кевин Круйссен

1
Так как вы забыли включить java.util., просто обычный цикл for вроде этого for(String x:s)if(x.length()!=s.length)return 0>1;return 1>0;короче return java.util.Arrays.stream(s).anyMatch(l->l.length()!=s.length);.
Кевин Круйссен

2
Разве это не просто \n?
TheLethalCoder

1
Повторение на a.split("\n")самом деле короче! a->java.util.Arrays.stream(a.split("\n")).allMatch(x->x.length()==a.split("\n").length)
Оливье Грегуар

2
Хммм ... еще есть и между lengи th(). По-видимому, они появляются сначала после 60-го символа, а затем каждые 20 символов.
Оливье Грегуар

3

05AB1E , 7 байтов

|€gDgQP

Попробуйте онлайн!


Вроде мошенничества с imo, это в основном nввод информации вместо 1 и почему мой оригинальный ответ не сработал.
Волшебная Урна Осьминога

@carusocomputing No, |означает «взять оставшуюся часть ввода и разделить ее на новые строки», которая никоим образом не принимает несколько входов. Вы просто должны рассматривать STDIN как один вход.
Эрик Outgolfer

3

R , 57 байт

function(s)all(nchar(n<-strsplit(s,'
')[[1]])==length(n))

Анонимная функция; Разбивает на новые строки, вычисляет длину каждой строки и проверяет, все ли они равны количеству строк.

Попробуйте онлайн!


3

MATL , 14 12 байт

10H&XXot&n=h

Входная строка определяется с помощью string concatenation ( [...]) и с точкой кода 10для представления LF. Например, ['aaa' 10 'bb']интерпретируется в MATL как строка, 'aaa'соединенная символом с точкой кода, соединенной 10со строкой 'bb'.

Выходными данными является непустой числовой вектор, который является правдивым тогда и только тогда, когда все его записи отличны от нуля.

Попробуйте онлайн!

объяснение

Рассмотрим ввод ['4444' 10 '333' 10 '22'].

10H   % Push 10 (code point of LF). Push 2
      % STACK: 10, 2
&XX   % Regexp with three arguments. First argument is implicit input (string);
      % second is 2, which indicates that we want to split the input; third is
      % 10, which is the character to split on. The result is a cell array of
      % matched strings
      % STACK: {'4444', '333', '22'}
o     % Concatenate into a numeric 2D array of code points, right-padding with
      % zeros if needed
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0]
t&n   % Duplicate. Push number of rows and number of columns
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0], 3, 4
=     % Are they equal?
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0], 0
h     % Concatenate into a row vector (in column-major order). Implicit display
      % STACK: [52 51 50 52 51 50 52 51 0 52 0 0 0]

3

R 35 байт

all(nchar(x<-scan(,""))==length(x))

Принимает ввод от стандартного ввода. Проверяет, что количество символов в каждой строке равно общему количеству строк. Возвращает TRUEили FALSEв зависимости от обстоятельств.


обратите внимание, что входные данные должны быть заключены в кавычки, иначе это может привести к пробелам в каждой строке.
Джузеппе





2

QBIC , 43 байта

{_?~_lA||h=h+1┘g=g+_lA|~g%_lA||_Xp]\_xg/h=h

Я доволен тем, как быстро дериватив QBasic может пройти этот вызов.

Объяснение:

{_?       DO infinitely: ask the user for input, store as A$
~    |    IF
 _lA|       The length of A$   (implicitly <> 0)
h=h+1     Add 1 to our line counter
┘         (syntactic linebreak)
g=g+_lA|  Add the length of this line to the running total of line lengths
~      |  IF
 g%_lA|     The length of the running total modulo the length of the last string
            yields anything but 0, there is a discrepancy between earlier line
            lengths and this one.
_Xp]      THEN QUIT, printing 0, end IF
\         ELSE (refers to the LEN(A$), user didn't input anything.
_xg/h=h   QUIT (the inf. loop) printing -1 if the root of the chars is the row count
            or 0 if not.

2

Pyth, 7 байт

qCC.z.z

демонстрация

Дважды транспонируйте ввод с усечением, затем проверьте, совпадает ли результат с оригиналом.


2

Рубин, 50 байтов

s=$<.read.split $/,-1;p [s.size]==s.map(&:size)|[]

Попробуйте онлайн!

объяснение

  1. Разделить ввод в массив на новой строке.
  2. Утверждают, что массив, содержащий только размер этого массива, равен массиву, содержащему все размеры uniq (set union with empty array) всех элементов этого массива.

1
Сохранить персонажа с .split($/,-1);->.split $/,-1;
Кристофер

Сохраните больше, используя linesвместо, readа затем split(но тогда вы должны добавить 1 к, sizeпотому что строки включают в себя завершающий
GB


1

Clojure, 58 байт

#(let[s(re-seq #"[^\n]+"%)c count](apply =(c s)(map c s)))

Требуется завершающий перевод строки, ожидающий увидеть что-то более волшебное.


1

APL (Dyalog) , 17 байт

Требуется ⎕ML←3по умолчанию во многих системах. Использует CR.

↓∘⎕FMT≡⎕TC[2]∘≠⊂⊢

Попробуйте онлайн!

↓∘⎕FMT [это] разделенным на-линии Р или т а т Ted-в-а-квадрат аргумент

 идентичный

⎕TC[2]∘≠ * в группы не-новой строки * -характеры

 разделенная

 аргумент?

* Второй элемент списка T erminal Си ontrol символов.


В версии 16.0 можно писать ↓∘⎕FMT≡⎕TC[3]∘≠⊆⊢с ⎕ML←1.


Любопытно, что ⎕ML?
Павел

1
@Phoenix В Dyalog АПЗ и АПЗ + М igration л Evel является грубой мерой диалектического движения в направлении APL2 IBM. Чем выше число, тем более APL2-подобным становится язык. Люди, мигрирующие из APL2 в другие APL, имеют тенденцию работать с высоким ⎕ML, в то время как люди, которые начали с других APL, имеют тенденцию работать с низким ⎕ML.
Адам

1

PowerShell, 64 байта

Тот же подход (разделение, длина строк, количество строк) подходит для ответов на другие языки, не относящиеся к гольфу, но нет эквивалента map (), так что это массив длин строк с количеством строк, помеченных в конце, затем этот массив сгруппированы. Квадраты выходят как, 3,3,3,3 -> 1 group, all line lengths and line count were equalа не квадраты выходят как 3,2,1 -> 3 groups, что-то было неравным на квадрате:

$f={@(@(($L="$args"-split"`n")|% le*)+$L.Count|group).Count-eq1}

Требуются новые строки в стиле Linux, без завершающей строки. например

$Ttests = @(@'
foo
bar
baz
'@,
'.',
@'
aaaaa
aaaaa
aaaaa
aaaaa
aaaaa
'@
)
$Ttests = $Ttests | foreach {$_ -replace "`r"}

$Ttests | % { & $f $_ }

(И вы можете сделать то же самое для ложных тестов, но я не буду помещать это здесь, поскольку их больше). Пара @символов необходима для того, чтобы, когда входные данные были единичными, в '.'противном случае разделение не создает массив из одной строки, а просто создает одну строку, а затем конкатенация массива не 1,1выводит свои выходные данные 2.

Я надеялся, что это может быть короче заменить все символы на «а», а затем перебором от 1 до «Длина ввода» для всех квадратов «а» и посмотреть, соответствует ли какой-либо из них ввод. Как только я прошел через param () и .Length, -join и -replace, он заканчивается намного дольше - 81 байт:

$f={param($s)!!(1..$s.Length|?{,('a'*$_)*$_-join"`n"-eq($s-replace"[^`n]",'a')})}

1

Грязь , 11 байт

e`.|_./+/.+

Принты 1для квадратов и 0не квадратов. Попробуйте онлайн!

объяснение

Подробное объяснение можно найти на странице учебника Grime , где в качестве примера приводится именно эта программа.

e`.|_./+/.+
e`            Match entire input against pattern:
  .           A single character
   |          OR
    _         a recursive match of this pattern
     ./+      with one column of characters on its right
        /     and below that
         .+   one row of characters.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.