Человек интереса


28

Задний план

Человек интереса - криминальная драма на CBS, и мое любимое телешоу, в последнее время.

Шоу рассказывает о человеке по имени Гарольд Финч, программист-миллиардер, и его партнере Джоне Ризе, ветеране спецназа и бывшем сотруднике ЦРУ. Этот программист создал разумный ИИ под названием «Машина», который предсказывает насильственные преступления до того, как они совершатся. Он отслеживает каждого человека на Земле в любое время, отслеживая и анализируя все камеры наблюдения и электронные коммуникации по всему миру.

Гарольд создал Машину для правительства Соединенных Штатов, чтобы обнаружить террористическую деятельность до факта. Он делит преступления, которые он предсказывает, на списки, основываясь на том, имеют ли они отношение к национальной безопасности или нет. Соответствующие случаи обрабатываются правительством, в то время как «неактуальный» список запрограммирован на ежедневное удаление.

Гарольд сделал небольшой черный ход для себя, надеясь разобраться с «неактуальным» списком сам. Этот черный ход заставляет The Machine звонить в таксофон ближайшего Гарольда (раз в день или около того) и читать ему номер социального страхования. Этот SSN принадлежит кому-то, чья жизнь находится в опасности как часть преднамеренного преступления, или кому-то, кто планирует такое преступление.


Соревнование

Напишите программу, которая не требует ввода и выводит 30 случайных телефонных номеров и номеров SSN (см. Ниже).


Выход

Есть две строки текста, которые будут печататься каждый "день".

  1. Crime predicted: 555-55-5555
  2. Calling: 1-555-555-5555 с последующим переводом строки

Этот процесс должен повторяться в течение одного «месяца» (30 «дней»).


Телефонные номера

Каждый номер телефона должен иметь следующие элементы:

  • Должен иметь код страны США (первая цифра).

  • Должен иметь случайный код города (первый набор из трех цифр).

  • Должны быть555 первые три цифры номера телефона , а затем 4 случайные цифры.

Вот аннотированный пример:

1-814-555-3857
|  |   |   |
|  |   |   |
|  |   |   +---------->   random four digits
|  |   |
|  |   +-------------->   the set 555
|  |
|  +------------------>   area code
|
+--------------------->   country code

Номера социального страхования

Каждый номер SSN должен содержать 9 случайных цифр в следующем формате.

342-98-1613

пример

Crime predicted: 234-72-8311
Calling: 1-633-555-0188

Crime predicted: 135-77-0910
Calling: 1-202-555-4719

Crime predicted: 722-90-6653
Calling: 1-466-555-1069

...

Продолжаем еще 27 циклов.


Табло

Чтобы ваш счет отображался на доске, он должен быть в следующем формате:

# Language, Bytes

Зачеркивание не должно вызывать проблем.


3
Кроме того, каковы допустимые значения для кодов стран / кодов стран США?
mınxomaτ

2
Я снял ограничение по времени. Что касается вашего второго вопроса, код страны США явно a 1. Что касается кодов городов, то для этой задачи подойдут любые три цифры. @minxomat
Зак Гейтс

1
@ LuisMendo существует консенсус в отношении мета о том, что означает случайный, если он не полностью определен
FryAmTheEggman

5
Конечно, генерация чисел в формате, который они на самом деле передали с помощью «Машины» в шоу, была бы еще более сложной ...;)
Мейсон Уилер

Ответы:


10

CJam, 68 66 64 байта

Спасибо Деннису за сохранение 2 байта!

"Crime predicted: --
Calling: 1--555-

"30*{_5<{iAa*:mr}&}/

Копирование не будет работать, так как есть несколько непечатаемых (по одному вместо каждой случайной группы), так что вот xxdдамп:

00000000: 2243 7269 6d65 2070 7265 6469 6374 6564  "Crime predicted
00000010: 3a20 032d 022d 040a 4361 6c6c 696e 673a  : .-.-..Calling:
00000020: 2031 2d03 2d35 3535 2d04 0a0a 2233 302a   1-.-555-..."30*
00000030: 7b5f 353c 7b69 4161 2a3a 6d72 7d26 7d2f  {_5<{iAa*:mr}&}/

Чтобы изменить это, вставьте его в файл и запустите xxd -r in_file > out_file. Вы также можете попробовать это онлайн .

объяснение

"..."30*     Push the string 30 times
{ ... }/     For each character in the string:
_5<{ ... }&    If the ASCII code is < 5:
iAa*             Push an array of as many 10s as the ASCII code
:mr              For each 10, choose a random 0-9 number

Я бы никогда не подумал об этом сам, но в Pyth он кажется на два байта короче .
FryAmTheEggman

@FryAmTheEggman Я, наверное, должен выучить Pyth, часто он короче, чем CJam. Вы можете опубликовать этот ответ, если хотите :)
Андреа Биондо,

8

Python 2, 129

from random import*
print''.join([c,`randint(0,9)`][c>'w']for c in'Crime predicted: xxx-xx-xxxx\nCalling: 1-xxx-555-xxxx\n\n'*30)

Наивный метод. Принимает сообщение

Crime predicted: xxx-xx-xxxx
Calling: 1-xxx-555-xxxx

и копирует это 30 раз. Затем заменяет каждый xслучайной цифрой randint(0,9), оставляя все остальные символы такими же.


6

Python 2, 151 байт

Спасибо Господу (и @Dennis) за %0nd: D

from random import randrange as r
for i in[1]*30:print"Crime predicted: %03d-%02d-%04d\nCalling: 1-%03d-555-%04d\n"%(r(1e3),r(100),r(1e4),r(1e3),r(1e4))

6

Perl, 85 байт, спасибо Деннису и GRC!

$_="Crime Predicted: NNN-NN-NNNN 
Calling: 1-NNN-555-NNNN 

"x30;s/N/0|rand 10/eg;print

Оригинальный Perl, 91 92 байта

print"Crime Predicted: NNN-NN-NNNN
Calling: 1-NNN-555-NNNN

"=~s/N/int rand 10/egr for 1..30

1
@Dennis, я собирался опубликовать это, пока не увидел этот ответ. У меня был $_="..."x30;s/_/0|rand 10/eg;printкоторый спасает /rфлаг.
grc

Спасибо @Dennis и @grc! Принято ли включать изменения, предложенные в комментариях (с указанием авторства, конечно)? Если нет, я верну свою правку. Но, в любом случае, спасибо! Я полностью забыл об 0|rand ...уловке и об операторе повторения, которым я сейчас пользуюсь, чтобы неоднократно ударить меня по голове за то, что пропустил это!
type_outcast

2
Да, это принято. Если вы еще этого не сделали, вам стоит ознакомиться с советами по игре в гольф на Perl? , Это отличный ресурс.
Деннис

5

CJam, 73 71 70 байт

30{"Crime predicted: x-x-x
Calling: 1-x-555-x
"'x/[ZY4Z4]Aaf*::mr.+N}*

Попробуйте онлайн в интерпретаторе CJam .

Как это работает

30{     e# Repeat 30 times:

e# Push the following string:

"Crime predicted: x-x-x
Calling: 1-x-555-x
"

'x/     e# Split at x's.
[ZY4Z4] e# Push the array [3 2 4 3 4].
Aaf*    e# For each integer in that array, repeat [10] that many times.
        e# This pushes [[10 10 10][10 10][10 10 10 10][10 10 10][10 10 10 10]].
::mr    e# For each 10, select a random integer between 0 and 9 (inclusive).
.+      e# Vectorized concatenation.
        e# This places the digits at the spots of the x's.
N       e# Push a linefeed.
}*      e#

5

ß 121 118 112 байт

°/N=1°(30°/M°=ß$-ß$$'Crime predicted: 000-00-0000\nCalling: 1-000-555-0000\n\n'),'',3)µ€(M='0')?ß!G0,9,1):M)°)°)

В основном заменяет 0 случайным числом каждый и вызывает себя 30 раз.

Проверьте это с помощью онлайн-терминала :

sharps:~$ "<ctrl+v the code here>"                       
Crime predicted: 214-59-4707                              
Calling: 1-850-555-8529                                   

Crime predicted: 722-97-6832                              
Calling: 1-864-555-6965                                   

<and so on...>

Редактировать (112B): Использование $$(что-то вроде sprintf) и троичного оператора.


Не могли бы вы предоставить ссылку на спецификации этого языка?
LegionMammal978

@ LegionMammal978 Требуется некоторое время, чтобы написать. Проще говоря: имеет все функции, которые есть у AutoIt.
Mynxomaτ


4

Пиф, 62

Реализация фантастического ответа CJam Андреа .

sm?<Cd5jkmOTCdd*30"Crime Predicted: --
Calling: 1--555-

"

Обратите внимание, что в источнике есть несколько непечатаемых символов, и не должно быть запаздывания ". Это было добавлено для SE, так что это кажется немного более читабельным. Я пока не смог получить hexdump, но ссылка ниже работает, и вы сможете скопировать и вставить его.

Попробуйте это онлайн здесь


3

CJam, 74 байта

30{[ZY4Z4]{Aa*:mrs}%"Crime predicted: %s-%s-%s
Calling: 1-%s-555-%s

"e%}*

Не победитель, но он, по крайней мере, несколько близок к тому, что есть у Денниса, и использует другой подход. Так что я подумал, что это все равно стоит опубликовать.

При этом используется e%оператор CJam , который генерирует выходные данные со строкой формата стиля printf.

30      Repeat count for whole output.
{       Start loop.
  [ZY4Z4] Build list of random number lengths: [3 2 4 3 4].
  {       Start loop over all random number lengths.
    Aa*     Build list of [10 ... ] with the random number length.
            E.g. for length 3, this will be [10 10 10].
    :mr     Apply the random number operator to the list. This will generate
            a list of random numbers between 0 and 9, with the given length.
    s       Convert it to a string.
  }%      End of loop over random number lengths.
  "..."   Format string, with a %s for each random number.
  e%      Apply printf style formatting.
}*      End of main repeat loop.

Вау, я думал, что вы были @DavidCarraher с этим аватаром!
Бета-распад

@BetaDecay это? codegolf.stackexchange.com/users/3967/david-carraher . Даже не одно и то же животное! :) Цвета почти одинаковые, хотя.
Рето Коради

Если мы объединяем наши подходы, мы можем получить до 70 байт: постоянная ссылка
Деннис

@ Денис Не стесняйтесь пойти на это. Вы помогали мне много раз.
Рето Коради

@RetoKoradi Достаточно близко;)
Бета-распад


3

JavaScript (ES6), 142

Примечание стороны mixmat ответ на ß показывает так лучший способ для решения этой задачи, и может легко реализовать в JS дает лучший результат. Хотел бы я подумать об этом.

Редактировать Добавил пропущенный текст (я неправильно прочитал вызов)

Протестируйте приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6

/* TEST redirect console.log */ console.log=x=>O.innerHTML+=x+'\n'

for(i=30;i--;)console.log(`Crime predicted: ${(R=d=>(1e-9+Math.random()+'').substr(2,d))(3)}-${R(2)}-${R(4)}
Calling: 1-${R(3)}-555-${R(4)}
`)
<pre id=O></pre>


Очень хорошее решение! Однако последняя часть номера телефона иногда имеет менее 4 цифр; То же самое со второй и третьей частями SSN.
ETHproductions

@ETHproductions крысы! Возвращаясь к предыдущей версии!
edc65

3

Фурье, 166 142 байта

45~d030(~i67a114a-9a+4a-8a32a112a^^a101ava+5a-6a116a101ava58a32a999roda99roda9999ro10a67a97a108aa-3a+5a-7a58a32a1oda999roda5oooda9999ro10aai^)

Это один из самых высоких байтов, но я большой поклонник Фурье и хотел попробовать свои силы в решении. Не очень оптимизировано.

Разбивая это:

45~d

Устанавливает переменную d в 45, код ASCII для дефиса. Этот символ напечатан так много, что он экономит несколько байтов, чтобы объявить его здесь.

030(...)

Устанавливает аккумулятор в ноль и циклически повторяется в скобках, пока не достигнет 30.

67a114a-9a+4a-8a32a112a^^a101ava+5a-6a116a101ava58a32a

Распечатать "Преступление предсказано:".

999roda99roda9999ro10a

Вывести абсолютно произвольный SSN + перевод строки.

67a97a108aa-3a+5a-7a58a32a

Распечатать «Звонок:».

1oda999roda5oooda9999ro

Напечатайте номер телефона, который следует указаниям: 1-xxx-555-xxxx

10aa

Напечатайте две строки, чтобы начать сначала.


1
Эй, вам может быть интересно, что теперь есть онлайн-переводчик на fourier.tryitonline.net (а также labs.turbo.run/beta/fourier )
Beta Decay

2

Pyth, 67 байт

V30s.ic"Crime predicted: |-|-|
Calling: 1-|-555-|
"\|mjkmOTdj32434T

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

                                Implicit: T=10, k=''
       "..."                    The output string
      c     \|                  Split on '|' placeholders
                     j32434T    32434 to base ten -> [3,2,4,3,4]
              m                 Map for d in the above:
                 mOTd             Generate d random numbers from 0-9
               jk                 Concatenate into string (join on empty string)
    .i                          Interleave segments of output string with random strings
   s                            Concatenate and output
V30                             Perform the above 30 times

2

Haskell, 150 байт

import System.Random
p '#'=putChar=<<randomRIO('0','9')
p x=putChar x
main=mapM p$[1..30]>>"Crime predicted: ###-##-####\nCalling: 1-###-555-####\n\n"

2

JavaScript (ES6), 130 123 байта

Пройдя шаг вперед по решению ß от minxomat, я заменил 0s на количество 0s, которое было бы там. Код использует эти числа, чтобы извлечь правильное количество цифр Math.random(), сохраняя при этом хороший бит байтов.

for(i=30;i--;)console.log(`Crime predicted: 3-2-4
Calling: 1-3-555-4
`.replace(/[2-4]/g,x=>`${Math.random()}`.substr(2,x)))

Попробуйте это:

// redirecting console.log() for this demonstration
console.log=x=>O.innerHTML+=x+'\n';
O.innerHTML='';

for(i=30;i--;)console.log(`Crime predicted: 3-2-4
Calling: 1-3-555-4
`.replace(/[2-4]/g,x=>`${Math.random()}`.substr(2,x)))
<pre id=O>

Как всегда, предложения приветствуются!


2

Java, 246 байт

import java.util.*;class C{static{Random r=new Random();for(int i=0;i++<30;)System.out.printf("Crime predicted: %s-%s-%s\nCalling: 1-%s-555-%s\n\n",r.nextInt(900)+100,r.nextInt(90)+10,r.nextInt(900)+100,r.nextInt(900)+100,r.nextInt(9000)+1000);}}

С переносами строк:

import java.util.*;
class C{
    static{
       Random r = new Random();
       for(int i = 0; i++<30;)
           System.out.printf("Crime predicted: %s-%s-%s\nCalling: 1-%s-555-%s\n\n",r.nextInt(900)+100,r.nextInt(90)+10,r.nextInt(900)+100,r.nextInt(900)+100,r.nextInt(9000)+1000);
    }
}

Это начало. Вместо создания случайных цифр я использовал случайные 3-значные или 4-значные числа.


2

R 151 146 или 144 байта

Код

for(l in 1:30)cat(sep="","Crime predicted: ",(i=floor(runif(16,,10)))[1:3],"-",i[4:5],"-",i[6:9],"\nCalling: 1-",i[10:12],"-555-",i[13:16],"\n\n")

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

Ungolfed

for(l in 1:30) {
  i=floor(runif(16,,10))
  cat(sep="","Crime predicted: ",
      i[1:3],"-",i[4:5],"-",i[6:9],
      "\nCalling: 1-",i[10:12],"-555-",
      i[13:16],"\n\n")
  }

Я думаю, что есть много возможностей для улучшения, но я не очень хорошо балуюсь строками в R.

Edit 1: изменил runif(16,max=10)к runif(16,,10).

Я сделал еще один код ( 147 144 байта), sprintfно я не думаю, что это R-подобный код.

for(l in 1:30)cat(do.call(sprintf,as.list(c('Crime predicted: %s%s%s-%s%s-%s%s%s%s\nCalling: 1-%s%s%s-555-%s%s%s%s\n\n',floor(runif(16,,10))))))

Другой подход (149 байт):

for(p in 1:30)cat(sep="",replace(s<-strsplit("Crime predicted: '''-''-''''\nCalling: 1-'''-555-''''\n\n","")[[1]],which(s<"-"),floor(runif(16,,10))))

2

PHP , 144 143 байта

<?=preg_replace_callback('/x/',function($x){return chr(rand(48,57));},str_repeat("Crime predicted: xxx-xx-xxxx
Calling: 1-xxx-555-xxxx

",30));


2

C #, 280 263 246 байт

Golfed:

using System;class C{static string G(){var r=new Random();var s="";n h=x=>r.Next(x).ToString("D"+x);for(int i=0;i++<30;){s+="Crime predicted: "+h(3)+"-"+h(2)+"-"+h(4)+"\nCalling: 1-"+h(3)+"-555-"+h(4)+"\n\n";}return s;}delegate string n(int x);}

Отступ:

using System;
class C
{
    static string G()
    {
        Random r = new Random();
        string s = "";
        Func<int, string> f = x => r.Next((int)Math.Pow(10, x)).ToString("D" + x);            

        for (int i = 0; i++ < 30;)
        {
            s += "Crime predicted: " + f(3) + "-" + f(2) + "-" + f(4) + "\nCalling: 1-" + f(3) + "-555-" + f(4) + "\n\n";
        }
        return s;
    }
}

Новое на Codegolf, советы приветствуются!


Добро пожаловать в Программирование Пазлов и Code Golf! Я не хорошо знакомы с C #, но так как он основывается на .NET , как PowerShell, я думаю , что h(999)будет генерировать число от 000до 998включительно, так что значит это не совсем ударил дух спецификации. Я столкнулся с той же проблемой .
AdmBorkBork

Вы правы, я сейчас исправлю!
Антонимтмерс

После исправления до 280 байт, а затем подумал о форматировании в обработчике делегата, уменьшив его до 263 байт.
антонимитмеры

1

Калий , 230 байт

func main(){foreach(x in range(1,31){println("Crime predicted: "+r(3)+"-"+r(2)+"-"+r(4));println("Calling: 1-"+r(3)+"-555-"+r(4)+"\n");}}
func r(l){z=new Random();a="";foreach(y in range(1,l))a+=z.next(0,10).toString();return a;}

Expanded:

func main () {
        foreach (x in range(1, 31) {
                println("Crime predicted: " + r(3) + "-" + r(2) + "-" + r(4));
                println("Calling: 1-" + r(3) + "-555-" + r(4) + "\n");
        }
}
func r (l) {
        z = new Random();
        a = "";
        foreach (y in range(1, l))
                a += z.next(0, 10).toString();
        return a;
}

1

Рубин, 98 знаков

30.times{puts"Crime Predicted: DEF-GH-IJKL
Calling: 1-MNO-555-QRST

".tr"D-OQ-T",rand.to_s[2..-1]}

Образец прогона:

bash-4.3$ ruby -e '30.times{puts"Crime Predicted: DEF-GH-IJKL\nCalling: 1-MNO-555-QRST\n\n".tr"D-OQ-T",rand.to_s[2..-1]}' | head
Crime Predicted: 867-29-2637
Calling: 1-278-555-5424

Crime Predicted: 913-31-6306
Calling: 1-744-555-8188

Crime Predicted: 868-36-4612
Calling: 1-926-555-3576

Crime Predicted: 988-06-1643

1

JavaScript, 146 141

console.log(Array(30).join("Crime predicted: 3-2-3\nCalling: 1-3-555-4\n\n").replace(/[2-4]/g,function(m){return(m+Math.random()).substr(3,m)}))

уже есть ответ на том же языке с меньшим количеством символов, чем у вас.
Jakuje

@Jakuje другой ответ использует ES6, который еще не широко доступен
Peleg

Тогда, наверное, все в порядке. Упоминание об этом в вашем ответе было бы хорошо.
Jakuje

1
@Jakuje Люди могут отправлять все, что они хотят! Это не только вызов, но и победа над другими.
ErikE

1

до ES6 Javascript, 128

for(i=30;i--;)console.log('Crime predicted: x-x-x\nCalling: x-555-x\n'.replace(/x/g, function(){return 1e3*Math.random()|0}))

Я чувствую, что черточки можно как-то удалить, но не уверен.


1
Несколько ошибок: 1) случайные части имеют неправильную длину (и даже не пытаются) 2) пропущено «1-».
edc65


1

Юлия, 120 байт

R(n)=lpad(rand(0:10^n-1),n,0)
for i=1:30 println("Crime Predicted: "R(3)"-"R(2)"-"R(4)"\nCalling: 1-"R(3)"-555-"R(4))end

Ungolfed:

# Define a function for returning a random number with a
# specified number of digits
function R(n::Int)
    lpad(rand(0:10^n-1), n, 0)
end

# Print 30 times
for i = 1:30
    println("Crime Predicted: " R(3) "-" R(2) "-" R(4)
            "\nCalling: 1-" R(3) "-555-" R(4))
end

1

Рубин, 90 88 байт

30.times{puts"Crime predicted: NNN-NN-NNNN
Calling: 1-NNN-555-NNNN

".gsub(?N){rand 10}}

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


1
Нет необходимости в строковой записи, достаточно только символа ?N. Нет необходимости в скобках, вокруг randпараметра.
manatwork

1

PowerShell, 120 108 103 102 байт

0..29|%{("Crime predicted: XXX-XX-XXXX`nCalling: 1-XXX-555-XXX"-split"X"|%{$_+(Random 10)})-join'';""}

Укоротил еще несколько байтов, установив разделенный цикл вместо кодового блока, который выводит в массив @(..) и снова объединяется.

Исключил @, вспомнив, что(...) обозначает блок кода, выполняемый до-join'' или иным образом.

Это избавляет от необходимости присваивать $aпеременную. Также заметил, что из-за того, как -splitработает эта функциональность, предыдущий код выделял слишком много цифр для номера телефона, поэтому получил бесплатное сохранение байта, уменьшившись до 1-XXX-555-XXX. Это компенсировало ошибочное, Random 9которое на самом деле выбирает случайным образом из0-8 , поэтому вместо этого нам нужно указатьRandom 10.

Оооочень близко к двузначным числам, но я не уверен, где можно сыграть в гольф еще с четырьмя байта по 3 ...


Предыдущая, 108

0..29|%{$a="";"Crime predicted: XXX-XX-XXXX`nCalling: 1-XXX-555-XXXX"-split"x"|%{$a+="$_$(Random 9)"};$a;""}

Сократил код на пару байтов, вместо этого разделив строку на Xs, затем повторив цикл в результирующем массиве строк и конкатенируя каждую запись с Randomцифрой, чтобы построить нашу окончательную выходную строку $a. Обратите внимание, что мы не могли сделать что-то подобное, "string".replace("x",$(Random 9))потому что тогда Randomзвонили бы только один раз, так что у вас был бы 1-222-555-2222, например, номер телефона.


Предыдущий, 120

0..29|%{"Crime predicted: "+(Random 1e9).ToString("000-00-0000");"Calling: "+(Random 1e7).ToString("1-000-555-0000");""}

Довольно привлекательный для многословного языка, благодаря обширным выходным спецификациям (т. 000-00-0001Е. Рассматривается как действительный SSN) и действительно надежному .ToString()алгоритму форматирования, который использует PowerShell. PowerShell также выводит \r\nпосле каждого вывода строки, поэтому требование перехода на новую строку между итерациями является простым"" .

Обратите внимание, что это использует подразумеваемый Get-перед Random, так что это может быть очень медленным на некоторых платформах / реализациях.


0

Befunge-98, 170

Я думаю, что это все еще может быть немного проигнорировано. Но, по крайней мере, я победил C #. Проверено на befungius.aurlien.net .

a3*>  82*v>":detciderp emirC">:#,_$...'-,..'-,....av
>1 -:!#;_v^;v,,,"-555-"...,,,,,,,,,,,"Calling: 1-",<
\  ^v< <2?1v,
+    ^;^3<;<,
^ <0?3vv....<
^;^6<;<>a,v
   v_@#:-1<

0

Python 2, 151 150 байт

from random import*
p="Crime predicted: xxx-xx-xxxx\nCalling: 1-xxx-555-xxxx\n\n"*30
while'x'in p:p=p.replace('x',str(randint(0,9)),1)
print p.strip()

Как только я смог получить этот метод.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.